Вставить в представление (т. Е. Views / users / add.ctp)
<?php echo $form->create('User', array('action' => 'add')) ?>
<?php echo $form->input('User.hobbies', array('type' => 'select',
'multiple' => 'checkbox',
'options' => array('sports' => 'sports',
'movies' => 'movies',
'games' => 'games'))) ?>
<?php echo $form->end('Save') ?>
Вставить в контроллер Users (просто стандартный метод сохранения, здесь ничего особенного)
function add() {
if(!empty($this->data)) {
if($this->User->saveAll($this->data, array('validate' => 'first'))) {
$this->Session->setFlash('User saved successfully');
} else {
$this->Session->setFlash('User failed to save');
}
}
}
Вставить в пользовательскую модель
function beforeValidate() {
// join hobbies into csv
if(!empty($this->data['User']['hobbies'])) {
$this->data['User']['hobbies'] = join(',', $this->data['User']['hobbies']);
}
return true;
}
Примечания:
- Если вам нужно отделить хобби обратно при чтении модели User, вы можете использовать обратный вызов «afterFind» или проверить Serializable Behavior http://blog.matsimitsu.nl/code/206/serializeable-behavior-for-cakephp, который автоматически сериализует и десериализует всякий раз, когда вы пытаетесь добавить или извлечь из массива в / из БД.
- Вместо этого вы можете добавить код beforeValidate к обратному вызову beforeSave, зависит только от того, какую проверку вы хотите выполнить. наличие кода в beforeValidate позволит вам выполнить базовую проверку notEmpty, однако в beforeSave вы сможете проверить наличие отдельных элементов в массиве.
Ссылки: