Рендеринг частичного представления в Zend для добавления html в макет действия маршрутизации

Я отображаю страницу с большим количеством фреймов (панели содержимого XHR через dojo). Это делается с помощью запроса к IndexController, который устанавливает области «верхний, левый, правый, центр, нижний колонтитул», за исключением того, что центр не заполняется содержимым. Это, в свою очередь, устанавливается вызовом PaneController в menu.onclick. Предостережение; Служба индексации поисковых систем не получает содержимое центральной области. Я хочу обойти AJAX-загрузку центра, если пользователь входит через /index/index.

Соответствующие фрагменты из IndexController:

class IndexController extends Zend_Controller_Action {
    public function indexAction() {
        $this->indexModel = $this->view->indexModel = new Application_Model_Index();

        // Goal is to render "/pane/main/" action and capture the HTML
        $this->view->mainPane = (string) $this->renderPaneMain();
        return $this->render();
    }
    public function renderPaneMain() {
        // ActionStack ?
        // action() ?
        return $HTML;
    }
}

Соответствующие вещи в Pane

class PaneController extends Zend_Controller_Action {

    public function preDispatch() {
        // will only return a contentpane, dont render layout 
        if ($this->getRequest()->isXmlHttpRequest()) {
            $this->_helper->layout()->disableLayout();
            $this->view->doLayout = true;
        }
    }
    public function mainAction() {
            this.render("main.phtml");
    }
    public function init() {
        $this->panesModel = new Application_Model_Panes();
        $variant = $this->getRequest()->getParam('variant', '');
            // routing variables need to be set, how?
        if (empty($variant))
            $this->_redirect('/');
    }
}

По сути, мне нужно, чтобы PaneController не отображал глобальный макет, а вызывал его файл представления .phtml после того, как он был настроен с соответствующими записями модели и т.д.

Любые идеи относительно того, как я могу добиться этого в наиболее эффективной форме?


person mschr    schedule 06.08.2012    source источник


Ответы (1)


Очень хорошо, я прикреплю обходной путь, который я использую здесь

Формы и форк-логика перенесены в модель, которая сосуществует с PanesController. Для IndexController, который будет представлять панель по умолчанию как встроенный HTML без AJAX, происходит несколько дублирующихся инициализаций.

Итак, IndexModel расширяет PanesModel, не инициализируя его. В моем представлении index.phtml (для действия Index) у меня есть следующий код для отображения встроенного html из панели.

в контроллере индекса

$this->view->model = new IndexModel(); // extends PanesModel
$this->view->model->setDefaultProperties($variant, $pagination, ...);

в индексном представлении:

$this->partial("panes/main/main.phtml", array("model", $this->model);

и из панели:

<?php if($this->model->goThisDirection()): ?>
     Switch 1 HTML contents
<?php endif; ?>

Предостережение: мне также пришлось не отображать какую-либо форму макета на панели (панели содержимого dojox допускают теги <script> и <style>) — и это распространяется на любое другое действие моей панели.

person mschr    schedule 09.08.2012