我正在使用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方法,但是我已经失去了如何构建表单来为其创建合适的数组,以及如何最好地保存它。我是否需要创建某种保存循环?
如果您需要查看我的模型,控制器或视图的部分内容,请告诉我,我很乐意分享您希望看到的内容。
非常感谢你的帮助。
答案 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);
?>
这会生成一个表单,仅显示已在数据库中填入值的技能。