在我的蛋糕应用程序中,我有一个名为faqs的模型,名为faqs_controller&的控制器。视图称为faqsindex.php。
我正在制作CMS,以便用户可以更改常见问题解答。 db表'faqs'有5列id,类别,问题,答案和数字。 “数字”是常见问题解答的显示顺序。
列出所有常见问题解答的循环或多或少看起来像这样:
<?php
foreach ($faqs as $faq):
<tr>
<td><?php echo $faq['Faq']['category']; ?></td>
<td><?php echo $faq['Faq']['number']; ?></td>
<td><?php echo $faq['Faq']['question']; ?></td>
<td><?php echo $faq['Faq']['answer']; ?></td>
</tr>
<?php endforeach; ?>
我想这样做,以便用户可以从此屏幕更改“数字”单元格,而不是进入每行的单独编辑屏幕并更改其中的数字。
你知道,就像netflix的队列工作方式一样,用户可以从列表中重新排序,你不必点击要查看的电影来改变队列中的顺序。
编辑我在faqs_controller.php中设置了如下编辑:
function edit() {
if(!empty($this->data)) {
$this->Faq->saveAll($this->data['Faq']);
}
else {
$this->data['Faq'] = Set::combine($this->Faq->find('all'), '{n}.Faq.id', '{n}.Faq');
}
}
并在索引视图中我制作了一个类似于此的foreach:
echo $form->create('Faq', array('action'=>'edit'));
foreach($this->viewVars['faqs'] as $key => $value) {
echo 'id:'.$value['Faq']['id'];
echo '<br/>question:'.$value['Faq']['question'];
echo $form->input('Faq.'.$key.'.number');
}
在这种情况下,foreach绕8次,因为有8行。如果我提交它们,我会创建8个新行&amp;无法更新现有行。
- 编辑 -
我在这里更改了表单echo:
echo $ form-&gt; input('Faq。'。$ key。'。question',array('value'=&gt; $ value ['Faq'] ['question']));
预填表格。我无法弄清楚的是如何更新正确的行。如果我提交表单,我会得到8个mysql查询:
当我不想要插入但更新时,请插入faqs
(question
)值(我刚刚添加的新问题?')。
答案 0 :(得分:4)
将每个常见问题ID放在表单中?
echo $form->create('Faq', array('action'=>'edit'));
foreach($this->viewVars['faqs'] as $key => $value) {
echo 'id:'.$value['Faq']['id'];
echo '<br/>question:'.$value['Faq']['question'];
echo $form->hidden('Faq.'.$key.'.id', array('value' => $value['Faq']['id']));
echo $form->input('Faq.'.$key.'.number');
}
答案 1 :(得分:3)
如果您正在使用jquery:http://jqueryui.com/demos/sortable/所有排序都在客户端完成,您将订单值放入隐藏输入并使用javascript根据用户交互更改它们。服务器端脚本没有任何改变。
编辑:
echo $form->create('Faq', array('action'=>'edit')); foreach($this->data['Faq'] as $key => $value) { echo 'id:'.$value['Faq']['id']; echo '<br/>question:'.$value['Faq']['question']; echo $form->input('Faq.'.$key.'.number'); echo $form->input('Faq.'.$key.'.id'); } echo $form->end('Save');
和控制器:
function edit() { if(!empty($this->data)) { $this->Faq->saveAll($this->data['Faq']); } $this->data['Faq'] = Set::combine($this->Faq->find('all'), '{n}.Faq.id', '{n}.Faq'); }
除非您在保存后将其重定向到其他位置。
答案 2 :(得分:1)
如果您想要使用Cake更新特定行,就像在saveAll()
查询中设置相应的行ID一样简单。
function edit() {
if (!empty($this->data)) {
$this->Faq->saveAll($this->data['Faq'], array('conditions' => array('Faq.id' => $yourId)));
}
...
}
这告诉Cake的ORM将信息保存到Faq.id
等于$yourId
的行中。如果$yourId
与表格中的现有ID匹配,则应更新该行。
修改强>
您可以将id
字段放入hidden form element using CakePHP's FormHelper。
$this->Form->hidden('id', array('value' => $value['Faq']['id']));