我有一个组件,现在已经愉快地构建和渲染菜单了一段时间。现在我必须提供一个共享所有相同逻辑的特殊情况,但需要在已存在的前面进行一些工作。我想要做的是创建一个新的组件动作,它将进行必要的预处理,向共享逻辑发挥作用以完成计算方面,然后通过现有模板部分渲染(当完成所有操作时,它仍然是一个类似的菜单任何其他 - 只需要做一些工作来构建它)。
不幸的是,我找不到任何办法。
以下是我现在的高级文件/代码细分:
#
# 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' ) ?>
非常感谢任何意见。
答案 0 :(得分:3)
一个简单的非优化方法是创建_SpecialMenu.php部分,只需在其中放置一个include:
<?php include_partial('navigation/menu', array('menu' => 'Entity Type', 'other_var' => $other_var) ?>
您需要将每个变量传递给$ other_var中的部分变量。这至少解决了这个问题吗?
答案 1 :(得分:2)
更优雅的解决方案是在“second”组件的execute函数中使用get_partial,如下所示:
public function executeSpecialMenu() {
//forces SpecialMenu to render _menu.php
echo get_partial('menu', $this->varHolder->getAll());
return sfView::NONE;
}
对varHolder-&gt; getAll的调用会获取所有要传递给“normal”部分的变量,因为get_partial需要这样做。
或者,作为一种新方法:
public function executeSpecialMenu() {
return $this->renderAlternatePartial('menu');
}
protected function renderAlternatePartial($partial) {
echo get_partial($partial, $this->varHolder->getAll());
return sfView::NONE;
}
答案 2 :(得分:1)
在action类中还存在一个renderPartial('xxx')方法,在XmlHttpRequest s中需要生成没有模板的部件时非常有用:
if ($request->isXmlHttpRequest())
{
return $this->renderPartial('module/action', array('param' => 'value'));
}
我还没有测试过这是否适用于组件执行方法。如果这不起作用,最好将这样的功能添加到symfony sfComponent类。
答案 3 :(得分:0)
在动作/模板模式中,存在$ this-&gt; setTemplate('xxx')方法(在动作类中),它可以对不同的动作使用相同的模板。 (例如,用于新动作或编辑动作的相同模板)。在组件类中是否存在这样的方法。
答案 4 :(得分:0)
我不建议使用不同的操作来呈现相同的实体。尝试将它们组合起来并调用具有不同参数的组件,如果它很重,则将所有逻辑移动到单独的类中。