2010-02-25 5 views
2

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

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

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

# 
# 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') ?> 

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

ответ

3

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

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

Где каждый из ваших переменных должны быть переданы парциальное как в $ other_var. Это, по крайней мере, решает проблему?

+1

Это решение проблемы на функциональном уровне, и это было решение, которое я поставил на место изначально. Для меня это действительно здорово, поэтому я надеялся, что это будет более хирургическое решение. Я выбрал прямой 'include()', хотя, чтобы переменные несли, хотя и мне не пришлось бы менять 2 файла каждый раз, когда переменная добавлялась/удалялась. –

+0

Да, 'sfComponents' не обеспечивает простой способ сделать это, так что вы застряли с вашим' include() ', который является самым простым и надежным способом для этого. –

0

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

1

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

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

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

2

Более элегантное решение заключается в использовании 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; 
} 
0

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

Смежные вопросы