Silverstripe admin:"有一个"下拉列表在导入后转换为普通输入字段

jbe*_*ulo 4 php silverstripe

我对Silverstripe的管理员有一些问题.我定义了一个数据库模型(参见下面的类定义),在我执行dev/build之后,所有内容都按预期显示.当我尝试添加一个新的"包"时,所有"有一个"字段都有一个下拉(见屏幕截图1).我还建立了一个导入这些包的导入器.运行时,除了打开包装外,一切都很好看.然后'节'正确耦合.您可以看到名称,然后可以选择下拉列表.另一方面,"Troupe"神秘地转换为输入字段,仅显示另一个表中记录的id(参见屏幕截图2).

有谁知道这里发生了什么?有什么东西可以触发我不知道的这种行为吗?我的代码有问题(是的,但与这个问题有关吗?;-))?我检查了桌子的结构,没有什么可疑的......

之前: 进口前

后: 进口后


Package.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';
    }
Run Code Online (Sandbox Code Playgroud)

Troupe.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';
    }
Run Code Online (Sandbox Code Playgroud)

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';
}
Run Code Online (Sandbox Code Playgroud)

col*_*mba 6

您可能不仅应该依赖于管理脚手架,还可以使用getCMSFieldsDataObjects来自定义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;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 在`ForeignKey`类中,为`($ list-> count()<100)生成一个下拉列表,并且一些注释"不要为大型表格搭建下拉列表......可能会超出可用的PHP内存". . (7认同)