2012-06-04 6 views
1

Возможно ли создать правило проверки в Kohana 3, которое будет проверять отношение has_many?Kohana 3: Правило проверки для has_many через отношения

Используя пример на guide page, сообщение в блоге может содержать много категорий через таблицу categories_posts. Было ли добавлено правило проверки, которое можно настроить в модели Post, чтобы проверить хотя бы одну категорию?

Я попытался следующие:

public function rules() 
{ 
    return array(
     'categories' => array(
      array(array($this, 'has'), array('categories')) 
     ) 
    ); 
} 

, потому что я вижу, что функция ORM::has вернется истина/ложь. Но я думаю, потому что «категории» - это отношения, а не поле, правило, которое я написал, никогда не проверяется.

Любые идеи?

ответ

1

Вы должны сохранить Post перед добавлением has_many отношений. Вы можете проверить Post для категорий после сохранения и пометить его как черновик, если они не были установлены.

+0

Да, у меня была эта проблема. Если я попытался добавить отношения 'has_many' перед сохранением' Post', я бы получил ошибку базы данных, потому что у 'Post' еще не было идентификатора. – krische

+0

Вот почему отношения должны быть проверены вне стандартной проверки модели. – biakaveron

0

Woo, хорошая идея. Фокус в шаблон дизайна MVC. Я думаю, что C бизнес не М.

if ($post->categories->find_all()) 
{ 
    //blablabla 
} 
+0

Или я полагаю, что могу просто сделать $ post-> categories-> count_all() 'и убедиться, что он больше 0. Я просто надеялся, что это возможно сделать с правилом проверки. – krische

0

Так как РУБРИКИ является внешним по отношению к сообщениям стола, вы хотите использовать внешнюю проверку. Создайте функцию с именем Model_Post::rule_has_valid_categories($submitted_categories, $post), которая возвращает логическое значение, указывающее, действительно ли представленные категории действительны для этого сообщения.

Затем создайте дополнительные правила просто, прежде чем пытаться сохранить пост:

$extra_rules = Validation::factory(array('categories' => $submitted_categories)) 
    ->rule(
    'categories', 
    'Model_Post::rule_has_valid_categories', 
    array(':value', ':model') 
); 

try 
{ 
    $post->save($extra_rules); 
} 
catch (ORM_Validation_Exception $e) 
{ 
    // if categories rule failed, array will contain _external[categories] field 
    print_r($e->errors('models')); 
} 

Вы сохраняете сообщение в /application/messages/models/post/_external.php:

return array(

    'categories' => array(
     'Model_Post::rule_has_valid_categories' => 'Invalid categories' 
    ), 

);