CakePHP - 如何使用AJAX进行编辑

时间:2011-02-21 15:24:30

标签: ajax cakephp editor

我正在尝试显示联系信息并允许进行编辑。它没有更新该字段。基本上,我想使用的div有(例如)一个地址,我点击它,它突出显示然后出现一个编辑框,我编辑,点击确定,然后事情更新为成功。然而,数据没有更新,我可以在查看记录时告知。

以下是相关代码的片段:


控制器:

var $helpers = array ('Html','Form','Ajax','Javascript','Menu');
var $components = array( 'RequestHandler');
var $name = 'People';

...

function edit_in_place() {
 if (!empty($this->data)) {
  if ($this->Person->save($this->data)) {
    $thisId=$this->Person->id;
    $this->header("Content-Type: application/json");
    echo 'success';
    exit;
  } else {
    return 'Fail';
  }
 }
 $this->Autorender = FALSE;
 exit;
}

查看触发器EDIT_IN_PLACE:

<div id="addresswork">
 <?php echo $person['Person']['addresswork'] ?>
</div>

<?php
 echo $ajax->editor(
   "addresswork", array( 
      'controller'=>'People',
      'action'=>'edit_in_place',
       $person['Person']['id'] 
 ),
    array('highlightcolor'=>'#aaeeff')
 )
?>

我试过找到关于此的好文档并且失败了。有什么建议吗?

3 个答案:

答案 0 :(得分:2)

尝试在保存前设置ID。此外,您正在传递参数中的ID,因此您需要添加:

function edit_in_place($person_id) { // notice param
    $this->header("Content-Type: application/json");
    $this->Person->id = $person_id; // set the id.
    $json = $this->Person->save($this->data) ? '{"r":"Pass"}' : '{"r":"Fail"}';
    $this->set('json', $json);
    // make a new view edit_in_place.ctp file that prints the variable.
}

有五点需要注意:

  1. 您必须告诉CakePHP您要更新哪条记录。在您的视图中,您正在创建/controller/edit_in_place/1之类的操作,其中1为ID。您必须在函数中访问该id作为参数,并将其传递给模型。

  2. 你回应'成功',但只是回归'失败'。这可能就是为什么动作看起来像是通过了。由于autorender是假的,并且你没有在失败条件下回应任何东西,你可能得到一个200响应代码,身体里什么都没有。

  3. 你为什么要从控制器回应?这打破了MVC设计。如果您有兴趣以CakePHP的方式进行操作,则应创建一个回显变量的新视图,并将该变量设置为控制器中的成功或失败(更可能将该变量传递给JSON字符串)。

  4. 您告诉浏览器标头它是JSON,但您没有返回JSON。我已经更新了我的示例以显示正确的JSON编码数据。如果你要做更复杂的事情,你应该使用PHP json_encode函数。

  5. 无需在$this->data上检查是否为空。如果为空,则保存将失败。

答案 1 :(得分:1)

我得到了它的工作 - 问题是我没有像我预期的那样将数据输入控制器中的函数。所以我做了一个print_r来弄清楚params回来了。这就是我所做的,虽然我对正确的方法有任何更多的评论感兴趣:

function edit_in_place() {

    if ($this->RequestHandler->isAjax())
    {
        $this->Person->id = $this->params['named']['id'];
        $field= $this->params['form']['editorId'];
        $value= $this->params['form']['value'];

        $this->Person->saveField($field,$value);

        Configure::write('debug', 0);
        echo $value;
        exit;
    }

在触发此操作的视图中,我这样做了:

        <div id="addresswork">
        <?php echo $person['Person']['addresswork'] ?>
        </div>
        <?php
        echo $ajax->editor(
        "addresswork",
        array( 
            'controller'=>'People',
            'action'=>'edit_in_place',
            'id'=>$person['Person']['id']
            ),
        array(
            'submit'=>'OK',
            'style'=>'inherit',
            'submitdata' =>array('id'=>$person['Person']['id']),
            'tooltip'=>'Click this to edit',
            'highlightcolor'=>'#aaeeff')
        );
        ?>

答案 2 :(得分:0)

我认为你的json不对。您应该创建一个视图,包含javascript助手并执行类似

的操作
$javascript->object('success');