【问题标题】:Silverstripe admin: "Has one" dropdown converts to ordinary input field after importSilverstripe 管理员:“有一个”下拉列表在导入后转换为普通输入字段
【发布时间】:2014-02-09 17:00:44
【问题描述】:

我在 Silverstripe 的管理员方面遇到了一些问题。我定义了一个数据库模型(参见下面的类定义),在我进行开发/构建之后,一切都按预期进行。当我尝试添加一个新的“包”时,所有“有一个”字段都带有一个下拉菜单(参见屏幕截图 1)。我还构建了一个导入器来导入这些包。运行时,一切看起来都很好,除非你打开一个包。然后“节日”正确耦合。您可以看到名称,并且可以选择下拉菜单。另一方面,“Troupe”已神秘地转换为一个输入字段,该字段仅显示另一个表中记录的 id(参见屏幕截图 2)。

有人知道这里发生了什么吗?有什么东西会触发我不知道的这种行为吗?我的代码有问题吗(是的,但与这个问题有关?;-))?我检查了表的结构,没有任何可疑之处......

之前:

之后:


包.php

    class Package extends DataObject {
        public static $db = array(
            'Number'                    => 'Int',
            'Title'                     => 'Varchar(255)',
            'Description'               => 'HTMLText',
            'Credits'                   => 'HTMLText',
        );

        public static $has_many = array(
            'Events'    => 'Event',
        );

        public static $many_many = array(
           'Genres'            => 'Genre',
        );

        public static $has_one = array(
            'Festival'          => 'Festival',
            'Troupe'            => 'Troupe',
        );
    }

    class PackageAdmin extends ModelAdmin {
        public static $managed_models       = array('Package'); // Can manage multiple models
        static $url_segment                 = 'packages'; // Linked as /admin/packages/
        static $menu_title                  = 'Packages';
    }

剧团.php

    class Troupe extends DataObject {
        public static $db = array(
            "Name"          => "Varchar(255)",
            "Description"   => "HTMLText",
            "Url"           => "Varchar(255)",
        );

        public static $has_many = array(
            'Packages'      => 'Package.Troupe',
        );
    }

    class TroupeAdmin extends ModelAdmin {
        public static $managed_models       = array('Troupe','Package'); // Can manage multiple models
        static $url_segment                 = 'troupes'; // Linked as /admin/troupes/
        static $menu_title                  = 'Troupes';
    }

Festival.php

class Festival extends DataObject {

    public static $db = array(
        'Name'          => 'Varchar(255)',
        'Description'   => 'HTMLText'
    );

    public static $has_many = array(
        'Packages' => 'Package.Festival'
    );
}

class FestivalAdmin extends ModelAdmin {
    public static $managed_models       = array('Festival','Package'); // Can manage multiple models
    static $url_segment                 = 'festivals'; // Linked as /admin/festivals/
    static $menu_title                  = 'Festivals';
}

【问题讨论】:

    标签: php silverstripe


    【解决方案1】:

    您可能不应该只依赖管理员脚手架,而是在您的 DataObjects 上使用 getCMSFields 来自定义 CMS 中发生的事情。在您的情况下,可以简单地替换 Troupe 下拉列表,将其添加到您的 Package 类中:

    function getCMSFields()
    {
        $fields = parent::getCMSFields();
    
        $troupeList = Troupe::get()->map()->toArray();
        $troupeSelect = DropdownField::create('TroupeID', 'Troupe')->setSource($troupeList);
    
        $fields->replaceField('TroupeID', $troupeSelect);
    
        return $fields;
    }
    

    这是非常简约的,我可以定制更多。

    【讨论】:

    • 我同意,无论如何,为什么脚手架在这里不起作用会很有趣。
    • 谢谢!这成功了。然而,正如 Schellmax 已经暗示的那样,它与其说是一种解决方案,不如说是一种解决方法。但对我来说这是完美的,因为我没有时间彻底研究这个问题。
    • ForeignKey 类中,会为($list->count() < 100) 和一些cmets 生成一个下拉菜单“不要为大表搭建下拉菜单...可能会超出可用的PHP 内存”...
    • 我在怀疑类似的事情,这是有道理的。目前我没有性能问题,所以我将它们留在...
    • @colymba +1 以进一步投资该主题。很高兴知道
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多