【问题标题】:Edit multiple rows with one form in cake在蛋糕中使用一种形式编辑多行
【发布时间】:2011-07-27 17:05:41
【问题描述】:

在我的蛋糕应用程序中,我有一个名为 faqs 的模型、名为 faqs_controller 的控制器和名为 faqsindex.php 的视图。

我正在制作一个 CMS,以便用户可以更改常见问题解答。 db 表 'faqs' 有 5 列 id、category、question、answer 和 number。 “编号”是常见问题的出现顺序。

列出所有常见问题解答的循环大致如下:

<?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 个新行并且无法更新现有行。

-编辑-

我在这里更改了表单回显:

echo $form->input('Faq.'.$key.'.question',array('value'=>$value['Faq']['question']));

预填充表单。我不知道如何更新正确的行。如果我提交表单,我会得到 8 个这样的 mysql 查询:

当我不想插入而是更新时,插入faqs (question) 值(“我刚刚添加的新问题?”)。

【问题讨论】:

  • 创建一个表单,在您的控制器中检索与提交的表单字段关联的常见问题解答对象,更新其编号属性,并再次保存常见问题解答对象。还有其他方法吗?
  • 我不太清楚自己要做什么,我正在尝试弄清楚如何进行更新。

标签: cakephp


【解决方案1】:

将每个 faq 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');
}

【讨论】:

    【解决方案2】:

    如果您使用的是 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');
    }
    

    除非您在保存后将它们重定向到其他地方。

    【讨论】:

    • 我真的不需要它们像这样可排序,尽管它看起来真的很酷,我接下来可以这样做。我很高兴现在能够输入数字。我这样做了,但它只是插入新行而不是更新现有行。我会重写问题。
    • 我在循环中得到“为 foreach() 提供的参数无效”。如果我如上所述将其更改为“foreach($this->viewVars['faqs']”,我可以遍历数据,但我仍然卡住了。
    • 你是否使用了我写的相同的 edit() 函数? debug($this->data) 的输出是什么;当你把那条线放在视图上?
    • 空白,虚无。如果我 print_r $this 我可以看到“数据”是空的。我只是使用 viewVars,因为我可以看到它有我想要的数据。
    • hm..这很奇怪,如果你在控制器中设置$this->data,你可以在视图中看到它。
    【解决方案3】:

    如果您想使用 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']));
    

    【讨论】:

    • $yourId 是从哪里来的?对不起,如果我在这里看起来很笨拙,我只是很难理解这个问题。我希望来自 foreach 的 8 个表单字段都有一个与“Faq.id”匹配的 id。我还希望表单预先填充其中已有的内容。
    • @pg 你必须提供它。假设由于您正在更新记录,您已经收集了适当的 id。如果您还没有,那么您应该能够将 id 字段添加到数据库查询中,用于使用您正在编辑的数据库记录填充表单输入。然后只需将该 ID 包含在隐藏的表单输入中。如果设置正确,相应的id 将转移到$this-&gt;data['Faq']['id']
    • 好吧,那是我的问题。如何将 $yourId 包含到隐藏的表单输入中?输入应该是 input('Faq.'.$value['Faq']['id']'.number')?
    • 感谢您的帮助,我能够通过结合所有三个答案来解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多