我有一个使用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>
答案 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;数据)