Symfony:在两个组件操作之间共享部分

时间:2010-02-25 12:36:45

标签: symfony1

我有一个组件,现在已经愉快地构建和渲染菜单了一段时间。现在我必须提供一个共享所有相同逻辑的特殊情况,但需要在已存在的前面进行一些工作。我想要做的是创建一个新的组件动作,它将进行必要的预处理,向共享逻辑发挥作用以完成计算方面,然后通过现有模板部分渲染(当完成所有操作时,它仍然是一个类似的菜单任何其他 - 只需要做一些工作来构建它)。

不幸的是,我找不到任何办法。

以下是我现在的高级文件/代码细分:

# 
# 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 个答案:

答案 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)

我不建议使用不同的操作来呈现相同的实体。尝试将它们组合起来并调用具有不同参数的组件,如果它很重,则将所有逻辑移动到单独的类中。