Модульный сайт с Zend Framework, стек действий - PullRequest
3 голосов
/ 25 февраля 2009

Как создать модульный веб-сайт с Zend Framework. У меня есть страницы в БД, каждая страница представлена ​​в виде URL. Каждая страница имеет 1 к содержанию. Каждый контент имеет контроллер, действие и позицию (+ другие, теперь не важные столбцы). Итак, один запрос - это одна страница и несколько контентов (несколько действий). Как я могу построить все действия до выхода? Мне бы хотелось, чтобы макет был похож на пример ниже, где содержимое помещается в контейнеры (действия выполняются до распечатки макета).

<div id="left">
   <?= $this->layout()->left_container ?>
</div>
<div id="center">
   <?= $this->layout()->center_container ?>
</div>
<div id="right">
   <?= $this->layout()->right_container ?>
</div>

До сих пор я вызывал действия из макета, но мне не нравится этот подход:

foreach ($contents as $item) {
    echo $this->action($item['action'], $item['controller'], null, array('content' => $item));
}

Спасибо.

приписка

Код adepretis похож на мой, представления моих действий выполняются внутри макета, что означает, что при возникновении ошибки он печатается в макете, где вызывается действие. Нет ли причины, по которой действия строятся до вывода макета? Еще одна плохая вещь заключается в том, что при каждом действии я должен запускать ...-> setResponseSegment, я хотел бы, чтобы это было автоматизировано.

p.s. # 2

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

Ответы [ 3 ]

1 голос
/ 02 марта 2009

Я нашел свой ответ на другом форуме. Вот ответ:

MyPlugin

class MyPlugin extends Zend_Controller_Plugin_Abstract
{

    public function routeStartup(Zend_Controller_Request_Abstract $request)
    {
        $action_stack = new Zend_Controller_Action_Helper_ActionStack();
        // here I will read actions from db and run it in loop, but for example few are staticly added bellow
        $action_stack->actionToStack('index', 'content', 'default', array('position' => 'left'));
        $action_stack->actionToStack('index', 'content', 'default', array('position' => 'center'));
        $action_stack->actionToStack('index', 'edo', 'default', array('position' => 'center'));
        $action_stack->actionToStack('left', 'edo', 'default', array('position' => 'left'));
        $action_stack->actionToStack('right', 'edo', 'default', array('position' => 'right'));
    }

}

BaseController , который расширяет каждый контроллер

class BaseController extends Zend_Controller_Action
{

    public function preDispatch()
    {
        $position = $this->_request->getParam('position', false);
        if ($position) {
            $this->_helper->viewRenderer->setResponseSegment($position);
        }
    }

}

Компоновка .phtml

<div>
    <h2><u>LEFT:</u></h2>
    <?=$this->layout()->left?>
</div>
<div>
    <h2><u>CENTER:</u></h2>
    <?=$this->layout()->center?>
</div>
<div>
    <h2><u>RIGHT:</u></h2>
    <?=$this->layout()->right?>
</div>

Это то, что я хотел, если у кого-то есть лучшее решение, пожалуйста, ответьте на вопрос, и я приму его ответ.

1 голос
/ 25 февраля 2009

Вы можете использовать Помощник ActionStack . Например:

class MyController_Action extends Zend_Controller_Action {
    function init() {
        /** you might not want to add to the stack if it's a XmlHttpRequest */
        if(!$this->getRequest()->isXmlHttpRequest()) {
            $this->_helper->actionStack('left', 'somecontroller', 'somemodule');
            $this->_helper->actionStack('center', 'somecontroller', 'somemodule');
            $this->_helper->actionStack('right', 'somecontroller', 'somemodule');
        }
}

class MyController extends MyController_Action {
    function indexAction() {
        // do something
    }
}

class SomecontrollerController extends MyController_Action {
    function leftAction() {
        // do something

        $this->_helper->viewRenderer->setResponseSegment('left_container');
    }

    function centerAction() {
        // do something

        $this->_helper->viewRenderer->setResponseSegment('center_container');
    }

    function rightAction() {
        // do something

        $this->_helper->viewRenderer->setResponseSegment('right_container');
    }
}

Запрос на / somemodule / my / index приводит к выполнению / somemodule / somecontroller / left . / somemodule / somecontroller / right , / somemodule / somecontroller / center , которые заканчиваются соответствующими сегментами макета.

0 голосов
/ 24 ноября 2010

привет, я тоже столкнулся с той же проблемой. Решение, которое вы предлагаете, работает нормально. Но мой baseController находится в модульной базе. Код работает гладко с baseController, но при расширении с помощью контроллеров в другом модуле возникает ошибка, поскольку базовый контроллер не может идентифицировать другой контроллер Например: модули / база / контроллер / baseController модули / пользователь / контроллер / пользовательский контроллер

Есть ли решения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...