Как запустить действие файла контроллера из файла .ctp?

Я хочу вызвать действие вместе с его .ctp-файлом файла контроллера из другого .ctp-файла. например

В users_controller.php есть действие под названием list_category(), и я хочу вызвать его из файла /app/views/pages/index.ctp. Не просто вызовите list_category, но также хотите показать его вывод в формате html (я имею в виду, что list_category.ctp также должен отображаться).

Спасибо.


person gautamlakum    schedule 06.11.2010    source источник


Ответы (5)


Создайте элемент, например list_category.ctp.

В элементе используйте requestAction для получения данных:

<?php
    $categories = $this->requestAction('/users/list_categories');
?>

<?php foreach($categories as $category): ?>

    <?php // Your display code goes here ?>

<?php endforeach; ?>

В вашем контроллере убедитесь, что вы return используете нужные данные.

<?php
    function list_categories() {

        return $this->User->Category->find('all');

    }
?>

Вы можете повторно использовать код для представления list_category.ctp.

При использовании requestAction возникают накладные расходы, но часто меньше, чем люди верят.

person Chris Hawes    schedule 08.11.2010
comment
Но что, если я хочу использовать это действие в качестве виджета. Я имею в виду, что я хочу вызвать это действие, также хочу, чтобы его отображаемый ctp html был в другом файле layout/vtp. - person gautamlakum; 09.11.2010
comment
Вы вызываете элемент там, где хотите, чтобы он отображался. В любом представлении, если вы наберете ‹?php echo $this-›element('list_category'); ?› он будет отображать элемент, requestAction в элементе получит данные от контроллера. - person Chris Hawes; 11.11.2010

Можно ли это сделать с помощью маршрутизации? Я не уверен в синтаксисе, но я думаю, вы можете указать этот метод, который запускает контроллер, когда вы попадаете на эту страницу.

person Collin White    schedule 06.11.2010

Это кажется неправильным, чего вы пытаетесь достичь? Как насчет элементов?

person pawelmysior    schedule 06.11.2010

Как насчет вызова контроллера из вашего основного контроллера, а затем передачи его результатов в ваш макет. Наконец, используйте элемент для вывода вывода, а также используйте элемент для вывода вывода на этом другом контроллере. Таким образом, у вас не будет повторяющихся макетов. Всего один элемент, используемый двумя контроллерами.

Это очень похоже на то, как Rails создает макеты, когда вы их «запекаете». Он создает эквивалент элемента для использования в макетах добавления и редактирования.

person Dan Berlyoung    schedule 07.11.2010

Это можно сделать с помощью requestAction, но имейте в виду, что это дорого, и вы должны быть осторожны. с этим.

person Nik Chankov    schedule 07.11.2010