Я использовал модуль тракторcow's Silverstripe-автозаполнение на веб-сайте для реализации функции автозаполнения в текстовом поле. Однако мне интересно, почему он возвращает поле идентификатора вместо текста (в поле CompanyName).
Вот код.
На своей странице я использовал его в форме как:
public function MyForm(){
$fields = FieldList::create();
...
$fields->push(AutoCompleteField::create('StudentGroup_Name', 'Company name *','',null,null,'UserCompany','CompanyName')->setAttribute('required','required'));
...
}
тогда мой объект данных выглядит следующим образом:
class UserCompany extends DataObject{
private static $db = [
'CompanyID' => 'Int',
'CompanyName' => 'Varchar(512)'
];
private static $summary_fields = [
'CompanyID' => 'CompanyID',
'CompanyName' => 'CompanyName'
];
private static $default_sort = 'CompanyName ASC';
}






Я только что проверил исходный код, и displayField по умолчанию - Title. Вы можете изменить свой объект UserCompany, изменив поле CompanyName на Title, или использовать метод setDisplayField.
$fields->push(AutoCompleteField::create('StudentGroup_Name', 'Company name *','',null,null,'UserCompany','CompanyName')->setDisplayField('CompanyName')->setAttribute('required','required'));
Редактировать
Использование функции установки для Title также должно работать. Это означает, что вам не нужно использовать setDisplayField.
class UserCompany extends DataObject {
...
function Title() {
return $this->CompanyName;
}
}
Спасибо @Gavin, это то, что вызывает это, но изменение столбца CompanyName может сбивать с толку, поскольку мы используем его в качестве заголовка для импорта данных CSV. Я изменил метод __construct () и установил для полей значение $ sourceFields, проверив его количество. Таким образом, я мог бы также повторно использовать класс в других моих объектах данных. if (count ($ this-> sourceFields) == 1) {$ this-> displayField = $ this-> sourceFields [0]; ...}