Silverstripe admin: «имеет один» выпадающий список преобразуется в обычное поле ввода после импорта

У меня проблемы с администратором Silverstripe. Я определил модель базы данных (см. Определения классов ниже), а после создания dev / build все выглядит так, как ожидалось. Когда я пытаюсь добавить новый «пакет», все поля «есть» есть с раскрывающимся списком (см. Снимок экрана 1). Я также создал импортера, который импортирует эти пакеты. При запуске все выглядит нормально, за исключением случаев, когда вы открываете пакет. Затем «Фестиваль» правильно сочетается. Вы можете увидеть это имя, и вы можете выбрать раскрывающийся список. С другой стороны, «Труппа» загадочно превратилась в поле ввода, которое показывает только идентификатор записи в другой таблице (см. Скриншот 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'; } 

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'; } 

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'; } 

Вероятно, вы должны не только полагаться на админ-леса, но и использовать getCMSFields в своих DataObjects для настройки того, что происходит в 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; } 

Это довольно минималистично, и многое другое можно мне настроить.