сохранение отображаемого элемента в переменной в CakePHP

#php #cakephp

#php #cakephp

Вопрос:

У меня возникли некоторые проблемы при попытке «захватить» отображаемый HTML-код elmenet в cake php.

Допустим, у меня есть элемент с именем «message.ctp»

Я хотел бы сделать что-то вроде следующего:

Создание запроса $.getJSON к действию в контроллере, скажем, jsonAction(). В рамках этого действия я выполню некоторые обновления базы данных и верну строку json. Я хотел бы сохранить html-код, являющийся частью объекта json. Выполнимо?

 function jsonAction() {
    //Do DB update
    if(db update was ok) {
        $response = array("completed" => true, "html" => $this->render("message"));
    } else {
       $response = array("completed" => false);
    }
    echo json_encode($response);
}
  

Похоже, что прямо сейчас происходит то, что метод render отображает отображаемое значение вместо того, чтобы возвращать его.

В любом случае, я могу этого добиться?

Спасибо

С уважением, Габриэль

Комментарии:

1. Проверьте значение переменной autoRender

Ответ №1:

Забудьте об элементах на некоторое время.

Прежде всего, вы должны отделить все, что включает в себя выводимые данные из контроллера (либо это HTML, либо JSON, либо что-то еще).

Для каждого действия контроллера у вас должно быть соответствующее представление. Итак, для действия контроллера jsonAction у вас должно быть представление names json_action.ctp (в соответствующей папке, например, если jsonAction находится в MessagesController , создайте папку с именем /view/messages/json_action.ctp ).

Установите свою переменную из контроллера, отобразите ее в режиме просмотра, и все готово. Не забудьте $this->layout = 'empty' из контроллера, чтобы отображать только то, что у вас есть в представлении.

Как правило, вам следует переделать руководства по CakePHP и перечитать книгу, чтобы лучше понять шаблон MVC (Model-View-Controller) и структуру CakePHP.

Ответ №2:

Вы имеете в виду это?

 $myRenderedHtml = $this->element('message');
                         ^^^^^^^
  

Комментарии:

1. Можно ли вызвать этот метод в рамках действия контроллера?

2. Нет, элементы не должны отображаться с контроллера. Можете ли вы пояснить, что вы пытаетесь сделать?

3. @deceze Я обновил вопрос, чтобы лучше объяснить, чего я хотел бы достичь.

4. @ElGabbu Почему бы вам не выполнить работу с view (создание выходных данных JSON HTML) в view? Вы не должны этого делать в контроллере, будь то AJAX-запрос или нет.

5. хммм, я мог бы … из контроллера создать массив с завершенным ключом … используйте $this->set(«ответ», $response); …. Затем в представлении проверьте, имеет ли значение $response[«завершено»] значение true, и если да, добавьте отображаемый html элемента … затем echo json_encode($response); … должно сработать, как вы думаете? Я попробую это позже. Спасибо!