Раскрывающийся список 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;
}

Может быть более классный способ форматирования списка, который вы хотите вернуть, но это иллюстрирует общую идею.

Другие вопросы по тегам