【问题标题】:CakePHP 2.x HABTM saveAll with Add view associated model optgroupsCakePHP 2.x HABTM saveAll 与添加视图关联模型 optgroups
【发布时间】:2014-07-24 22:49:02
【问题描述】:

我有一个使用 optgroups 的 CakePHP 添加照片视图,以便与 HABTM 相关的标签模型的数据在视图中以分组方式显示。在照片控制器中,我按如下方式发送相关的标签模型数据,以按标签类别获取标签的 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 类别 > 标签层次结构的情况下交付,因此在添加新照片并将标签分配给照片时不会保存标签数据。

我需要做些什么来给它正确的数组来保存相关的标签?它会在我“删除”类别分组的 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>

【问题讨论】:

    标签: cakephp cakephp-2.0


    【解决方案1】:

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

    原来我在“添加照片”视图中有“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 关系可以在一个操作中保存在父模型上,在这种情况下是照片模型,例如:

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

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

    有点不寻常的是 $this->Photo->save($this->request->data) 似乎与 $this->Photo->saveAll($this->request->数据)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-28
      相关资源
      最近更新 更多