使用dataextensions / modules内容扩展模板 - SilverStripe 3.4

时间:2016-09-29 06:50:43

标签: silverstripe

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

使用库存保留功能进行扩展后,我想在前端显示项目的可用性,例如绿色/红色点。如何在我的模板中为详细信息页面(ItemPage.ss)获取此点的标记,并为项目概述页面中的include(Item.ss)而不用覆盖整个模板。只是添加这一部分,就像我在基类上扩展函数的方式一样?

2 个答案:

答案 0 :(得分: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)

扩展模板

只需为您的扩展程序编写一个新模板,其中包含您要添加的内容。

答案 1 :(得分:0)

您无法部分更改模板,您只能将模板替换为另一个模板。所以,记住这一点,你应该保持模块化架构的许多逻辑包含。

扩展现有内容的另一种可能方法是使用DOM和javascript。但你应该考虑副作用。例如,如果您添加额外的文字内容,那么抓取工具就无法看到它,并会影响您的搜索引擎优化。但是对于装饰性增强,例如添加额外的彩色圆点,这种方法将起作用。