Пирожное: Как использовать элемент представления внутри контроллера


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

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

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

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

Author: tereško, 2013-04-18

6 answers

Легко:

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

Также:

БОЛЬШЕ ТАК НЕ ДЕЛАЙ!!!

 22
Author: Wesley Schleumer de Góes, 2013-04-18 13:39:00

Иногда вам нужно отобразить элемент 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');
}
 7
Author: Serge S., 2015-05-26 15:58:51

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

<?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.

(Опять же: Спасибо Сержу С. за приведенный выше код)

 4
Author: mga226, 2015-07-01 16:29:12

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

 2
Author: ADmad, 2013-04-18 20:15:41

Вам следует использовать шаблон на стороне клиента. Вы должны никогда не возвращать наценку из веб-службы или 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>');
            }
        }
    });
};

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

 1
Author: Martin Bean, 2013-04-19 15:43:41

Способ, которым я выполнял любую обработку ajax в Cake, заключался в том, чтобы иметь свой собственный AjaxController. Любое взаимодействие типа ajax происходит там, что, в свою очередь, использует их собственные представления (и частичные представления/элементы). Таким образом, вы можете сохранить свой код СУХИМ, изолировать и распространять там все варианты использования 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

 0
Author: Coreus, 2016-06-22 14:35:41