Получение связанных данных с помощью Wizard Component - PullRequest
0 голосов
/ 22 августа 2011

Краткая версия этого вопроса:

Как я могу взять данные, которые существуют только в массиве (то есть: еще не сохранены в модели), и связать их со значениемв массиве $this->find('list') из модели?

Длинная версия этого вопроса:

Я использую CakePHP и Wizard Component для трехэтапной анкеты.

3 шага формы - это контакт, курс и детали.

После этих шагов есть шаг «обзора», на котором я хочу отобразить всепредставления из предыдущих 3 шагов формы для пользователя, чтобы проверить в последний раз перед нажатием подтверждения.По большей части это работает очень хорошо.Мне просто нужно сделать следующее в контроллере:

function _prepareReview() {
   $contact = $this->Wizard->read('contact');
   $course = $this->Wizard->read('course');
   $details = $this->Wizard->read('details');
   $this->set(compact('contact','course','details'));
}

Затем в файле review.ctp я могу сослаться на такие вещи, как $contact['Contact']['firstname'];, чтобы получить имя человека и т. Д.

Однакопроблема заключается в получении данных из «связанных» моделей.Например, есть поле «Национальность», которое является просто идентификатором.На шаге «детализация» я использую find('list'), чтобы получить список всех национальностей из модели «Национальность» в виде раскрывающегося меню, которое отображается правильно, а затем Cake сохраняет соответствующий идентификатор, как и должно быть.

Но,когда я подхожу к шагу «обзор» в компоненте мастера, я получаю фактический идентификатор только из массива компонента мастера.Я не мог ожидать, что получу что-то еще.

Я не вижу очевидного способа получить доступ к $details[Detail][Nationality][name] (или что-то в этом роде) из контекста компонента Wizard, потому что установка рекурсии не работаетпотому что данные на самом деле не находятся в модели на данном этапе, это просто массив данных формы.

Итак, другими словами, у меня есть данные в массиве (НЕ из модели, а изотправка формы) следующим образом:

Array
(
   [Details] => Array
      (
         [firstname] => Test
         [nationality_id] => 3
      )
)

Тогда у меня есть $this->Detail->Nationality->find('list'), которое выглядит следующим образом:

Array
(
   [0] => American
   [1] => Australian
   [2] => British
   [3] => Canadian
)

Так как я могу получить $details['Details']['nationality_id']; изКомпонент мастера для отображения «канадский» вместо «3», например?Как мне сделать отношения, когда только один из массивов исходит от модели?Мне нужно только это, чтобы на мгновение подтвердить все данные пользователю.Идентификатор «3», конечно, будет записан в модель, как только пользователь нажмет на кнопку «Отправить», и это уже работает, как и должно.

Или это совершенно сумасшедший способ сделать что-то, и я долженпосмотрите на совершенно другой подход, например, сначала сохранить данные?Однако я не хочу его сохранять до тех пор, пока пользователь не нажмет окончательный вариант подтверждения.

1 Ответ

2 голосов
/ 22 августа 2011

Я могу видеть, что вы получаете здесь - CakePHP не запрашивает автоматически эти связанные с вами модели (поскольку вы не извлекаете данные из базы данных), но вы не можете не думать, что упускаете некоторые из них.бесплатная функциональность фреймворка.

Если вы все еще используете FormHelper::input(), он автоматически выберет правильную опцию (если вы выполните Model::find('list') и передал список опций первому представлению), но я предполагаю,Вы хотите, чтобы на экране просмотра не было вводов формы (disabled или нет).

Самый простой подход - просто выполнить те же вызовы Model::find('list'), которые вы делаете для каждого шага в мастере,установите данные для каждого представления и распечатайте соответствующее значение вручную:

// controller
$nationalities = $this->Review->Details->Nationality->find('list');
$this->set(compact(/*..., */ 'nationalities'));

// view
<?php echo $nationalities['Nationality'][$details['Detail']['nationality_id']]; ?>
outputs 'Canadian' (the value for $nationalities['Nationality'][3])

Возможно, CakePHP сможет сделать это за вас, просто набрав DboSource::queryAssociation()правильно - если вы готовы принять вызов - но, вероятно, это слишком для этой конкретной проблемы.

// model
$db =& ConnectionManager::getDataSource($this->useDbConfig);
$data = $db->queryAssociation($model, $linkModel, $type, $association, $assocData, $queryData, $external, $resultSet, $recursive, $stack) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...