【问题标题】:Symfony: Sharing a partial between two component actionsSymfony:在两个组件动作之间共享一个部分
【发布时间】:2010-02-25 12:36:44
【问题描述】:

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

很遗憾,我找不到任何方法。

这是我现在拥有的高级文件/代码细分:

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

任何意见将不胜感激。

【问题讨论】:

    标签: symfony1


    【解决方案1】:

    一种简单但非最佳的方法是创建 _SpecialMenu.php 部分并在其中放置一个包含:

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

    每个变量都需要传递给局部变量,就像在 $other_var 中一样。这至少能解决问题吗?

    【讨论】:

    • 这在功能层面解决了问题,这是我最初提出的解决方案。对我来说,感觉真的很笨拙,所以我希望有一个更手术的解决方案。不过,我确实选择了直接的include(),以便变量可以携带,并且每次添加/删除变量时我都不必更改 2 个文件。
    • 是的,sfComponents 并没有提供一种简单的方法来做到这一点,所以你只能使用 include(),这是最简单、更面向未来的方法。
    【解决方案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;
    }
    

    【讨论】:

      【解决方案3】:

      action 类中还有一个 renderPartial('xxx') 方法,当需要在 XmlHttpRequest 等情况下生成没有模板的部分时很有用:

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

      我尚未测试这是否适用于组件执行方法。如果这不起作用,最好将这样的功能添加到 symfony sfComponent 类中。

      【讨论】:

        【解决方案4】:

        在动作/模板模式下,有一个 $this->setTemplate('xxx') 方法(在动作类中),它可以为不同的动作使用相同的模板。 (例如,用于新操作或编辑操作的相同模板)。请问组件类里有这样的方法吗?

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2018-08-23
            • 2011-10-01
            • 2013-09-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-07-30
            相关资源
            最近更新 更多