1

我在 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());
}
4

2 回答 2

1

我想你已经在一些 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

于 2012-10-17T06:20:00.403 回答
1

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

公共函数 getColour() {

    // 尝试返回此页面的横幅
    $color = $this->getField('颜色');
    如果($颜色){
        返回$颜色;
    }

    // 这个页面没有颜色?循环通过父母。
    $parent = $this->Parent();
    if ( $parent->ID ) {
        返回 $parent->getColour();
    }

    // 仍然需要一个后备位置(由模板处理)
    返回空值;
}

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

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

于 2012-10-22T07:02:27.470 回答