Yii Framework Forum: форма - валидация данных - база данных - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

форма - валидация данных - база данных Rate Topic: -----

#1 User is offline   carat 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 60
  • Joined: 12-February 09

Posted 13 March 2009 - 08:29 AM

вот такой вопрос назрел. есть ли возможность
в модели "перехватывать" данные формы для
коррекции, например для текстовых полей
использовать htmlspecialchars(),
для последующего сохранения в базе данных?

в модели существуют 2 экшана: actionAdd (insert),
actionEdit (update). хотелось бы создать общее
правило для них.
1.    получили данные (POST)
2.    валидация
2.1. если введено неверно - сообщение пользователю
      над формой ввода
2.2 введено верно - сохраняем в базу  :)
0

#2 User is offline   xomaa 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 82
  • Joined: 17-January 09

Posted 13 March 2009 - 09:28 AM

В модели есть методы:
beforeValidate() и
beforeSave()
- можешь их использовать.......
0

#3 User is offline   xomaa 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 82
  • Joined: 17-January 09

Posted 13 March 2009 - 09:30 AM

Quote

в модели существуют 2 экшана: actionAdd (insert),

actionEdit (update). хотелось бы создать общее

правило для них.


или ты имел ввиду контроллер (судя по action*)???
0

#4 User is offline   carat 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 60
  • Joined: 12-February 09

Posted 13 March 2009 - 09:47 AM

Quote

или ты имел ввиду контроллер (судя по action*)???


- контроллер
0

#5 User is offline   carat 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 60
  • Joined: 12-February 09

Posted 13 March 2009 - 10:26 AM

Quote

В модели есть методы: beforeValidate() и beforeSave()


- здорово, получилось.
  как теперь пометить некорректные данные ошибкой и
  вывести на экран вместе с формой ввода?

в модели есть типа $this->addError('password','Incorrect password.') .
как после валидации даных в конролере вывести ERROR и форму ввода?
0

#6 User is offline   creocoder 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 198
  • Joined: 09-March 09
  • Location:*.php

Posted 13 March 2009 - 11:34 PM

Quote

Quote

В модели есть методы: beforeValidate() и beforeSave()




- здорово, получилось.

  как теперь пометить некорректные данные ошибкой и

  вывести на экран вместе с формой ввода?



в модели есть типа $this->addError('password','Incorrect password.') .

как после валидации даных в конролере вывести ERROR и форму ввода?


Это можно сделать в представлении:
<?php echo CHtml::errorSummary($model); ?>

Попробуйте сгенерировать crud для своей модели в консольной утилите yiic, проанализируйте представления, посмотрите как это рекомендует делать автор фреймворка.
0

#7 User is offline   carat 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 60
  • Joined: 12-February 09

Posted 14 March 2009 - 01:59 PM

что бы заработал механизм форма - валидация данных - база данных делаем так:

1. в модели
[tt]    protected function beforeValidate($on)
    {
        $result = true;
        if (isset($_POST['News']['dat'])) {  //дата вводится в формате "dd.mm.yyyy"
            list($d['dd'], $d['mm'], $d['yy']) = explode('.', $_POST['News']['dat']);
            if (checkdate($d['mm'], $d['dd'], $d['yy'])) {  //проверка корректности даты
                $this->dat = $d['yy'] .'-'. $d['mm'] .'-'. $d['dd'];  //переделать в фотмат mysql "yyyy-mm-dd"
            }
            else {
                $this->addError('News date','Incorrect date.');  //ОШИБКА!!!
                $result = false;
            }
        }
        return $result;
    }[/tt]

2. в контроллере
[tt]    public function actionAdd() {
        if(isset($_POST['News'])) {
            $rec = new News;
            $rec->attributes = $_POST['News'];
            $rec->save;    //тут срабатывает beforeValidate() модели
            if($rec->hasErrors()) {
                //вызвать представление и передать туда ошибку                  $this->render('form',array('errorSummary'=>CHtml::errorSummary($rec),'row'=>$_POST['News']));
                return;
            }
            $this->redirect(array('edit','id'=>$rec->id);
        }
        $this->render('form');
    }[/tt]

3. в представлении
[tt]    if (isset($errorSummary)) {
        echo $errorSummary;
    }[/tt]

Attached File(s)

  • Attached File  error.PNG (8.98K)
    Number of downloads: 18

0

#8 User is offline   creocoder 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 198
  • Joined: 09-March 09
  • Location:*.php

Posted 14 March 2009 - 08:23 PM

Quote

что бы заработал механизм форма - валидация данных - база данных делаем так:



1. в модели

[tt]    protected function beforeValidate($on)

    {

        $result = true;

        if (isset($_POST['News']['dat'])) {  //дата вводится в формате "dd.mm.yyyy"

            list($d['dd'], $d['mm'], $d['yy']) = explode('.', $_POST['News']['dat']);

            if (checkdate($d['mm'], $d['dd'], $d['yy'])) {  //проверка корректности даты

                $this->dat = $d['yy'] .'-'. $d['mm'] .'-'. $d['dd'];  //переделать в фотмат mysql "yyyy-dd-mm"

            }

            else {

                $this->addError('News date','Incorrect date.');  //ОШИБКА!!!

                $result = false;

            }

            return $result;

        }

    }[/tt]



2. в контроллере

[tt]    public function actionAdd() {

        if(isset($_POST['News'])) {

            $rec = new News;

            $rec->attributes = $_POST['News'];

            $rec->save;    //тут срабатывает beforeValidate() модели

            if($rec->hasErrors()) {

                //вызвать представление и передать туда ошибку                  $this->render('form',array('errorSummary'=>CHtml::errorSummary($rec),'row'=>$_POST['News']));

                return;

            }

            $this->redirect(array('edit','id'=>$rec->id);

        }

        $this->render('form');

    }[/tt]



3. в представлении

[tt]    if (isset($errorSummary)) {

        echo $errorSummary;

    }[/tt]


Зачем плохому людей учишь? Вот намного проще и идеологически правильней:

1. В модели:

public function rules()
{
return array(
...
array('dat','yourDataValidator'),
...
);
}

public function yourDataValidator()
{
//Здесь пишем код валидатора даты
}

А вообще есть CTypeValidator, в котором type может принимать значение date с настраиваемым форматом, так что можно даже свой валидатор не писать, а ограничиться использованием того что идет в комплекте с фреймворком.

2. В контроллере:

public function actionAdd()
{
$new=new New;
if(isset($_POST['New']))
{
$new->attributes=$_POST['New'];
if($new->save()) //ВОТ ТУТ ВАЛИДАЦИЯ, проверка $new->hasErrors() была бы лишней
$this->redirect(array('show','id'=>$new->id));
}
$this->render('create',array(
'new'=>$new,
));
}


3. В представлении:

<?php echo CHtml::errorSummary($new); ?> //В случае если есть ошибки они все тут выведутся, и не нужно вызывать в представлении условие и передавать туда лишнюю переменную $errorSummary


P.S. Метод beforeValidate в модели вообще то не для валидации предназначен. А для работы с датой есть компонент CDateFormatter, вызывается Yii::app()->dateFormatter. Он подключается фреймворком по умолчанию, а поэтому грех его не использовать  ;)
0

#9 User is offline   xomaa 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 82
  • Joined: 17-January 09

Posted 15 March 2009 - 02:50 AM

Я бы еще не стал в модели использовать обращение к массиву POST
isset($_POST['News']['dat'])


источник данных может поменяться - тогда придется переписывать и модель...


0

#10 User is offline   carat 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 60
  • Joined: 12-February 09

Posted 16 March 2009 - 03:44 PM

Quote

Зачем плохому людей учишь?

- то о чем пишешь ты годится для модели формы,
  а не для модели базы (вернее таблицы)

Quote

P.S. Метод beforeValidate в модели вообще то не для валидации предназначен. А для работы с датой есть компонент CDateFormatter, вызывается Yii::app()->dateFormatter. Он подключается фреймворком по умолчанию, а поэтому грех его не использовать  ;)

- мне не надо переделать дату в локальный языковый формат, а надо
  переделать в формат базы данных
0

#11 User is offline   creocoder 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 198
  • Joined: 09-March 09
  • Location:*.php

Posted 16 March 2009 - 08:49 PM

Quote

- то о чем пишешь ты годится для модели формы,

  а не для модели базы (вернее таблицы)

Это годится для любого типа дочерних классов CModel, в частности для CActiveRecord, CFormModel. Смотри API перед тем, как утверждать что то на 100%

Quote

- мне не надо переделать дату в локальный языковый формат, а надо

  переделать в формат базы данных

CDateFormatter позволяет производить любые манипуляции с датой методом format(), в том числе и перевод в формат БД.
0

#12 User is offline   carat 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 60
  • Joined: 12-February 09

Posted 18 March 2009 - 07:45 AM

Quote

Это годится для любого типа дочерних классов CModel, в частности для CActiveRecord, CFormModel. Смотри API перед тем, как утверждать что то на 100%

блин, документация это одно, а жись это другое.
пришли работающий пример

Quote

CDateFormatter позволяет производить любые манипуляции с датой методом format(), в том числе и перевод в формат БД.

почему именно так, разве не проще [tt]date('Y-m-d') [/tt]
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users