CakePHP: как использовать элемент вида внутри контроллера

Я пытаюсь понять, как использовать один из элементов моего представления внутри контроллера …

Я знаю, я знаю: «Не делай этого!» (В 99% случаев это правильный ответ)

Но я думаю, что у меня действительно есть веская причина. Действие обрабатывает запрос AJAX, который возвращает разметку. Возвращенная разметка – это список, который я показываю везде, используя элемент. Поэтому, пытаясь сохранить мой код DRY, я думаю, что это уместно сделать здесь.

Это возможно?

Легко:

$view = new View($this, false); $content = $view->element('my-element', $params); 

Также:

НЕ ДЕЛАЙТЕ, ЧТО ЛЮБОЙ !!!

Иногда вам нужно визуализировать элемент CakePhp из представления и вводить его содержимое на страницу с помощью AJAX одновременно. В этом случае рендеринг элемента как обычного представления от контроллера лучше, чем создание выделенного представления, которое просто содержит <?php echo $this->element('some_element') ?> И может быть выполнено следующим образом:

 <?php public function ajax_action() { // set data used in the element $this->set('data', array('a'=>123, 'b'=>456, 'd'=>678)); // disable layout template $this->layout = 'ajax'; // render! $this->render('/Elements/some_element'); } 

$this->view = '/Elements/myelement';

Я знаю, что это старый вопрос, и другие люди уже дали в основном тот же ответ, но я хочу указать, что этот подход (предоставленный Сержем С.) …

 <?php public function ajax_action() { // set data used in the element $this->set('data', array('a'=>123, 'b'=>456, 'd'=>678)); // disable layout template $this->layout = 'ajax'; // render! $this->render('/Elements/some_element'); } 

… не является хакерским обходным решением, но на самом деле является рекомендуемым подходом к документам CakePHP для этого общего и законного варианта использования:

Если $ view начинается с '/', предполагается, что это файл вида или элемента относительно папки / app / View. Это позволяет прямое отображение элементов, очень полезно в вызовах AJAX.

(Снова: кредит Сергею С. за код выше)

Вы должны использовать клиентский шаблон. Вы никогда не должны возвращать разметку из веб-службы или API, просто данные. Попросите JavaScript взять данные, а затем отформатируйте их как пожелаете.

Например:

 function getItems() { $.get('/some/url', function(response) { if (response.data.length > 0) { for (var i = 0; i < response.data.length; i++) { var item = response.data[i]; $('.results').append('<li>' + item.title + '</li>'); } } }); }; 

Это всего лишь пример, сложенный с манжеты. Очевидно, вам нужно написать свою собственную реализацию.

То, как я делал какую-либо обработку ajax в Cake, было иметь собственный AjaxController. Любое взаимодействие ajax-типа идет туда, которое в свою очередь использует свои собственные представления (и рассматривает частичные / элементы). Таким образом, вы можете сохранить свой код DRY и изолировать и распространять все прецеденты ajax.

Пример выдержки:

 <?php class AjaxController extends AppController { /** * (non-PHPdoc) * Everything going to this controller should be accessed by Ajax. End of story. * @see Controller::beforeFilter() */ public function beforeFilter() { parent::beforeFilter(); $this->autoRender = false; $this->layout = false; if (!$this->request->is('ajax')) { $this->redirect('/'); } } public function preview() { if ($this->request->is('ajax')) { $this->set('data', $this->data); $this->render('/Elements/ajaxpreview'); } } ?> 

Вот источник: https://github.com/Sobient/dosspirit/blob/master/app/Controller/AjaxController.php