微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从CakePHP列表数组返回值以在表单中使用?

我一直在使用CakePHP来开发应用程序,我有一些基本权限,旨在限制用户的能力并帮助防止错误.

我有一个表格,有某个或更高权限的人可以创建一个新的员工.表格中的一个字段允许他们将学校与员工联系起来.如果他们具有所需的最小访问权限,我希望选择自动填充作为创建者与他们关联的学校,然后如果他们是管理员,他们可以选择从选择中进行选择.

在控制器中,我正在调用这一行来填充学校的数组:

$this->set('schools', $this->Staff->School->find('list', array('conditions' => array('School.active' => !null), 'order' => array('name' => 'ASC'))));

数组看起来像这样:

array(4) {
  [2]=> string(15) "School A"
  [3]=> string(15) "School B"
  [1]=> string(17) "School C"
  [6]=> string(21) "School D"
}

AuthComponent以下列方式存储学校ID:AuthComponent :: user(‘school_id’),为此,该值设置为1.

添加视图中,显示选择的条件如下所示:

if (AuthComponent::user('admin') == 1) {
    echo $this->Form->input('school_id', array('label' => 'School *',    'options' => array($schools), 'required' => 'required'));
} else {
    echo $this->Form->input('school_id', array('label' => 'School *', 'value' => $schools[AuthComponent::user('school_id')], 'disabled' => 'disabled'));
}

由于某种原因,禁用的视图显示列表中的第一个学校.我使用了var_dump($schools [AuthComponent :: user(‘school_id’)];它返回String(8)=>“School C”,所以我很困惑为什么选择不能正确显示.

有没有人有任何建议或替代解决方案来实现相同的结果?

解决方法:

问题中的代码有一些奇怪之处:

条件

'conditions' => array('School.active' => !null)

!null就是真的,这与使用相同:

'conditions' => array('School.active' => true)

如果要检查not-null,则使用的条件是:

'conditions' => array('School.active NOT' => null)

要么

'conditions' => array('NOT' => ('School.active' => null))

选项

'options' => array($schools)

$schools已经是一个数组 – 这是创建一个嵌套数组,它将被解释为一个名为“0”的optGroup的选择.即像这样:

<select name="data[User][school_id]" id="UserSchoolId">
    <optgroup label="0">
        <option value="2">School A</option>
        <option value="3">School B</option>
        <option value="1">School C</option>
        <option value="6">School D</option>
    </optgroup>
</select>

它始终是一个选择

您没有明确说过,但无论用户是否是管理员,输入都是选择.这听起来像是在期待一个禁用的文本输入,总是查看html源代码来验证你正在查看的是什么.

发生这种情况是因为如果有一个名为schools的视图变量,CakePHP自动将名为schools_id的字段转换为select.这也是为什么总是选择第一所学校而不管授权用户的学校,问题中的代码是有效的:

echo $this->Form->input(
    'school_id',
    array(
        'label' => 'School *',
        'options' => $schools, // implicit
        'value' => $schools[AuthComponent::user('school_id')],
        'disabled' => 'disabled'
    )
);

结果是这样的标记

<select name="data[User][school_id]" value="School C" id="UserSchoolId">
    <option value="2">School A</option>
    <option value="3">School B</option>
    <option value="1">School C</option>
    <option value="6">School D</option>
</select>

没有具有该价值的学校 – 所以html会表现得不像那样并选择第一个.

你需要与此相当的代码

$options = ['label' => 'School *'];
if (!AuthComponent::user('admin')) {
    $options += [
        'value' => AuthComponent::user('school_id'),
        'disabled' => 'disabled'
    ];
}
echo $this->Form->input('school_id', $options);

显然,不要依赖于任何形式的安全性表单 – 禁用的输入不会阻止用户编辑html,启用它并更改值.使用the security component(防止形式篡改),在保存/更改记录或两者之前,强制确保school_id(以及任何其他相关字段)与控制器操作中的auth’ed用户数据相匹配.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐