Контроллеры ZEND - Как вызвать действие с другого контроллера - PullRequest
3 голосов
/ 05 декабря 2009

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

 "Message: id is not specified"

 #0 .../library/Zend/Controller/Router/Rewrite.php(441): Zend_Controller_Router_Route->assemble(Array, true, true)

Мой код:

Первый контроллер:

abc_Controller
public function someAction()
{

    $this->_helper->actionStack('other','xyz');

}

Второй контроллер:

    xyz_Controller
 public function otherAction()
 {
 // code
 }

Желаемые результаты:

При вызове / abc / some я хочу отобразить «некоторый» контент вместе с контентом xyz / other. Я думаю, что правильно следовал документу (http://framework.zend.com/manual/en/zend.controller.actionhelpers.html), но не могу найти справки о том, почему возникает эта ошибка. Когда я отслеживаю код (используя XDebug), действие xyz / other завершается нормально, но когда abc / some действие заканчивается, ошибка выдается где-то во время отправки или маршрутизации.

Любая помощь очень ценится.

Ответы [ 8 ]

3 голосов
/ 06 декабря 2009

Желание сделать что-то подобное указывает на то, что вы делаете это совершенно неправильно. Если у вас есть желание повторно использовать контент, он, скорее всего, должен принадлежать модели. Если это действительно код контроллера, он должен быть инкапсулирован плагином контроллера действий

3 голосов
/ 05 декабря 2009

Вы можете сделать это в своем phtml для вашего someAction. Поэтому в some.phtml put <?php echo $this->action('other','xyz');?> будет отображаться форма, найденная в otherAction of XyzController

2 голосов
/ 15 сентября 2010

В phtml-файле вы можете использовать $ this-> action (); для отображения страницы, и этот ответ будет добавлен к текущему ответу ..

Синтаксис действия следующий:

public function action($action, $controller, $module = null, array $params = array())
1 голос
/ 05 декабря 2009

Вы можете создать новый объект со вторым контроллером и вызвать его метод (но это не лучший способ).

Вы можете расширить свой первый контроллер вторым и вызвать $this->methodFromSecond(); - он также отобразит вторую форму со своим шаблоном.

Кстати - какой тип кода вы хотите выполнить на обоих контроллерах?

0 голосов
/ 03 июня 2013

Для меня это сработало как шарм

    class abcController extends Zend_Controller_Action
    {
        public function dashBoardAction()
        {
            $this->_helper->actionStack('list-User-Data', 'xyz');
        }
    }

    class XyzController extends Zend_Controller_Action {
        public function listUserDataAction()
        {
            $data = array('red','green','blue','yellow');
            return $data;
        }
    }
0 голосов
/ 28 апреля 2012

Этот вид определения маршрута:

routes.abc.route = "abc/buy/:id/*" 
routes.abc.defaults.controller = "deal" 
routes.abc.defaults.action = "buy" 
routes.abc.reqs.id = "\d+"

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

$this->_helper->actionStack('Action',
                            'Controller',
                            'Route',
                            array('param' => 'value')
);


routes.abc.defaults.id = "1" 
0 голосов
/ 15 сентября 2010

Хм. Не могу найти и понять, почему вам нужно использовать разные контроллеры для одного просмотра. Лучшая практика - иметь все в одном контроллере. Я использую это как в этом примере

DemoController extends My_Controller_Action() {
 ....
 public function indexAction() {
   $this->view->oForm = new Form_Registration();
 }
}

My_Controller_Action extends Zend_Controller_Action() {
   public function init() {
      parent::init();
      $this->setGeneralStuf();
   }

   public function setGeneralStuf() {
       $this->view->oLoginForm = new Form_Login();
   }
}
0 голосов
/ 06 декабря 2009

Просто обновление. Ошибка не имела абсолютно никакого отношения к тому, как вызывалось действие со второго контроллера. Оказывается, в макете второго контроллера был отдельный вызов phtml, который выдавал ошибку (layout / abc.phtml):

<?php echo $this->render('userNavigation.phtml') ?>

строка ошибки:

echo $this->navigation()->menu()->renderMenu(...)

Я буду отлаживать это отдельно, чтобы не испачкать эту ветку.

Спасибо Akeem и hsz за быстрый ответ. Я узнал из ваших ответов.

Подводя итог, можно выделить 3 различных способа вызова действия с внешнего контроллера:

  1. Создание экземпляра второго контроллера из первого контроллера и вызов действия.
  2. Используйте $ this -> _ helper-> actionStack
  3. В phtml первого контроллера action ('other', 'xyz');?> (Как указал Аким выше)

Надеюсь, это поможет другим зендовым новичкам.

...