【问题标题】:Extend templates with dataextensions/modules content - SilverStripe 3.4使用数据扩展/模块内容扩展模板 - SilverStripe 3.4
【发布时间】:2016-09-29 06:50:43
【问题描述】:

如果我使用数据扩展来扩展数据对象,我可以为它添加额外的功能。例如,我有一个从具有库存功能的模块扩展而来的项目。假设 Item 还得到了其他几个模块的扩展。

在具有库存功能的扩展之后,我想在前端显示项目的可用性,例如用绿点/红点。如何在我的模板中获取此点的标记,用于详细信息页面 (ItemPage.ss) 和项目概览页面的包含 (Item.ss) 而不 覆盖整个模板。只需添加这一部分,就像我在基类上扩展函数的方式一样?

【问题讨论】:

    标签: silverstripe


    【解决方案1】:

    这可能是向原始模板添加额外标记的一种方式。

    内部数据对象或全局数据对象扩展

      public function ExtraTemplateHTML($position) {
        $html = null;
    
        foreach($this->owner->extend('updateExtraTemplateHTML') as $positionBlocks) {
          if(isset($positionBlocks[$position])) {
            foreach($positionBlocks[$position] as $htmlBlock) {
              $html .= $htmlBlock->getValue();
            }
          }
        }
    
        return $html;
      }
    

    在特定的数据对象扩展中

      public function updateExtraTemplateHTML($htmlBlocks) {
        $viewer = new SSViewer(__CLASS__);
        $html = $viewer->process($this->owner);
        $htmlBlocks['bottom'][] = $html;
    
        $topHtml = HTMLText::create();
        $topHtml->setValue(123);
        $htmlBlocks['top'][] = $topHtml;
    
        return $htmlBlocks;
      }
    

    原始模板

    $ExtraTemplateHTML(top)
    ...
    ...
    $ExtraTemplateHTML(bottom)
    

    扩展模板

    不仅仅是为您的扩展程序编写一个包含您想要添加的内容的新模板。

    【讨论】:

    • 您并没有覆盖现有模板,而是实际上更改了原始模板以支持可扩展性。这种方法已经在包silverstirpe/widgetssheadawson/silverstripe-blocksnobrainerweb/silverstripe-content-blocks中使用。
    • 因为覆盖模板从来都不是我的目标——就像我的问题中描述的那样。谢谢你的模块,也许他们的方法比我的好。
    【解决方案2】:

    您不能部分更改模板,只能用另一个模板替换该模板。因此,请牢记这一点,您应该保持具有许多逻辑包含的模块化架构。

    扩展现有内容的另一种可能方法是使用 DOM 和 javascript。但是你应该考虑副作用。例如,如果您添加额外的文本内容,那么爬虫将看不到它,并且会影响您的 SEO。但是对于装饰性的增强,比如添加额外的彩色圆点,这种方法是可行的。

    【讨论】:

    • 我怀疑默认情况下是不可能的。点只是一个简单的例子。当然还有更复杂的数据要添加。所以JS不是一个好的选择。也许我必须考虑一个自定义函数来实现这一点。
    猜你喜欢
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 2011-06-04
    • 2016-07-10
    • 2015-11-24
    • 2021-12-12
    • 1970-01-01
    • 2010-11-27
    相关资源
    最近更新 更多