SilverStripe Наследяване на елементи от родителски обект на данни

Зададох поле, наречено Цвят, в Page.php и за всяко дете бих искал да взема родителския цвят или да превъртя, докато намери родител, който има зададено цветово поле.

Имам функция по-долу, която изглежда работи във 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());
}

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


Отговори (2)


Ако приемем, че вашето цветно поле е поле на база данни, а не връзка с друг обект с данни, добавете следния метод към вашия 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 за препратка към текущата страница.

няма повече DataObjectDecorator в SilverStripe 3 (вижте http://www.robertclarkson.net/2012/06/dataextension-class-replacing-dataobjectdecorator-silverstripe-3-0/), така че има две възможни решения:

а) заменете DataObjectDecorator с DataExtension

b) просто преместете функцията Inherited във вашия клас Page и заменете $this->owner с $this

person schellmax    schedule 17.10.2012