我在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());
}
答案 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是一个相关的数据对象,你可以做同样的事情,但在上面的代码中使用getComponent
或getComponents
方法代替getField
。这应该适用于Silverstripe版本2.4.x和3.0.x.
这种操作尽管很有用,但应该谨慎地进行或者高度缓存,因为它可能会在大多数页面加载时发生递归,并且很少发生变化。