Symfony1 模板默认值和回退或模块之间的模板共享

Symfony1 template defaults and fallbacks or template sharing between modules

我在开发 Symfony1 应用程序。

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

可以在子操作中覆盖自动生成的操作方法 class 并且可以通过在模块的模板文件夹中创建一个同名的模板来覆盖模板。 使用本地模板而不是自动生成的模板,这些模板存储在缓存文件夹中(我认为这是正常的 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

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

但是我有 3 个模块做的事情非常相似,我想分享一下。

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

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

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

我知道这种事情是可以做到的,因为管理生成器可以做到这一点,但是经过数小时的挖掘,我找不到它到底在哪里做到的。

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

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

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

它造成了一个不太理想的问题,即必须给新目录加上下划线并从里面的部分中删除下划线。

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

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

apps/other_app/modules/ticket/templates/printSuccess.php

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

apps/other_app/templates/_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)); ?>

这不是理想的解决方案,所以我会保留这个问题以寻求更好的解决方案,但它们是我在那之前的工作。

如果您想使用带有默认布局的通用模块操作 class,您可以使用以下方法:

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));
   }
}