CakePHP 2.x HABTM saveAll with Add view related model optgroups

时间:2014-07-24 22:49:02

标签: cakephp cakephp-2.0

我有一个使用optgroups的CakePHP添加照片视图,以便HABTM相关标签模型的数据在视图中以分组方式显示。在Photo控制器中,我按如下方式发送相关的Tag模型数据,以便按标签类别对optgroups进行分组:

//fields shown to create optgroups eg group tags by category
$this->set('tags', $this->Photo->Tag->find('list', array(
    'fields' => array('Tag.id', 'Tag.tagname', 'Tag.category'),
    'conditions' => array(
        'Tag.account_id' => $this->Session->read('Auth.User.account_id')))));
}

该视图显示按类别很好地分组的标签。所以那部分完美无缺。

但是,添加新照片并选择一个或多个要分配给它的标签后,它会正确保存照片,但不能保存指定的标签。

我相信CakePHP saveAll正在期待一个没有optgroup Category>的数据阵列。标记层次结构,因此在添加新照片并将标签分配给照片时不保存标签数据。

如何为其提供正确的数组以保存相关标签,我需要做什么?它会在Create()之后在控制器中,我将删除'分类分组?

CakePHP http://book.cakephp.org/2.0/en/core-libraries/helpers/form.html

的一些背景知识

"如果您想使用optgroups生成一个选择,只需以分层格式传递数据。这也适用于多个复选框和单选按钮,但不是optgroups包裹字段集中的元素:"

$options = array(
    'Group 1' => array(
    'Value 1' => 'Label 1',
    'Value 2' => 'Label 2'
   ),
  'Group 2' => array(
  'Value 3' => 'Label 3'
  )
);
echo $this->Form->select('field', $options);

输出:

<select name="data[User][field]" id="UserField">
    <optgroup label="Group 1">
        <option value="Value 1">Label 1</option>
        <option value="Value 2">Label 2</option>
     </optgroup>
     <optgroup label="Group 2">
         <option value="Value 3">Label 3</option>
    </optgroup>
</select>

1 个答案:

答案 0 :(得分:0)

好的,这个问题与数组结构无关。

事实证明我在添加照片视图中有'Photo.Tag'而不仅仅是'Tag'。这是旧的添加照片视图代码,但不起作用:

    <div class="photos form">

        <p><?php echo $this->element('admin_nav'); ?></p>

    <?php echo $this->Form->create('Photo'); ?>
        <fieldset>
            <legend><?php echo __('Add Photo'); ?></legend>
        <?php
            echo $this->Form->input('account_id', array('type'=>'hidden'));
            //echo $this->Form->input('filename', array('type'=>'hidden'));
            echo $this->Form->input('filename', array('type' => 'file', 'label' => 'Upload photo'));
            echo $this->Form->input('desc');
            echo $this->Form->input('Photo.Tag' , array('label'=>'Tags', 'multiple'=>'checkbox'));

        ?>
        </fieldset>
    <?php echo $this->Form->end(__('Submit')); ?>
    </div>

以下是新增的“添加照片视图”代码,现在可以使用所选标​​签保存新照片:

    <div class="photos form">

        <p><?php echo $this->element('admin_nav'); ?></p>

    <?php echo $this->Form->create('Photo'); ?>
        <fieldset>
            <legend><?php echo __('Add Photo'); ?></legend>
        <?php
            echo $this->Form->input('account_id', array('type'=>'hidden'));
            //echo $this->Form->input('filename', array('type'=>'hidden'));
            echo $this->Form->input('filename', array('type' => 'file', 'label' => 'Upload photo'));
            echo $this->Form->input('desc');
            echo $this->Form->input('Tag' , array('label'=>'Tags', 'multiple'=>'checkbox'));

        ?>
        </fieldset>
    <?php echo $this->Form->end(__('Submit')); ?>
    </div>

虽然关于保存数据的Cakephp文档提到了如何格式化数组,但这似乎是指除HABTM之外的所有其他关系。 HABTM关系可以保存在一个动作中,保存在父模型上,在本例中为Photo模型,例如:

   $this->Photo->save($this->request->data)

将保存正在添加的新照片以及任何选定的标签,它们将保存在连接表的照片标签中。

有点不寻常,是$ this-&gt; Photo-&gt; save($ this-&gt; request-&gt; data)似乎与$ this-&gt; Photo-&gt; saveAll($)相同这 - &GT;请求 - &GT;数据)