CakePHP 2.4 中同一模型的多个编辑表单

Posted

技术标签:

【中文标题】CakePHP 2.4 中同一模型的多个编辑表单【英文标题】:Multiple edit forms for the same model in CakePHP 2.4 【发布时间】:2013-11-25 20:42:08 【问题描述】:

我有一个场景,其中我有两个模型,个人资料和教育,具有 Profile hasMany Education 关系。

然后我有一个我想要多个表单的视图:

用户个人资料的每个教育条目都有一个编辑表单。 一个用于添加新条目的表单。

这里的问题是我希望编辑表单中填写每个条目的数据。 关于如何实现此功能的任何想法?

Cakephp 文档指出:

FormHelper 使用 $this->request->data 属性自动检测是否创建添加或编辑表单。如果 $this->request->data 包含一个以表单模型命名的数组元素,并且该数组包含模型主键的非空值,那么 FormHelper 将为该记录创建一个编辑表单

我已经成功实现了一个编辑表单,但在我只有一个表单的情况下。

现在我有这样的东西:

EducationController.php

public class EducationController extends AppController

/* (...) */

public function edit_index()

$user_id = $this->Auth->user('id');

$profile = $this->Profile->find('first', array('conditions' => array('Profile.user_id' => $user_id)));

$this->set('profile', $profile);

$this->request->data = $profile;



/* (...) */


至于视图文件...

 <?php
    foreach ($profile['Education'] as $key => $value) 
        ?>
        <div class="history-sub-menu" id="history-1">
            <p> <?php echo $value['education'] . ' - ' . $value['school'] ?> </p>
            <?php echo $this->html->image("arrow_bot.png") ?>    
        </div>
        <?php
        /*
         * Prints the form for editing... the id of the education entry being edited goes
         * as a parameter
         */
        echo $this->element('education_edit_form', array('hidden' => true, 'id' => $value['id']));
        ?>
        <?php
    
    ?>

    <div class="add-sub-menu">
        <p><?php echo $add_another_position ?></p>
<?php echo $this->Html->image("plus_blue.png") ?>
    </div>

    <?php
    /*
     * Prints the form for adding... as no parameter is given as the id
     * the form assumes it is a form for adding.
     */

    echo $this->element('education_edit_form', array('hidden' => true));
    ?>

“education_edit_form”元素:

    <?php

/* Prints a form for creating or editing an user academic entry.
 * 
 * In case of edit form a variable id must be set with the identifier of 
 * the academic entry being creted.
 * 
 * Other Paramaters:
 *  hiddden - Set to true if the form should be hidden by default
 *  
 */


if (isset($hidden)) 
    ($hidden) ? $hidden = 'display:none' : $hidden = '';
 else 
    $hidden = '';


if (isset($id))
   $id_string = ".$id."; 
else
    $id_string = ".";




/* String Constants */

$input_eduschool_default_text = __("School");
$input_edudegree_default_text = __("Degree");
$input_edufield_default_text = __("Field/s of Education");
$input_edugrade_default_text = __("Grade (What qualification/s did you obtain?");
$input_edudescription_default_text = __("Description");
$input_edustartdate_default_text = __("Start Date");
$input_eduenddate_default_text = __("End Date");

$submit_button_text = __("Save");
?>



<?php echo $this->Form->create('Education', array('controller' => 'Education', 'action' => 'add', 'class' => 'main', 'style' => '$hidden')); ?>  


<?php

echo $this->Form->input('Education'.$id_string.'school', array(
    'class' => 'white large',
    'placeholder' => $input_eduschool_default_text,
    'id' => 'edu-school',
    'label' => false,
    'div' => false,
    'type' => 'text'
));
?>
<?php

echo $this->Form->input('Education'.$id_string.'education', array(
    'class' => 'white large',
    'placeholder' => $input_edudegree_default_text,
    'id' => 'edu-education',
    'label' => false,
    'div' => false,
    'type' => 'text'
));
echo $this->Form->input('Education'.$id_string.'study_field', array(
    'class' => 'white large',
    'placeholder' => $input_edufield_default_text,
    'id' => 'edu-field',
    'label' => false,
    'div' => false,
    'type' => 'text'
));
echo $this->Form->input('Education'.$id_string.'qualification', array(
    'class' => 'white large',
    'placeholder' => $input_edugrade_default_text,
    'id' => 'edu-grade',
    'label' => false,
    'div' => false,
    'type' => 'text'
));
echo $this->Form->input('Education'.$id_string.'start_date', array(
    'class' => 'white one-third',
    'placeholder' => $input_edustartdate_default_text,
    'id' => 'edu-start-date',
    'label' => false,
    'div' => false,
    'type' => 'text'
));
echo $this->Form->input('Education'.$id_string.'end_date', array(
    'class' => 'white one-third',
    'placeholder' => $input_eduenddate_default_text,
    'id' => 'edu-end-date',
    'label' => false,
    'div' => false,
    'type' => 'text'
));

echo $this->Form->input('Education'.$id_string.'description', array(
    'class' => 'white large',
    'placeholder' => $input_edudescription_default_text,
    'id' => 'edu-notes',
    'label' => false,
    'div' => false,
    'type' => 'textarea',
    'rows' => '5'
));
?>


<?php

echo $this->Form->submit($submit_button_text, array(
    'class' => 'intro_submit',
    'type' => 'submit'
));

echo $this->Form->end();
?>

请注意,这是一个草稿...我仍然需要执行操作来处理表单数据并在“education_edit_form”元素中进行一些额外的验证。但现在我只想知道如何用正在编辑的条目中的值填写编辑表单。

提前谢谢你

【问题讨论】:

【参考方案1】:

我不确定我是否正确,但我认为你没有关注 Cake field naming conventions。

如果您想单独保存每个教育记录(即作为单独的表单处理),您应该简单地使用例如Education.school 作为字段名。

如果您想同时保存所有教育记录(即将它们作为一个大表格处理),您应该使用 Education.0.schoolEducation.1.school 名称,其中 01 只是个人的索引/计数器记录(即不是主键值)。

每个教育记录的id应添加到表格中,如下所示:

echo $this->Form->hidden('Education.id'); // separate form per each record

echo $this->Form->hidden('Education.' . $i . '.id'); // one form for all records

【讨论】:

以上是关于CakePHP 2.4 中同一模型的多个编辑表单的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP:从单个模型中检索多个记录以以一种形式进行编辑

CakePHP 2.4:不需要的预填充表单数据

cakephp : 使用 $validate 数组验证登录表单

CakePHP 中的嵌套表单

如何在 CakePHP 控制器中使用多个模型

CakePHP 2.1 - 保存(和创建)多个连接模型和关联模型