Content management system Silverstripe 3.1.x从父级获取值

Content management system Silverstripe 3.1.x从父级获取值,content-management-system,silverstripe,Content Management System,Silverstripe,我想得到一个通用函数,用于获取页面模板中的数据,如果未设置属性,则从父级或父级获取数据,依此类推。对于泛型,我的意思是独立于关系,比如db,HasOne,HasMany,ManyMany。假设我有一个针对ManyMany的示例,但我想检测它是一个对象、HasManyList还是ManyManyList或一个值。像这样的东西是内置的还是你会怎么做 function ManyManyUpUntilHit($ComponentName){ $Component = $this->getMan

我想得到一个通用函数,用于获取页面模板中的数据,如果未设置属性,则从父级或父级获取数据,依此类推。对于泛型,我的意思是独立于关系,比如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)

在Silverstripe中没有内置的方法来执行此操作。为此,您需要编写自己的函数

下面是一个示例,可以通过参数获取页面的has_one、has_many或many_many资源,或者访问站点树直到找到资源,或者访问根页面:

函数getComponentRecursive($componentName){ //你有吗 如果($this->has_one($componentName)){ $component=$this->getComponent($componentName); if(isset($component)&&$component->ID) { 返回$component; } } //你有很多 如果($this->has_many($componentName)){ $components=$this->getComponents($componentName); if(设置($components)&&$components->count()) { 返回$components; } } //许多 如果($this->many\u many($componentName)){ $components=$this->getManyManyComponents($componentName); if(设置($components)&&$components->count()) { 返回$components; } } 如果($this->ParentID!=0) { 返回$this->Parent()->getComponentRecursive($componentName); } 返回false; }
如果我没弄错的话,这将以一种比上述函数更不一般的方式解决问题,因为您必须在php中指定“资源”。我想要的是一个函数,它允许我在模板中指定资源,而不管它是DB、HasOne、HasMany还是ManyMany资源。我已经使用参数更新了我的答案,并为has\u one、has\u many或many\u many工作。我测试过一个,但没有其他的。我不知道如何从db获取项目,属于或属于多个。很抱歉,我花了很长时间才回到这里。a、 t.m.我没有来自归属方的用例,所以它对我来说非常有用-谢谢!