[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Уроки Kohana + ZendFramework
Страницы: 1, 2
Семён
Мб проще заранее проверить в контроллере валидность входящих данных и наличие нужных id's ? Чем лепить всё с ORM ?
AmberLEX
Действительно, в контроллере можно так проверить
$count_cids = ORM::factory('category')->where('id', 'in', $cids)->count_all();
if (empty($cids) or (count($cids) != $count_cids)) {...}
Вроде нормально

_____________
1. Чудес не бывает.
2. Дерьмо случается.
phpdreamer
AmberLEX, можете перехватить такую исключительную ситуацию конструкцией try-catch
в контроллере smile.gif

Семён, а зачем "http://".$_SERVER['HTTP_HOST'] в base_url?

_____________
http://phpdreamer.ru
http://blog.phpdreamer.ru
http://php5shop.com
Семён
phpdreamer
Никита, На случай если перенесёшь проект на другой домен.
phpdreamer
Я пишу просто "/"
по дефолту вроде base_url так и было...


_____________
http://phpdreamer.ru
http://blog.phpdreamer.ru
http://php5shop.com
Zhandos
Это можно решить external валидацией.
Вообщем вот как я сделал:
    public function action_index()
{
$post = array(
'text' => 'qwerty',
'title' => 'qwerty',
'description' => 'qwerty'
);
// Типа из POST массива получаем id
$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');
}

// Получаем ошибки external валидации
if (isset($this->errors['_external']))
{
foreach ($this->errors['_external'] as $error)
{
$this->template->content .= $error.'<br />';
}
}
}

/**
* Проверка на наличие категории
*
@param $value
*
@return void
*/

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.php
return array(
'cids' => array(
'Model_Article::check_cids' => 'Упс, нет такой категории...'
)
);

Вот и все. Вроде все очень красиво и опрятно)))
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.