Symfony1模板默认和后备或模块之间的模板共享

时间:2015-07-08 14:06:31

标签: templates view symfony1 symfony-1.4 admin-generator

我在Symfony1应用程序上工作。

对于部分应用程序,我们使用symfony admin生成器为特定模块构建默认操作和模板。

可以在子操作类中重写自动生成的操作方法,并且可以通过在模块的模板文件夹中创建具有相同名称的模板来覆盖模板。 使用本地模板而不是自动生成的模板,这些模板存储在缓存文件夹中(我假设这是正常的symfony行为)。

apps/
    my_app
        modules/
            post/
                actions/
                    actions.class.php
                lib/
                templates/
...
cache/
    my_app/
        environment/
            modules/
                autoPostcd /
                    actions/
                        actions.class.php
                    lib/
                    templates/
                        indexSuccess.php
                        _part_1.php
                        _part_2.php

我目前正在开发一个不使用admin生成器的单独应用程序。

但我有3个模块做了非常类似的事情,我想分享。

我有3个动作扩展同一个自定义动作类,以便它们都实现相同的方法并共享相同的方法。

我遇到的问题是共享模板。 主要模板和大部分部分可以按原样重复使用。

apps/
    other_app/
        lib/
            printingActions.class.php
        modules/
            ticket/
                actions/
                    actions.class.php
                lib/
                templates/
                    printSuccess.php //exactly the same for all 3
                    _part_1.php
                    _part_2.php      //exactly the same for all 3
                    _part_3.php
            receipt/
                actions/
                    actions.class.php
                lib/
                templates/
                    printSuccess.php //exactly the same for all 3
                    _part_1.php
                    _part_2.php      //exactly the same for all 3
                    _part_3.php
            voucher/
                actions/
                    actions.class.php
                lib/
                templates/
                    printSuccess.php //exactly the same for all 3
                    _part_1.php
                    _part_2.php      //exactly the same for all 3
                    _part_3.php

我想做的是提取常用的模块,以便每个模块和具有类似接口的任何未来模块,只需要具有模块特定信息的部分模块。

这将是我理想的设置:

apps/
    other_app/
        lib/
            printingActions.class.php
            printingCommonTemplates/
                printSuccess.php //exactly the same for all 3
                _part_2.php      //exactly the same for all 3
        modules/
            ticket/
                actions/
                    actions.class.php
                lib/
                templates/
                    _part_1.php
                    _part_3.php
            receipt/
                actions/
                    actions.class.php
                lib/
                templates/
                    _part_1.php
                    _part_3.php
            voucher/
                actions/
                    actions.class.php
                lib/
                templates/
                    _part_1.php
                    _part_3.php

我知道这样的事情可以做,因为管理生成器会这样做,但经过几个小时的挖掘,我无法找到它的确切位置。

有人能指出我正确的方向吗? 理想情况下,如果有一个后备模板设置,我可以为特定模块或过滤器类设置,我可以扩展以满足我的需要吗?

2 个答案:

答案 0 :(得分:2)

如果要使用具有默认布局的通用模块操作类,可以使用以下方法:

class printingActions extends sfActions {

  public function preExecute() {
    $this->setLayout('print_success_common');
  }

  public function executeIndex() {

  }
}

然后在您的模块操作中,您可能有:

class ticketActions extends printingActions
{
   public function executePrint(sfWebRequest $request)
   {
      $this->txt = 1234;
      return $this->renderPartial('part_1', array('txt' => $this->txt));
   }
}

您可以使用以下方法使用操作中的其他(常见)布局:

class ticketActions extends printingActions
{
   public function executePrint(sfWebRequest $request)
   {
      $template = $this->getContext()->getConfiguration()->getTemplateDir('printing', 'print_success_common_alt.php');
      $this->setLayout($template . '/print_success_common_alt');
      ...

      $this->txt = 1234;
      return $this->renderPartial('part_1', array('txt' => $this->txt));
   }
}

答案 1 :(得分:1)

我找到了部分解决方案,至少能够共享模板。

Partials section of the docs for symfony1中,它提到有3个地方可以称之为部分:

  • 来自当前模块
  • 来自同一应用程序中的其他模块
  • 从当前应用程序的全局模板文件夹

所以,我能做的就是将公共部分放在一个地方,并从每个需要使用它们的模块中引用它们。

我还可以传递一个带有当前模块名称的变量,这样它就可以动态调用常见模板中的模块特定模板。

我考虑过将公共部分直接放在全局模板目录中,但如果有多种类型的模块执行此操作,它会变得混乱和混乱。

尴尬的工作是在模板目录中创建一个目录,我可以将这些文件放入其中。

apps/
  other_app/
    lib/
      printingActions.class.php
    modules/
      ticket/
        actions/
          actions.class.php
        lib/
        templates/
          printSuccess.php //common parts extracted to partial
          _part_1.php
          _part_3.php
      receipt/
        actions/
          actions.class.php
        lib/
        templates/
          printSuccess.php //common parts extracted to partial
          _part_1.php
          _part_3.php
      voucher/
        actions/
          actions.class.php
        lib/
        templates/
          printSuccess.php //common parts extracted to partial
          _part_1.php
          _part_3.php
    templates/
      _printing_common/
        print_success_common.php //common parts of PrintSuccess extracted as partial
        part_2.php      //exactly the same for all 3

它创建了一个不太理想的问题,不得不强调新目录并从内部的部分中删除下划线。

但是,使用这种方法,我能够共享公共位,并且模块特定代码是模块模板目录中唯一需要指定的代码。

以下是其中一些文件的内容示例:

应用/ other_app /模块/票据/模板/ printSuccess.php

<?php
  include_partial(
    'global/printing_common/print_success_common',
    array(
      'moduleNameText' => $moduleNameText
    )
  );

应用/ other_app /模板/ _printing_common / print_success_common.php

...
<?php include_partial($moduleNameText.'/part_1',array('moduleNameText' => $moduleNameText)); ?>
...
<?php include_partial('global/printing_common/part_2',array('moduleNameText' => $moduleNameText)); ?>
...
<?php include_partial($moduleNameText.'/part_3',array('moduleNameText' => $moduleNameText)); ?>

这不是理想的解决方案,所以我会将这个问题留给更好的解决方案,但在那之前我们的工作就是这样。