CakePHP - как редактировать на месте с помощью AJAX - PullRequest
1 голос
/ 21 февраля 2011

Я пытаюсь отобразить контактную информацию и разрешить редактирование на месте.Это не обновление поля.В основном, div, который я хочу использовать, имеет (например) адрес, я нажимаю на него, он выделяется, и затем появляется окно редактирования, я редактирую, нажимаю ОК, и вещь обновляется как успех.Тем не менее, данные не обновились, что я могу сказать, когда проверяю запись.

Вот фрагменты соответствующего кода:


CONTROLLER:

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 ]

2 голосов
/ 21 февраля 2011

Попробуйте установить идентификатор перед сохранением.Кроме того, вы передаете th 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 идентификатором.Вы должны получить доступ к этому идентификатору в функции в качестве параметра и передать его в модель.

  2. Вы повторяли «успех», но просто возвращали «Fail».Вероятно, поэтому действие выглядело так, как будто оно прошло.Поскольку autorender был ложным, и вы ничего не отражали в состоянии сбоя, вы, вероятно, получали код ответа 200, в котором ничего не было в теле.

  3. Почему вы получаете эхо от контроллера?Это нарушает дизайн MVC.Если вы заинтересованы в том, чтобы сделать это способом CakePHP, вы должны создать новое представление, которое отображает переменную, и установить для этой переменной значение «успешное или неудачное» в контроллере (более вероятно, передать эту переменную в виде строки JSON).

  4. Вы говорите заголовку браузера, что это JSON, но вы не возвращаете JSON.Я обновил мой пример, чтобы показать правильные данные в кодировке JSON.Если вы собираетесь делать что-то более сложное, вам следует использовать функцию PHP json_encode.

  5. Нет необходимости проверять наличие пустых значений на $this->data.Если он пуст, сохранение не удастся.

1 голос
/ 21 февраля 2011

Я заработал - проблема была в том, что я не получал данные в функцию контроллера, как я ожидалПоэтому я сделал print_r, чтобы выяснить, какие параметры возвращаются.Вот что я сделал, хотя мне было бы интересно узнать больше комментариев о том, как это сделать:

0 голосов
/ 21 февраля 2011

Я думаю, что ваш JSON не прав.Вы должны сделать вид, включить помощник по javascript и сделать что-то вроде

$javascript->object('success');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...