Zend Framework: визуализация нескольких видов в одном макете - PullRequest
8 голосов
/ 22 августа 2009

Я хочу создать динамический сайт, используя Zend_Layout.

Мой макет (/application/layouts/scripts/layout.phtml) содержит следующие строки:

...        
<body>

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

        <div id="content"><?php echo $this->layout()->content ?></div>

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

    </body>
...

Если я перехожу к своему действию индекса контроллера контроллера - Zend автоматически отображает представление индекса (application / views / scripts / index / index.phtml) внутри $ this-> layout () -> content.

Теперь я хочу визуализировать виды различных действий контроллера в макете. Поэтому я создаю новую аутентификацию контроллера с логином действия, который показывает форму логина.

Я изменил свой макет на:

  ...        
    <body>

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

            <div id="content"><?php echo $this->layout()->content ?></div>
            <div id="login"><?php echo $this->layout()->login ?></div>

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

        </body>
    ...

Когда я просматриваю индекс / индекс, я хочу определить в этом действии, что Zend должен отображать представление auth / login в $ this-> layout () -> login и, например, news / list внутри $ this-> layout () -> содержание

.

индекс / индекс - это не что иное, как макет страницы - и авторизация / логин и новости / список виджетов

Как это сделать?

Ответы [ 4 ]

8 голосов
/ 22 августа 2009

Первый совет - избегать помощника Action view любой ценой, в любом случае он, вероятно, будет удален в ZF 2.0. ( ZF-5840 ) ( Почему стог действий злой )

Это связано с вопросом, который я задал - и ответ bittarman довольно полезен. Лучший способ реализовать нечто подобное - иметь помощника вида, который может генерировать вашу область входа в систему. My_View_Helper_Login например. Тогда ваш макет может вызвать $this->login(), как и скрипт вида для user/login. Если index/index визуализирует содержимое из news/list, просто перенаправьте запрос другому контроллеру / действию от контроллера. $this->_forward('list', 'news');

3 голосов
/ 15 июля 2011

Я бы также советовал не использовать action view helper. Если у вас в контроллере нет логики, вам, вероятно, не нужно отправлять другой запрос другому контроллеру только для того, чтобы сделать представление частичным.

Я бы порекомендовал просто использовать частичное представление, как вы делали с header.phtml и footer.phtml:

<body>

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

        <div id="content"><?php echo $this->layout()->content ?></div>

        <div id="login"><?php echo $this->render('auth/login.phtml') ?></div>

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

</body>

И, возможно, ваш auth/login.phtml скрипт выглядит так:

<div id="login_box">
    <?php if (empty($this->user)): ?>
        Please log in
    <?php else: ?>
        Hello <?php echo $this->user->name ?>
    <?php endif; ?>
</div>

Пока вы устанавливаете переменные представления в какой-то момент в вашем контроллере, вы можете вызывать render view helper из представления (или даже контроллера, если хотите).

#index controller
public function indexAction()
{
    $this->view->user = Model_User::getUserFromSession();
}
1 голос
/ 22 августа 2009

Вы можете использовать не такой скоростной исполнитель

$this->action()

или попробуйте с

$this->partial()

(см. http://framework.zend.com/manual/en/zend.view.helpers.html#zend.view.helpers.initial.partial)

0 голосов
/ 28 февраля 2012

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

1) Я сделал плохой вызов ajax, вместо / module / help вместо / module / help * было 1003 *

2) Я вызвал действие, exampleAction (), мне пришлось поставить

$this->_helper->layout->disableLayout();

Для предотвращения повторного отображения макета.

3) Я сделал перенаправление, попробуйте использовать пересылку или маршрут.

...