无法将VirtualPage添加为允许的子项

时间:2015-02-17 06:31:58

标签: silverstripe

我已经创建了一个持有者页面KochiHolder,如下所示,并成功执行了数据库重建。我已将$allowed_children的{​​{1}}设置为仅接受KochiHolderKochiPage

在CMS中,我无法在VirtualPage页面下创建VirtualPage

为什么KochiHolder无法正常工作?如何将$allowed_children设为VirtualPage

的子页面

KochiHolder

KochiHolder

1 个答案:

答案 0 :(得分:1)

在对Silverstripe用于CMS中“添加页面”屏幕的CMSPageAddController(更具体地说,doAdd操作)进行了一些调试后,我相信我找到了问题的根本原因

所以似乎发生了以下错误:Page type "Page" not allowed as child of this parent page(好吧,这是我在测试中得到的错误)

SiteTree类中,它有一个validate函数,用于检查允许的子项是什么。其中一项检查是unrolling VirtualPage to the page it is a virtual of。 (可能还有更多的东西 - 我需要做更多的调查)

好消息是你可以覆盖这个功能,但它不是很好。基本上,因为您的类扩展Page扩展SiteTree,如果您在validate上指定了自己的Page函数(同时VirtualPage扩展Page你可以覆盖这个功能。

在我的测试中,我使用了以下内容:

public function validate()
{
    $result = parent::validate();

    if ($this instanceof VirtualPage)
    {
        $newResult = new ValidationResult();

        $items = $result->messageList();
        foreach ($items as $key => $value)
        {
            if ($key != 'ALLOWED_CHILDREN')
            {
                $newResult->error($value, $key);
            }
        }

        return $newResult;
    }

    return $result;
}

它并不完美,它会做出一些假设(例如假设messageListthat isn't always the case中的所有项目都有错误代码。我没有用它做过大量的测试,但它确实可以用来重现你的特定场景。