Это можно решить external валидацией.
Вообщем вот как я сделал:
public function action_index()
{
$post = array(
'text' => 'qwerty',
'title' => 'qwerty',
'description' => 'qwerty'
);
$post['cids'] = array(
1, 7
);
$this->validation = Validation::factory($post)
->rule('cids', array($this, 'check_cids'), array(':value'));
$article = ORM::factory('article');
$article->values($post, array('title', 'description', 'text'));
try
{
$article->save($this->validation);
$article->add('categories', $post['cids']);
}
catch (ORM_Validation_Exception $e)
{
$this->errors = $e->errors('models');
}
if (isset($this->errors['_external']))
{
foreach ($this->errors['_external'] as $error)
{
$this->template->content .= $error.'<br />';
}
}
}
@param @return
public function check_cids($value)
{
$cats = DB::select('id')->from('categories')->execute();
foreach ($cats as $c)
{
$available_cids[] = $c['id'];
}
$diff_cids = array_diff($value, $available_cids);
if (!empty($diff_cids))
{
return FALSE;
}
return TRUE;
}
Тексты ошибок хранятся в файле models/_external.
php Соответственно папка models у тебя будет validation.
Ошибки хранятся в массиве $errors['_external']
Вообще это внешняя валидация очень удобная вещь (например для валидации при регистрации нажал ли человек галочку "принимаю условия блаблабла"). И возможность самому указать колбек функции для валидации тоже бомба!
update: ну еще для пущей красоты лучше сделать функцию проверки на наличие категории статической в модели Article
$this->validation = Validation::factory($post)
->rule('cids', 'Model_Article::check_cids', array(':value'));
И просто перенести из контроллера в файл модели Article функцию check_cids. Естественно сделал ее статической.
Ну и в файле ошибок _external.
phpreturn array(
'cids' => array(
'Model_Article::check_cids' => 'Упс, нет такой категории...'
)
);
Вот и все. Вроде все очень красиво и опрятно)))