SilverStripe Наследование элементов от родительского объекта данных

Я установил поле под названием Color в Page.php, и для любого дочернего элемента я хотел бы получить родительский цвет или выполнить цикл до тех пор, пока он не найдет родителя, у которого установлено цветовое поле.

У меня есть функция ниже, которая, кажется, работает в 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());
}

person Senor Geno    schedule 16.10.2012    source источник


Ответы (2)


Предполагая, что ваше поле 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;
}

Если цвет является связанным объектом данных, вы можете сделать то же самое, но использовать getComponent или getComponents вместо getField в код выше. Это должно работать как с Silverstripe версии 2.4.x, так и с 3.0.x.

Этот вид операции, хотя и полезен, вероятно, следует выполнять экономно или сильно кэшировать, поскольку он рекурсивно может происходить при большинстве загрузок страницы и изменяться очень редко.

person Community    schedule 22.10.2012

Я полагаю, у вас есть эта функция, определенная внутри некоторого DataObjectDecorator, поскольку вы используете $this->owner для ссылки на текущую страницу.

в SilverStripe 3 больше нет DataObjectDecorator (см. http://www.robertclarkson.net/2012/06/dataextension-class-replacing-dataobjectdecorator-silverstripe-3-0/), поэтому есть два возможных решения:

а) заменить DataObjectDecorator на DataExtension

б) просто переместите функцию Inherited в свой класс Page и замените $this->owner на $this

person schellmax    schedule 17.10.2012