0

添加记录时,我让用户标记尽可能多的复选框并需要:

echo $this->Form->input('us_roles', array('label' => 'Roles:',  'type'=> 'select', 'multiple'=>'checkbox','options' => $arr_pr_role));

并将选定的索引存储到我的 bd 上的字符串字段中,没有问题。(它可以节省例如 1,2,3)

但是,在编辑该记录时,复选框不会被填充-选中-accodingly。(基于字符串文本,例如 1,2,3

如何让我的 checkboxex 反映在数据库中存储为字符串的值?

我的编辑视图与我的添加视图使用相同:

echo $this->Form->input('us_roles', array('label' => 'Roles:',  'type'=> 'select', 'multiple'=>'checkbox','options' => $arr_pr_role));

* *更多细节

添加新记录时,我将选择中的选择内爆到我的数据中:

$this->request->data['User']['us_roles'] = implode(",", $this->request->data['User']['us_roles']);

保存已编辑的记录时也是如此。

问题是在检索时,如何将字符串转换为我的 us_roles 输入?

echo $this->Form->input('us_roles', array('label' => 'Roles:',  'type'=> 'select', 'multiple'=>'checkbox','options' => $arr_pr_role));

你能帮我吗?

---更新,修复---

    public function edit($id = null) {
    $this->User->id = $id;
    if (!$this->User->exists()) {
        throw new NotFoundException(__('Invalid user'));
    }
    if ($this->request->is('post') || $this->request->is('put')) {
        $this->request->data['User']['us_roles'] = implode(",", $this->request->data['User']['us_roles']);
        if ($this->User->save($this->request->data)) {
...
 } else {
             $this->request->data = $this->User->read(null, $id);
        $this->request->data['User']['us_roles'] = explode(",", $this->request->data['User']['us_roles']);

 }  
4

1 回答 1

0

现在我明白了......你正在寻找 implode() 的反面。那将是explode()。

或者您可以使用字符串类(http://book.cakephp.org/2.0/en/core-utility-libraries/string.html#String::tokenize):

$array = String::tokenize($string, ',');

应该让您返回您的值数组。

但相信我,通常有更好的方法来做到这一点。你可以把它变成另一个数据库表+模型。您可以使用 ArrayDatasource,也可以像我在这种情况下那样使用一些位掩码解决方案(http://www.dereuromark.de/2012/02/26/bitmasked-using-bitmasks-in-cakephp/)。最后一种方法的优点是您仍然只使用一个字段(和非常小的空间),而您拥有额外表的全部功能:对 NOT、AND、OR、...

于 2013-01-08T22:25:45.603 回答