【问题标题】:SilverStripe Inheriting elements from a parent dataobjectSilverStripe 从父数据对象继承元素
【发布时间】:2012-10-16 20:57:27
【问题描述】:

我在 Page.php 中设置了一个名为 Color 的字段,对于任何孩子,我想获取父颜色或循环直到找到确实设置了颜色字段的父对象。

我有一个下面的函数,它似乎在 2.4 中工作,但我无法在 SS3 中工作,我在模板中的循环中将其调用为 $Inherited(Colour)。

感谢您的帮助

public function Inherited($objName) {
    $page = $this->owner->Data();
    do {

        if ($obj = $page->obj($objName)) {

            if ($obj instanceof ComponentSet) {
                if ($obj->Count()) {
                    return $obj;
                }
            } elseif ($obj instanceof DataObject) {

                if ($obj->exists()) {
                    return $obj;
                }
            } elseif ($obj->exists()) {
                return $obj;
            }
        }
    } while ($page->ParentID != 0 && $page = $page->Parent());
}

【问题讨论】:

    标签: silverstripe


    【解决方案1】:

    假设您的 Color 字段是一个数据库字段,而不是与另一个数据对象的关系,请将以下方法添加到您的 Page 类。

    公共函数 getColour() { // 尝试返回此页面的横幅 $color = $this->getField('颜色'); 如果($颜色){ 返回$颜色; } // 这个页面没有颜色?循环通过父母。 $parent = $this->Parent(); if ( $parent->ID ) { 返回 $parent->getColour(); } // 仍然需要一个后备位置(由模板处理) 返回空值; }

    如果颜色是一个相关的数据对象,您可以做很多相同的事情,但在上面的代码中使用getComponentgetComponents 方法代替getField。这应该适用于 Silverstripe 版本 2.4.x 和 3.0.x。

    这种操作虽然有用,但可能应该谨慎执行或大量缓存,因为它是递归的,可能会在大多数页面加载时发生,并且很少更改。

    【讨论】:

      【解决方案2】:

      我想你已经在一些 DataObjectDecorator 中定义了这个函数,因为你使用$this->owner 来引用当前页面。

      SilverStripe 3 中不再有 DataObjectDecorator(请参阅 http://www.robertclarkson.net/2012/06/dataextension-class-replacing-dataobjectdecorator-silverstripe-3-0/),因此有两种可能的解决方案:

      a) 用 DataExtension 替换 DataObjectDecorator

      b) 只需将 Inherited 函数移动到您的 Page 类,并将 $this->owner 替换为 $this

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多