SilverStripe - 添加2个TreeDropdownFields,只有一个可以工作

时间:2017-03-29 13:58:35

标签: silverstripe

我为TreeDropdownFields创建2 DataObject时遇到了一个非常奇怪的问题。出于某种原因,2个TreeDropdownFields中只有1个在SilverStripe管理员中正确呈现。另一个根本不作为TreeDropdownField渲染,而只是作为标签:

enter image description here

以下是代码:

class HomeBanner extends DataObject {

    public static $db = array(
        'SortOrder' => 'Int',
        'Title' => 'Varchar'
    );

    public static $has_one = array(
        'Image' => 'Image',
        'SecondaryImage' => 'Image',
        'FirstLink' => 'SiteTree',
        'SecondLink' => 'SiteTree'
    );

    public function getCMSFields() {
        $fields = parent::getCMSFields();
        $fields->removeFieldFromTab('Root.Main', 'PageID');
        $fields->removeFieldFromTab('Root.Main', 'SortOrder');

        $fields->addFieldToTab('Root.Main', new TreeDropdownField('FirstLinkID', 'First Link', 'SiteTree'));
        $fields->addFieldToTab('Root.Main', new TreeDropdownField('SecondLinkID', 'Second Link', 'SiteTree'));

        return $fields;
    }

    public static $summary_fields = array(
        'ID' => 'ID',
        'Title' => 'Title',
        'Thumbnail' => 'Thumbnail'
    );

    public function getThumbnail() {
        return $this->Image()->CMSThumbnail();
    }
}

这是我到目前为止所尝试的内容:

  • 正在运行dev/build/?flush=true
  • 正在投放?flush=all?flush=1
  • dev/build +刷新
  • 之后注销并重新登录
  • 在另一个浏览器中登录管理员(我通常使用Chrome但是 登录到FireFox上的网站管理员并看到了同样的问题)
  • 错误日志没有报告 - 它们很清楚
  • Chrome的开发工具控制台中没有错误
  • 添加第三个TreeDropdownField将允许前两个渲染 正确,但第三个将只显示一个标签,而不是一个 TreeDropdownField
  • 此格式有效,但不保存所选内容 - 只要您离开页面,它就会清除您的选择。此外,它删除管理员中已保存的所有内容,除非我将其删除。我无法进行更改,否则保存的项目将被删除。):

    $ fields-> addFieldToTab('Root.Main',新TreeDropdownField('SecondLink','Second Link','SiteTree','ID'));

有没有人对为什么会发生这种情况有任何想法?你不能拥有多个TreeDropdownFields似乎没有意义。

1 个答案:

答案 0 :(得分:3)

重新发布,结果证明是答案:

  

名称“HomeBanner”告诉我,还应该有一个has_one指向HomePage或类似的?原因可能是SilverStripe自动尝试将其中一个has_one关系设置为指向横幅所属的页面。

使用这样的代码时也会发生类似的冲突:

class Page extends SiteTree {
    private static $has_many = [
        'Banners' => 'Banner'
    ];
}

class Banner extends DataObject {
    private static $has_one = [
        'Page' => 'Page',
        'LinkedPage' => 'Page'
    ];
}

由于SilverStripe不知道是否应该使用PageIDLinkedPageID来自动填充has_many关系的那一方(GridField会尝试自动分配正确的has_one {1}} ID)。

在这些情况下,您可以使用点符号来区分它们 - 您将其更改为$has_many = ['Banners' => 'Banner.Page'];。有关详细信息,请参阅https://docs.silverstripe.org/en/3/developer_guides/model/relations/#has-many