Раскрывающийся список Cakephp (список выбора) + как отобразить значение из модели и связанной модели
Я хотел бы отобразить в раскрывающемся списке (список выбора), который объединяет значение поля из модели и поля из связанной модели. У меня есть таблица 'working_day', которая связана с таблицей 'user' и 'pause'. В представлении "Пауза" (добавление и редактирование) у меня есть раскрывающийся список, в котором отображается рабочий_день_, но я хочу отобразить поля "дата" в "Рабочий день" и поля "имя пользователя" в "Пользователь".
Например: 13/04/2016 (Джером С).
Я уже пробовал $virtualfield, он работает, когда я использую поле из "WorkingDay", но он не работает, когда я использую поле из "User".
$virtualfield, который я пробовал:
public $virtualFields = array('workingday_display_field' => 'concat(WorkingDay.date_working_day, " (", User.username, ")")');
public $displayField = 'workingday_display_field';
Я также попробовал решение, предложенное ниже, но оно не работает, возникает та же проблема:
public function __construct($id = false, $table = null, $ds = null) {
parent::__construct($id, $table, $ds);
$this->virtualFields['workingday_display_field'] = sprintf('concat(%s.date_working_day, " (", %s.username, ")")', $this->alias, $this->User->alias);
$this->displayField = "workingday_display_field";
}
Кто-нибудь знает, как решить проблему?
Заранее спасибо.
2 ответа
Есть некоторые проблемы с этим при использовании другого псевдонима модели, другой рекомендуемый способ - обработать их в методе конструкции Models:
public function __construct($id = false, $table = null, $ds = null) {
parent::__construct($id, $table, $ds);
$this->virtualFields['name'] = sprintf('CONCAT(%s.first_name, " ",%s.last_name)', $this->alias, $this->alias);
$this->virtualFields['namewithemail'] = sprintf('CONCAT(%s.first_name, " ", %s.last_name, " (", %s.email, ")")', $this->alias, $this->alias, $this->alias);
$this->displayField = "namewithemail";
}
Это описано в этом разделе книги: http://book.cakephp.org/2.0/en/models/virtual-fields.html.
У меня похожая ситуация, когда мне нужно создать список, который объединяет два поля из разных таблиц. В итоге я переопределил find(), чтобы вернуть соответствующий список.
public function find($type = 'first', $params = array()) {
$workingdays = array();
if ($type == 'list'){
$params = array_merge(
array('contain' => array('User')),
$params
);
$workingdaysUnformatted = parent::find('all', $params);
foreach($workingdaysUnformatted as $workingday){
$workingdays['WorkingDay']['workingday_display_field'] = $workingday['WorkingDay']['date'].' ('.$workingday['User']['username'].')'
}
}
else
$workingdays = parent::find($type, $params);
return $workingdays;
}
Может быть более классный способ форматирования списка, который вы хотите вернуть, но это иллюстрирует общую идею.