用蛋糕中的一个表单编辑多行

时间:2011-07-22 23:27:27

标签: cakephp

在我的蛋糕应用程序中,我有一个名为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查询:

当我不想要插入但更新时,请插入faqsquestion)值(我刚刚添加的新问题?')。

3 个答案:

答案 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']));