Вопрос организации Zend

Итак, у меня возник вопрос об общей организации кода фреймворка Zend в отношении макета.

Мой макет в основном таков:

(LAYOUT.PHTML)

<div id='header'>
<?= $this->Layout()->header ?>
</div>

<div id='main'>
<?= $this->Layout()->main ?>
</div>

<div id='footer'>
<?= $this->Layout()->footer ?>
</div>

и так далее и тому подобное. Теперь, чтобы мой код в моем заголовке был отделен от кода основного и кода нижнего колонтитула, я создал папку для своего представления, содержащую header.phtml, main.phtml, footer.phtml. Затем я использую этот код для назначения содержимого header.phtml в $ this-> layout () -> header:

(INDEX.PHTML)

$this->Layout()->header = file_get_contents('index/header.phtml');
$this->Layout()->main = file_get_contents('index/main.phtml');
$this->Layout()->footer = file_get_contents('index/footer.phtml');

Это отлично работало, но я достиг точки, когда я больше не хочу, чтобы main был статическим HTML. Я хотел бы иметь возможность вставлять некоторые значения с помощью PHP. Итак, в моем контроллере в indexAction я хочу иметь возможность загружаться из моей базы данных и помещать значения в index / main.phtml. Есть ли способ сделать это без реструктуризации моего сайта?

Если нет, есть способ сделать это, чтобы я мог:

  1. Возможность помещать код в разные разделы моего макета, такие как Layout () -> header, Layout-> footer.

  2. Разделяйте эти части по разным файлам, чтобы их было легко найти и упорядочить, например, мой index / footer.phtml, index / main.phtml и т. Д.

  3. Не нужно помещать этот код в кавычки без необходимости, чтобы превратить его в строку для передачи в Layout () -> header и т. Д.

Спасибо вам, ребята, за вашу помощь.

-Итан


person Ethan    schedule 17.06.2009    source источник
comment
Привет, Итан, я изменил теги на твой вопрос в надежде, что ты получишь лучший ответ. Удачи!   -  person karim79    schedule 17.06.2009


Ответы (5)


Вот идея:

  • Assign layout()->header the filename instead of the contents.
  • Put your code in this file
  • In your layout file, include() or require() the layout->header().

Поскольку ваши верхние и нижние колонтитулы макета теперь проанализированы, вы можете использовать их так же, как представление.

person Byron Whitlock    schedule 17.06.2009
comment
Вы, сэр, самый золотой из богов - person Ethan; 17.06.2009
comment
Разве не так CodeIgniter обрабатывает макет? - person Songo; 21.03.2012

->header в $this->layout()->header - это сегмент ответа. Вы можете отображать части ответа, используя $this->_helper->viewRenderer->setResponseSegment('header'); в действии.

person Tomáš Fejfar    schedule 18.06.2009

Если вы используете

$this->layout()->header = $this->render('index/header.phtml');

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

Я бы предложил использовать что-то вроде

<?php echo ($header = $this->layout()->header)? 
      $header : $this->render('headerDefault.phtml'); ?>

в вашем файле макета - он будет отображать заголовок по умолчанию из папки макета, если сценарий просмотра не переопределит его.

person gnarf    schedule 12.08.2009

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

$this->Layout()->header = $this->header();
$this->Layout()->main = $this->main();
$this->Layout()->footer = $this->footer();

Преимущество использования помощников представления по сравнению с операторами include и require заключается в том, что вся обработка файлов и разрешение имен выполняется платформой. В руководстве есть дополнительная информация о том, как настроить пути. и примеры использования и т. д.

person Tim Wardle    schedule 17.06.2009

помощники хороши. Другой вариант аналогичен приведенному выше, помещая имена файлов в верхний / нижний колонтитул - помещайте имена шаблонов и используйте $this->render($this->layout()->header)) и т.д. и т.д.

person Justin    schedule 17.06.2009