SilverStripe继承父数据对象中的元素

时间:2012-10-16 20:57:27

标签: silverstripe

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

我有一个下面的函数似乎可以在2.4中工作但是我无法在SS3中工作,我在模板中的循环中调用$ Inherited(Color)。

感谢您的帮助

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

2 个答案:

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

答案 1 :(得分:1)

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

public function getColour() {

    // Try returning banners for this page
    $colour = $this->getField('Colour');
    if ( $colour ) {
        return $colour;
    }

    // No colour for this page? Loop through the parents.
    $parent = $this->Parent();
    if ( $parent->ID ) {
        return $parent->getColour();
    }

    // Still need a fallback position (handled by template)
    return null;
}

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

这种操作尽管很有用,但应该谨慎地进行或者高度缓存,因为它可能会在大多数页面加载时发生递归,并且很少发生变化。