【问题标题】:SilverStripe - Adding 2 TreeDropdownFields, only one worksSilverStripe - 添加 2 个 TreeDropdownFields,只有一个有效
【发布时间】:2017-03-29 13:58:34
【问题描述】:

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

代码如下:

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 将允许前 2 个渲染 正确,但第三个只会显示标签而不是 TreeDropdownField
  • 此格式有效,但不会保存所选内容 - 只要您离开页面,它就会清除您的选择。此外,它会删除所有已保存在管理员中的内容,除非我将其删除。我无法进行更改,否则保存的项目将被删除。):

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

有没有人知道为什么会发生这种情况?不能有多个TreeDropdownFields 似乎没有意义。

【问题讨论】:

  • “HomeBanner”这个名字告诉我应该还有一个 has_one 指向 HomePage 或类似的东西?造成这种情况的原因可能是 SilverStripe 自动尝试设置 has_one 关系之一以指向横幅所属的页面。
  • 废话...这实际上是我所缺少的。我不敢相信我以前没有意识到!我想这是因为我已经离开 SilverStripe 几个月了,忘记了一些事情。谢谢!

标签: silverstripe


【解决方案1】:

转帖,原来是这个答案:

“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 ID)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多