表单输入并在hasMany直通模型中保存多个记录

时间:2015-01-29 03:34:10

标签: cakephp

我正在使用cakephp 2.6

我已经设置了3个表格如下(简化):

带有id,fname,lname,phone ...的'人员'表 带有id,技能名称的“技能”表 一个'people_skills'表,其中包含id,person_id,skill_id,得分

我在技能表中列出了18项技能,例如法律,IT,筹款等,每位技能的用户可以得分为1,2或3分。

我相信模型设置正确,因为我可以执行$ this-> PeopleSkill-> find('all')我的视图愉快地显示一个表格,其中包含正确的人名行,一项技能名称,以及他们对该技能的分数。

我正在尝试创建一个显示一个人并列出所有18种技能的表单,每个技能的单选按钮1,2或3,以快速填写1人的每项技能的分数。

提交将向数据库写入18行,每行将包含person_id(对所有人都相同),一个skill_id以及该技能的相应分数。

我是cakephp的新手,形式/ mysql魔术仍然有时会让我失望,这只会让我想恢复原始的php循环和mysql调用。但我认为学习蛋糕的方式会更好。

我当前失败的实验让我在技能列表中循环并尝试逐行构建表单,但我很确定我完全走错了方向,因为获得正确的表单应该进行保存行动更容易。

今晚我一直在看saveMany方法,但是我已经失去了如何构建表单来为其创建合适的数组,以及如何最好地保存它。我是否需要创建某种保存循环?

如果您需要查看我的模型,控制器或视图的部分内容,请告诉我,我很乐意分享您希望看到的内容。

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:0)

我假设添加了人员和技能

<?php
echo $this->Form->create('PeopleSkill');
$score_list = array(
'1' => '1',
'2' => '2',
'3' => '3'
);
foreach($skills as $key => $skill) {
    echo $this->Form->hidden('PeopleSkill.'.$key.'.person_id',array('value'=>$person['Person']['id']));
    echo $this->Form->hidden('PeopleSkill.'.$key.'.skill_id',array('value'=>$skill['Skill']['id']));
    echo $this->Form->input('PeopleSkill.'.$key.'.score',array('type'=>'radio','options'=>$score_list,'legend'=>$skill['Skill']['name']));
}

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

在您的控制器中

$this->PeopleSkill->saveMany($this->request->data['PeopleSkill']);

更新技能

在您的控制器中

public function customadd($directorid = null) {

if($this->request->is('post')) {
    if ($this->PeopleSkill->saveMany($this->request->data('PeopleSkill'))) {
        $this->redirect(array('action' => 'index'));
    }
}

$testdate = date('Y-m-d');
$this->set('testdate', $testdate);

$person = $this->Person->findById($directorid);
$people_skills = $this->PeopleSkill->find('all',array('conditions' => array('person_id' => $directorid)));
$this->set(compact('person'));
$this->set(compact('people_skills'));
}

在你看来

Current Person : <?php $person['Person']['name']; ?>
<?php
$scorelevel = array(
    '1' => '1',
    '2' => '2',
    '3' => '3'
    );

echo $this->Form->create('PeopleSkill');

foreach ($people_skills as $key => $skill) {
    echo $this->Form->hidden('PeopleSkill.'.$key.'.id',array('value'=>$skill['PeopleSkill']['id']));
    echo $this->Form->hidden('PeopleSkill.'.$key.'.person_id',array('value'=>$skill['PeopleSkill']['person_id']));
    echo $this->Form->hidden('PeopleSkill.'.$key.'.skill_id',array('value'=>$skill['PeopleSkill']['skill_id']));
    echo $this->Form->input('PeopleSkill.'.$key.'.score',array('type'=>'radio', 'options'=>$scorelevel,'legend'=>$skill['Skill']['skill'],'value'=>$skill['PeopleSkill']['score']));
}
echo $this->Form->end('Submit');
?>

答案 1 :(得分:0)

感谢。这让我更进一步。我需要改变最后一个隐藏的&#39;输入&#39;或者我只是一个空屏幕。

在第一个表单输入行上,我将$person['Person']['id']更改为$skill['Person']['id']以解决$ people未定义的错误。我认为这很有效,但也许我应该在控制器中设置$ people变量。

这可能与我的其他问题有关,那就是为1个人设置所有这些分数。如果我使用$skills = $this->PeopleSkill->find('all')在控制器中设置$技能,那么我的表单会显示多个重复技能。如果在控制器中使用$skills = $this->PeopleSkill->find('all',array('conditions' => array('person_id' => $directorid)))设置$技能,将人员ID作为$ directorid传递,那么我会得到一个表单,仅显示已经为该人输入的技能,没有选择,并提交它们会添加一整套重复的条目。

现在我没有能够编辑以前的数据,如果我可以指明一个特定的人ID并在表单中获得一套完整的技能并将它们全部提交为新的,那就太好了。

供您参考,这是我的控制器和视图文件。

控制器

public function customadd($directorid = null) {
    $testdate = date('Y-m-d');
    $this->set('testdate', $testdate);

    $skills = $this->PeopleSkill->find('all',array('conditions' => array('person_id' => $directorid)));
    $this->set('skills', $skills);
    $this->set('directorid', $directorid);

        if ($this->PeopleSkill->saveMany($this->request->data('PeopleSkill'))) {
                $this->redirect(array('action' => 'index'));
            }
        }

视图

<?php
$scorelevel = array(
    '1' => '1',
    '2' => '2',
    '3' => '3'
    );

echo $this->Form->create('PeopleSkill');

foreach ($skills as $key => $skill) {
    echo $this->Form->hidden('PeopleSkill.'.$key.'.person_id',array('value'=>$skill['Person']['id']));
    echo "[Debug] Current peson is: ".$skill['Person']['fname'];
    echo $this->Form->hidden('PeopleSkill.'.$key.'.skill_id',array('value'=>$skill['Skill']['id']));
    echo $this->Form->input('PeopleSkill.'.$key.'.score',array('type'=>'radio', 'options'=>$scorelevel,'legend'=>$skill['Skill']['skill']));
}
echo $this->Form->end('Submit');
// print_r($skills);
?>

这会生成一个表单,仅显示已在数据库中填入值的技能。