Валидация данных HABTM

November 27, 2008 | By admin | Filed in: CakePHP, Переводы.

Еще одна статья от текноида. Оригинал

==

Итак, у нас есть модели Post и Tag (Post hasAndBelongsToMany Tag).

Перед сохранением поста нам нужно убедиться, что пользователь выбрал хотя бы один тег…

Посмотрим, как это можно сделать…

Сначала создадим форму для сохранения поста и тегов к нему.

echo $form->create('Post', array('action'=>'add'));
echo $form->input('title');
echo $form->input('post');
echo $form->input('Tag', array('multiple'=>'checkbox'));
echo $form->end('Add post');

Все просто и понятно. В контроллере получаем список тегов, которые будут преобразованы в чекбоксы для выбора тегов в форме. После сабмита формы данные будут отправлены приложению в виде массива идентификаторов.

Теперь добавим правило валидации для модели Tag:

class Tag extends AppModel {

var $name = 'Tag';

var $hasAndBelongsToMany = 'Post';

var $validate = array('Tag'=>array('rule'=>'checkTags'));

function checkTags() {
if(!empty($this->data['Tag']['Tag'])) {
return true;
}

return false;
}
}

Видно, что мы используем собственный метод checkTags() для того, чтобы убедиться, что выбран хотя бы один тег. Может показаться, что следует использовать правило ‘notEmpty’, но, к сожалению, оно не работает с массивами.

Последнее, что нужно сделать – добавить действие add() в контроллер Posts:

function add() {

if(!empty($this->data)) {
$this->Post->Tag->set($this->data);
if($this->Post->Tag->validates()) {
$this->Post->save($this->data);
}
}

$this->set('tags', $this->Post->Tag->find('list', array('fields'=>array('id', 'tag'))));
}

Сначала мы проверяем модель Tag, и, если пользователь выбрал хотя бы один тег, сохраняем пост и связанные теги.


Tags: ,

Leave a Reply