CakePHP: идентификация голодности сводит меня с ума - PullRequest
1 голос
/ 06 августа 2011

По соображениям целостности данных я пытаюсь заполнить сверхпростой выпадающий список «Страны» в моих пользователях / реестре

Поскольку Страна и Пользователь не имеют никакого отношения (пожалуйста, не комментируйте это, есть причины для этого. Cake ведет себя так же, если Страна является FK), я извлекаю страны в моем users_controller следующим образом, оба метода делают не мешает Cake от сохранения только country_id:

$this->set('countries', ClassRegistry::init('Country')->find('list'));

$this->set('countries', ClassRegistry::init('Country')->find('list', array('fields' => array('Country.country'))));

Для DisplayField установлено значение: страна.

В моем register.ctp вход устанавливается как:

echo $this->Form->input('country');

Страны показывают хорошо в раскрывающемся списке. Но что бы я ни пытался, в таблицу пользователей сохраняется только идентификатор страны. Я удалил ID в таблице и сделал страну моей PK. Торт заговорил о «пропавшей колонке» Country.id.

Как решить эту простую вещь или мне нужно переключиться обратно на простой простой PHP без фреймворка, где на это уходит у меня 30 секунд.

Спасибо!

Ответы [ 2 ]

1 голос
/ 06 августа 2011

просто используйте это: $this->set('countries', ClassRegistry::init('Country')->find('list', array('fields' => array('Country.country','Country.country'))));

1 голос
/ 06 августа 2011

Если я правильно вас понимаю, значение и отображаемое название страны должны совпадать.Метод Cake find('list') по умолчанию использует списки id => name, которые можно настроить с помощью параметра fields (необходимо указать два поля).Я не знаю, сработает ли это, если вы укажете одно и то же поле дважды, возможно, вы захотите попробовать это.бесконечные способы составить список самостоятельно.Проще всего, используйте find('list'), затем просто скопируйте значения в ключи:

$countries = $this->Country->find('list');
$countries = array_combine($countries, $countries);

Если в вашей таблице country вообще нет поля id, просто используйте обычный find('all') исоздайте свой собственный массив:

$countries = $this->Country->find('all');
$countries = array_map(function ($country) { return $country['Country']['name']; }, $countries);
$countries = array_combine($countries, $countries);

И последнее, но не менее важное: вы можете отказаться от помощника Cake Form, который ожидает массив value => name для своих параметров, и вывести свой собственный список стран на необработанном PHP.

Соглашения Cake - это безопасное время для типичных моделей.Если ваши шаблоны не типичны, в CakePHP все еще есть PHP.

...