Русскоязычный форум, посвященный фреймворку Kohana
http://forum.kohanaframework.su/

Валидация комментариев
http://forum.kohanaframework.su/viewtopic.php?f=21&t=254
Страница 1 из 3

Автор:  admin [ 22 июл 2012, 21:23 ]
Заголовок сообщения:  Валидация комментариев

В уроке "Валидация комментариев" мы на практике реализуем проверку пользовательских комментариев на соответствие правилам валидации.
Урок находится по ссылке:
http://kohanaframework.su/advanced/comments_validation

Автор:  prickle [ 17 сен 2012, 14:05 ]
Заголовок сообщения:  Re: Валидация комментариев

Здравствуйте. Уже беспокоила с вопросом по валидации. Так и не разобралась.
Задача: ввести в таблицу бд данные заказчика. 5полей (customer_id, fio, adres, tels, info). Ввод информации происходит, но ПРОБЛЕМА с валидацией:
После обработки формы с пустым значением fio данные в форму не попадаю, но и ошибка не выводится.
Листинг модель, конструктор, вид, файл с ошибками ->
ps. в программировании не сильна. самоучка чайник. проект оч нужен. и не судите строго пожалуйста

модель
Код:
<?php defined('SYSPATH') or die('No direct script access.'); 
{
    Class Model_Newcustomer extends Model {
   
    protected $_tableCustomer = 'customer';
 
    public function get_customer($customer_id)
    {
        $query = DB::select('fio', 'adres', 'tels', 'info')
                ->from($this->_tableCustomer)
                ->where('customer_id', '=', $customer_id)
                ->execute()
                ->as_array();
 
        if($query)
            return $query;
        else
            return array();                       
    }
 
   //создание нового заказчика
    public function create_customer($customer_id, $fio, $adres, $tels, $info)
    {
        DB::insert($this->_tableCustomer, array('customer_id', 'fio', 'adres', 'tels', 'info'))
            ->values(array($customer_id, $fio, $adres, $tels, $info))
            ->execute();                       
    }
}   
   
}


Контроллер:
Код:
<?php defined('SYSPATH') or die('No direct script access.');

class Controller_Newcustomer extends Controller_Template {

   public $template = 'basecus';   //загрузка базового вида
   
   public function action_index()
   {      
       if($this->request->is_initial())
            Request::initial()->redirect(URL::site('/newcustomer'));
       
      
        $customer_id = $this->request->param('id');
 
        $content = View::factory('newcustomerview')
                    ->bind('customers', $customers);
      
      
        if($_POST)
   {
      
      $_POST = Arr::map('trim', $_POST);   
      
      $post = Validation::factory($_POST);
      $post -> rule('fio', 'not_empty');      
       
   
    if($post -> check())
      {
    Model::factory('Newcustomer')->create_customer($customer_id, $_POST['fio'], $_POST['adres'], $_POST['tels'], $_POST['info']);
 
        $uri = Request::detect_uri('/newcustomer');
        Request::initial()->redirect($uri);            
    
      }
    else
       {
      $errors = $post -> errors('customer');
      }

   }
        $customers = Model::factory('Newcustomer')->get_customer($customer_id);
        $this->template->content = $content;
   
}
}


Файл с ошибками (\application\messages\):
Код:
<?php
 
return array(
   'fio' => array(
      'not_empty' => 'Вы не ввели имя заказчика',
),   );

Автор:  Sergey [ 17 сен 2012, 16:31 ]
Заголовок сообщения:  Re: Валидация комментариев

А где проверка (Validation Rules)?

Автор:  prickle [ 17 сен 2012, 16:36 ]
Заголовок сообщения:  Re: Валидация комментариев

в контроллере. вроде все есть. ну во всяком случае за основу взят полностью урок http://kohanaframework.su/advanced/comments_validation

Автор:  prickle [ 17 сен 2012, 16:47 ]
Заголовок сообщения:  Re: Валидация комментариев

с денисом васильевичев мы сошлись на том, что скорее всего что-то уж с выводом ошибки. так как кохана свои ошибки не выводит, страница обновляется, в базу ничего левого не прописывается.
простите мне моё невежество, если можно отвечайте более развёрнуто.

Автор:  Sergey [ 17 сен 2012, 17:41 ]
Заголовок сообщения:  Re: Валидация комментариев

prickle писал(а):
в контроллере. вроде все есть. ну во всяком случае за основу взят полностью урок http://kohanaframework.su/advanced/comments_validation



Код:
 $post = Validation::factory($_POST);


Ну и где правила?
У вас rules не описаны ни в модели ни в контролёре. На что должна "ругаться" валидация?

Автор:  prickle [ 17 сен 2012, 17:55 ]
Заголовок сообщения:  Re: Валидация комментариев

к стати обращала внимание что многие прописывают в модели такое. как раз сейчас этим занимаюсь. но толку 0.
Код:
 Class Model_Newcustomer extends Model {
   
    protected $_tableCustomer = 'customer';
 
    //добавление нового заказчика
 
    public function get_customer($customer_id)
    {
        $query = DB::select('fio', 'adres', 'tels', 'info')
                ->from($this->_tableCustomer)
                ->where('customer_id', '=', $customer_id)
                ->execute()
                ->as_array();
 
        if($query)
            return $query;
        else
            return array();                       
    }
 
    /**
     * Create new customer
     */
    public function create_customer($customer_id, $fio, $adres, $tels, $info)
    {
        DB::insert($this->_tableCustomer, array('customer_id', 'fio', 'adres', 'tels', 'info'))
            ->values(array($customer_id, $fio, $adres, $tels, $info))
            ->execute();                       
    }
   
   public function rules()   //все равно не работает
      {
    return array(
        'fio' => 'not_empty'
           
        );
      }
   //не обращайте внгимания эт я с уникальносью параллельно пытаюсь что-то изобразить
   public static function unique_fio($fio)
      {
        // Проверка, существет ли уже в базе данных
      
        // указанное им
      
        return ! DB::select(array(DB::expr('COUNT(fio)'), 'total'))
      
                      ->from('customer')
      
                      ->where('fio', '=', $fio)
      
                      ->execute()
      
                      ->get('total');
      }
}   
   
}

Автор:  Sergey [ 17 сен 2012, 20:27 ]
Заголовок сообщения:  Re: Валидация комментариев

Попробуйте в контролёре так:

Код:
$post = Validation::factory($_POST)
          ->rule('fio','not_empty');


И потом, в форме представления действительно есть поле fio?

Посмотреть что вам приходит постом можно например так:

Код:
die(Debug::vars($_POST));exit;

Автор:  evgentus [ 18 сен 2012, 09:05 ]
Заголовок сообщения:  Re: Валидация комментариев

Sergey писал(а):

Посмотреть что вам приходит постом можно например так:

Код:
die(Debug::vars($_POST));exit;


А зачем после die() exit() ?
Ведь они оба прекращают дальнейшее выполнение программы. Разница только в том, что die() выводит текст, а exit() нет.

Или я что то путаю?

Автор:  AmberLEX [ 18 сен 2012, 09:54 ]
Заголовок сообщения:  Re: Валидация комментариев

А почему вы делаете не через ORM?
Если через ORM, то в модели можно написать правила типа таких
Код:

public function rules
()
{
    return array(
        'title' => array(
            array('not_empty'),
        ),
    );
}

public function labels()
{
    return array(
        'title' => 'Название',
    );
}

public function filters()
{
    return array(
        TRUE => array(
            array('trim'),
        ),
        'title' => array(
            array('strip_tags'),
        ),
    );
}
 

Если так как вы делаете, то примерно так
Код:
    public function action_add()
    {
        if ($this->request->method() == HTTP_Request::POST)
        {
            $post = Validation::factory($_POST)
                ->label('title', 'Название')
                ->rule('title', 'not_empty');

            if ($post->check())
            {
                DB::insert('news', array('title'))
                    ->values(array($post['title']))
                    ->execute();
            }
            else
                $errors 
= $post->errors('news');
        }

        // Шаблон
        $this->block_center = View::factory('v_add')->bind('errors', $errors);
    }
 
И не if ($_POST) как у вас, а т.к. я написал, потомо, что в этом примере вы в него не попадете, если не заполните title
view/v_add.php
Код:
echo Form::open(Request::current());

echo Form::input('title');
echo Debug::vars($errors);
echo Form::submit('add', 'save');

echo Form::close();

В общем этот пример рабочий, подстраивайте под себя

Страница 1 из 3 Часовой пояс: UTC + 4 часа [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/