3

我在 Symfony1 应用程序上工作。

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

可以在子操作类中覆盖自动生成的操作方法,并且可以通过在模块的模板文件夹中创建一个具有相同名称的模板来覆盖模板。使用本地模板而不是自动生成的模板,这些模板存储在缓存文件夹中(我认为这是正常的 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 个操作都扩展了相同的自定义操作类,因此它们都实现了相同的方法并共享相同的方法。

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

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

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

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

4

2 回答 2

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));
   }
}
于 2015-07-14T13:08:45.397 回答
1

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

symfony1 文档的 Partials 部分中,它提到有 3 个地方可以调用 partials:

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

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

我还可以传入一个具有当前模块名称的变量,以便它可以从公共模板中动态调用特定于模块的模板。

我考虑将公共部分直接放在全局模板目录中,但如果有不止一种类型的模块这样做,它会变得混乱和混乱。

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

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/modules/ticket/templates/printSuccess.php

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

应用程序/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)); ?>

这不是理想的解决方案,因此我将把这个问题留给更好的解决方案,但在此之前它们是我的工作。

于 2015-07-13T13:02:09.693 回答