Symfony: разделение частичного между двумя компонентами действий - PullRequest
2 голосов
/ 25 февраля 2010

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

К сожалению, я не могу найти способ сделать это.

Вот разбивка файла / кода высокого уровня, которая у меня есть сейчас:

# 
# navigation/actions/components.class.php
# 
public function executeMenu() {
  /** 
   * This method runs most of the menus and does most of the work 
   * that's required of the special case.
   * 
   * Once complete, of course, it renders through navigation/templates/_menu.php
   */
}

public function executeSpecialMenu() {
  /** 
   * Do some preparatory work and delegate to executeMenu()
   * to finish up and render the menu. I'd like this action 
   * to render through the _menu.php partial as well.
   */
}

# 
# templates/layout.php
# 
<?php include_component( 'navigation', 'menu', array( 'menu' => 'Entity Type' ) ) ?>

/** SNIP */

<?php include_component( 'navigation', 'SpecialMenu' ) ?>

Любой вклад будет высоко ценится.

Ответы [ 5 ]

3 голосов
/ 25 февраля 2010

Простой, но неоптимальный способ - создать партиал _SpecialMenu.php и просто поместить в него включение:

<?php include_partial('navigation/menu', array('menu' => 'Entity Type', 'other_var' => $other_var) ?>

Где каждая из ваших переменных должна быть передана в частичное, как в $ other_var. Решает ли это хотя бы проблему?

2 голосов
/ 09 июля 2011

Более элегантным решением является использование get_partial внутри функции исполнения «второго» компонента, например:

public function executeSpecialMenu() {
    //forces SpecialMenu to render _menu.php
    echo get_partial('menu', $this->varHolder->getAll());

    return sfView::NONE;
}

Вызов varHolder-> getAll возвращает все переменные, которые должны были быть переданы в «нормальную» частичку, поскольку get_partial требует этого.

Или, как новый метод:

public function executeSpecialMenu() {
    return $this->renderAlternatePartial('menu');
}

protected function renderAlternatePartial($partial) {
    echo get_partial($partial, $this->varHolder->getAll());
    return sfView::NONE;
}
1 голос
/ 01 декабря 2010

Также в классе действия существует метод renderPartial ('xxx'), который полезен, когда необходимо создать деталь без шаблона в таких случаях, как XmlHttpRequest s:

if ($request->isXmlHttpRequest())
{
  return $this->renderPartial('module/action', array('param' => 'value'));
}

Я не проверял, работает ли это в методах выполнения компонента. Если это не работает, рекомендуется добавить такую ​​функциональность в класс symfony sfComponent.

0 голосов
/ 10 июля 2011

Я бы не рекомендовал использовать разные действия для визуализации одного и того же объекта. Попробуйте объединить их и вызвать компонент с разными параметрами, а если он тяжелый, переместите всю логику в отдельный класс.

0 голосов
/ 01 декабря 2010

В режиме действия / шаблона существует метод $ this-> setTemplate ('xxx') (в классе действия), который может использовать один и тот же шаблон для различных действий. (например, тот же шаблон для новых или редактирования действий). Был бы такой метод в классах компонентов.

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