【问题标题】:How can I get the parent element property before I save and published the children element in Silverstripe Elemental?在 Silverstripe Elemental 中保存和发布子元素之前,如何获取父元素属性?
【发布时间】:2016-10-26 22:55:22
【问题描述】:

我在使用银条元素时遇到了一点问题。我试图在子元素中获取一些父元素属性,但只有在我保存并发布子元素后,父元素属性才可用。

例如,我想获取子元素 QuizAnswer 中的 QuizQuestion 元素属性 QuestionNumber = 2,但我在数据库中只获取了默认值 QuestionNumber = 0

当我Debug::show($this->QuizQuestion()->QuestionNumber)时,我可以看到确实是2。如何在保存和发布子元素之前获取父元素属性?

【问题讨论】:

    标签: php silverstripe


    【解决方案1】:

    我现在不知道这个模块,但通常你应该能够从当前 url 中获取父 id。这很 hacky,但应该适合你。

    public function ItemByUrl() {
      $uri = explode('/', $_SERVER['REQUEST_URI']);
      $i = array_search('IDENTIFIER', $uri);
    
      if(isset($uri[$i+PARTS])) {
        $itemID = $uri[$i+PARTS];
        $item = DATAOBJECTCLASS::get()->byID($itemID);
        if($item) {
          return $item;
        }
      }
    }
    

    所以如果你的网址是这样的

    admin/.../EditForm/field/ParentDataObject/item/67/ItemEditForm/field/ChildDataObject/item/new

    而你想要得到 ParentID 67

    IDENTIFIER 将是“ParentDataObject”

    PARTS 将是“2”

    而 DATAOBJECTCLASS 将是“ChildDataObject”

    【讨论】:

    • 这可能是一种解决方法,尽管正如您所说的那样,它很hacky。希望看到其他方式来实现它,特别是父数据对象的一些其他属性无法通过 URL 获取。不过感谢您的回复。
    【解决方案2】:

    此时父记录应该可用。确保首先调用父方法。

    在底层,elemental 只使用 GridField,因此您可以搜索任何 GridField 相关文档以更好地理解这一点。

    public function onBeforeWrite()
    {
        parent::onBeforeWrite();
    
        // $this->List(); // Obj(ID = 2);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-19
      • 2013-06-13
      • 1970-01-01
      • 1970-01-01
      • 2013-04-02
      • 1970-01-01
      相关资源
      最近更新 更多