Silverstripe 3.1.x получает значения от родителя

Я хотел бы получить общую функцию, работающую для получения данных в шаблоне страницы, и если свойство не установлено, получить его от родительского или родительского родительского элемента и т.д. Под общим я подразумеваю независимость от отношений, таких как db, HasOne, HasMany, ManyMany. Допустим, у меня есть это для ManyMany, но я хотел бы определить, является ли это объектом, HasManyList или ManyManyList или значением. Что-то подобное встроено или как бы вы поступили?

function ManyManyUpUntilHit($ComponentName){
  $Component = $this->getManyManyComponents($ComponentName);
  if($Component && $Component->exists())
  return $Component;
  $Parent = $this->Parent();
  if(is_object($Parent) && $Parent->ID != 0){
    return $Parent->ManyManyUpUntilHit($ComponentName);
  } else {
    return null;
  }
}

в шаблоне:

$ManyManyUpUntilHit(Teaser)

person munomono    schedule 13.11.2013    source источник


Ответы (1)


В Silverstripe нет встроенного метода для этого. Для этого вам нужно будет написать собственную функцию.

Вот пример, чтобы получить ресурс страницы has_one, has_many или many_many по параметру или перейти вверх по дереву сайта, пока не будет найден ресурс, или мы не попадем на корневую страницу:

function getComponentRecursive($componentName) {

    // has_one
    if ($this->has_one($componentName)) {
        $component = $this->getComponent($componentName);
        if (isset($component) && $component->ID)
        {
            return $component;
        }
    }

    // has_many
    if ($this->has_many($componentName)) {
        $components = $this->getComponents($componentName);
        if (isset($components) && $components->count())
        {
            return $components;
        }
    }

    // many_many
    if ($this->many_many($componentName)) {
        $components = $this->getManyManyComponents($componentName);
        if (isset($components) && $components->count())
        {
            return $components;
        }
    }

    if ($this->ParentID != 0)
    {   
        return $this->Parent()->getComponentRecursive($componentName);
    }

    return false;
}
person 3dgoo    schedule 17.11.2013
comment
Если я правильно понимаю, это решает проблему еще менее общим образом, чем функция выше, поскольку вам нужно указать ресурсы в php. Что я хотел бы иметь, так это функцию, которая позволяет мне указывать ресурс в шаблоне независимо от того, является ли он ресурсом DB, HasOne, HasMany или ManyMany. - person munomono; 18.11.2013
comment
Я неправильно понял раньше. Я обновил свой ответ, чтобы он работал с использованием параметра и работал для has_one, has_many или many_many. Я тестировал has_one, но не другие. Я не знаю, как получить элементы из базы данных, принадлежности_к или принадлежности_мани_мани. - person 3dgoo; 19.11.2013
comment
жаль, что мне понадобилось много времени, чтобы вернуться к этому. атм У меня нет варианта использования со стороны принадлежности, поэтому он отлично работает для меня - спасибо! - person munomono; 04.12.2013