Kohana Сообщения пользовательской валидации

mstdmstd

Новичок
Всем привет,
Хочу сделать пользовательскую валидацию :

PHP:
	$validation -> rule('name', 'not_empty')->
  rule('name', 'Model_Facility::unique_name', array(':value', ':validation', ':field') );
В методе модели есть метод :

PHP:
	public static function unique_name($name, $validation, $field)
	{
		AppUtils::deb($name, '$name::');  // Вывожу на экран переменные -ok
		AppUtils::deb($validation, '$validation::');
		AppUtils::deb($field, '$field::');


		$id = Request::current()->param('id');
		$Res= DB::select(array(DB::expr('COUNT(name)'), 'total'))
			->from('facility')
			->where('name', '=', $name)
			->where('id', '!=', $id)
			->execute()
			->get('total');

		AppUtils::deb($Res, 'unique_name$Res::');
		if ( $Res ) {  // Если строка с таким именем существует то я хочу вывести свое сообщение об ошибке
			AppUtils::deb('INSIDE::');
			$validation->error($field, 'This facility name must be unique!'); // В нете я нашел что это делается так - хотя не уверен насчет версии 3.3
		}
		return !$Res;
	}
Но в результате у меня сообщение об ошибке имеет вид:
The comments.name.Model_Facility::unique_name
Поскольку список ошибок выводится в массив

PHP:
			$validation_errors_list = $validation->errors( 'comments' );
то я могу пробежаться по массиву и сделав проверку по ключу(имени поля) и тексту ошибке и поменять текст ошибки, только я не уверен что это лучший способ.
А как правильно?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
[/PHP]то я могу пробежаться по массиву и сделав проверку по ключу(имени поля) и тексту ошибке и поменять текст ошибки, только я не уверен что это лучший способ.
А как правильно?
Правильно для твоего правила добавить текст сообщения, в твоем случае это скорее всего application/messages/comments.php
 

mstdmstd

Новичок
Файла /application/messages/comments.php у меня не было - я его создал :

PHP:
<?php return array(
	'comments.name.Model_Facility::unique_name'         => ':field XXXXXXX',
);
?>
Я так понял в нем возвращается массив и поиск производится по ключам этого массива ?

В сообщении об ошибке выводится
PHP:
The comments.name.Model_Facility::unique_name.

Я залез в /system/classes/Kohana/Validation.php и нашел что у меня срабатывает в методе errors:

PHP:
			else
			{
				// No message exists, display the path expected
				$message = "{$file}.{$field}.{$error}";
				echo '-5 <pre> $message ::'.print_r( $message, true ).'</pre><br>'; // Выводит 
"comments.name.Model_Facility::unique_name"
			}
И все равно выводит сообщение об ошибке:
PHP:
comments.name.Model_Facility::unique_name
А как правильно?
 

mstdmstd

Новичок
Спасибо, с пользовательскими ошибками разобрался.

Теперь мне надо поменять в сообщении об ошибке имя поля.
Поле в базе называется descr и сообщение выводится :
А хочется вывести сообщение "Description must not be empty" . Как это правильно сделать если опять таки чтобы вручную не менять выходной массив
PHP:
			$validation_errors_list = $validation->errors( 'comments' );
?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Допустим, это лежит в файле messages/validation.php
PHP:
<?php defined('SYSPATH') or die('No direct script access.');

return array(
    'alpha' => '":field" must contain only letters',
    'alpha_dash' => '":field" must contain only numbers, letters and dashes',
    'alpha_numeric' => '":field" must contain only letters and numbers',
    'color' => '":field" must be a color',
    'credit_card' => '":field" must be a credit card number',
    'date' => '":field" must be a date',
    'decimal' => '":field" must be a decimal with ":param2" places',
    'digit' => '":field" must be a digit',
    'email' => 'Не верный формат ":field"',
    'email_domain' => '":field" must contain a valid email domain',
    'equals' => '":field" must equal ":param2"',
    'exact_length' => '":field" must be exactly ":param2" characters long',
    'in_array' => '":field" must be one of the available options',
    'ip' => '":field" must be an ip address',
    'matches' => '":field" должен совпадать с полем ":param3"',
    'min_length' => '":field" должно быть не менее ":param2" символов',
    'max_length' => '":field" must not exceed ":param2" characters long',
    'not_empty' => 'Поле ":field" не может быть пустым',
    'numeric' => '":field" must be numeric',
    'phone' => '":field" must be a phone number',
    'range' => '":field" must be within the range of ":param2" to :param3',
    'regex' => '":field" does not match the required format',
    'url' => '":field" must be a url',
    'unique' => 'Такой ":field" уже существует',
    
);
В коде будет тогда что-то вроде:
PHP:
try { 
 $model->save();
 } catch(Validation_Exception $e)
{
     var_dump($e->errors('validation')); // имя файла с мессагами
}
 
Сверху