Сбор данных и запрос к базе

Здраствуйте.

Я новичок, поэтому не сочтите за глупость мои вопросы.

Я пишу скрипт гостевой(точнее не скрипт а гостевая лишь часть) и буквально встал на одном месте.

Я не все данные которые нужно занести в бд передаю в POST.Например время создания сообщения.

Вот код контроллера GuestController




if(isset($_POST['Guest']))

		{

			$_POST['Guest']['GuestTime'] = time();

			$model->attributes=$_POST['Guest'];

			

			if($model->save())

				$this->redirect(array('view','id'=>$model->GuestId));

		}


		$this->render('create',array(

			'model'=>$model,

		));



Я как понял я правильно сделал что внес время в атрибуты.

Но вылетает ошибка 403 при попытке добавить запись.

Я думал что это из-за небезопасного атрибута, но еще пишет не прав хотя до этого все добавлялось.

Вот лог:

REQUEST_URI=/virtual/yii/demos/cms/guest/create

in D:\Server\htdocs\virtual\yii\demos\cms\protected\controllers\GuestController.php (76)

in D:\Server\htdocs\virtual\yii\demos\cms\index.php (14)

2010/08/11 23:14:14 [warning] [application] Не удалось присвоить небезопасный атрибут "GuestTime".

in D:\Server\htdocs\virtual\yii\demos\cms\protected\controllers\GuestController.php (76)

in D:\Server\htdocs\virtual\yii\demos\cms\index.php (14)

2010/08/11 23:14:14 [error] [exception.CHttpException.403] exception ‘CHttpException’ with message ‘У вас недостаточно прав для выполнения указанного действия.’ in D:\Server\htdocs\virtual\yii\framework\web\auth\CAccessControlFilter.php:153

  1. Проверь контроллер GuestController.php на accessControl(), надо чтобы create был доступен твоей роли
  • это насчет ошибки 403.
  1. Небезопасные аттрибуты лучше присваивать в методах beforeSave() у модели:

вот пример:


public function beforeSave()

{

 if($this->isNewRecord){

   $this->created = time();

   ...

 }

 return parent::beforeSave();

}



, либо используя поведения, как пример TimestampBehaviour (в extensions такой есть).

Спасибо понял насчет атрибутов.

Вот что связанное с доступом нашел в контроллере:




public function filters()

	{

		return array(

			'accessControl', // perform access control for CRUD operations

		);

	}



И вот


public function accessRules()

	{

		return array(

			array('allow',  // allow all users to perform 'index' actions

				'actions'=>array('index'),

				'users'=>array('*'),

			),

			array('allow',

				'actions'=>array('create','update','admin','delete'),

				'users'=>array('@'),

			),

			array('deny',  // deny all users

				'users'=>array('*'),

			),

		);

	}

Самое интересное что несмотря на ошибку 403 запрос к базе проходит и запись создается, но без тех небезопасных атрибутов.

Сделал как вы советовали и появилась новая ошибка.

CException

Описание

Приложение Yii может быть создано только один раз.

Исходный код

D:\Server\htdocs\virtual\yii\demos\cms\protected\models\Guest.php(104)

00092:

00093: $criteria->compare(‘GuestTime’,$this->GuestTime);

00094:

00095: return new CActiveDataProvider(get_class($this), array(

00096: ‘criteria’=>$criteria,

00097: ));

00098: }

00099:

00100: public function beforeSave()

00101: {

00102: if($this->isNewRecord){

00103: $this->GuestTime = time();

00104: $this->GuestIP = Yii::app()->sec->ip();

00105: }

00106: return parent::beforeSave();

00107: }

00108: }

Приведи полный код модели и экшна контроллера.

по 403-ой ошибке - работаете как авторизованный пользователь?

Убрал снова в контроллер все данные.

Вроде норм стало работать.

Появились только еще несколько вопросов.

Я создал свое расширение в папке extensions/sec/SecClass.php


class SecClass extends CApplicationComponent

{

    public function init()

    {

        parent::init();

    }

    

    public function ip()

    {

               $ip = $_SERVER['REMOTE_ADDR'];

                $ip = preg_replace("/[^0-9.]/", "", $ip);

        return (!empty($ip) ? $ip : '');

    }

} 

Пытаюсь использовать его, но пишет ошибку: Не определено свойство "SecClass.ip".

Использую вот как $_POST[‘1’][‘IP’] = Yii::app()->sec;

В компанентах записано так:

‘sec’=>array(

‘class’=>‘ext.sec.SecClass’,

‘ip’=>’’,

),

И еще возможно глупый вопрос, но как убрать надпись при навигации: Элементы 1—10 из 12.

И как изменить навигацию которая сейчас как я понимаю на JS, на статические ссылки?

Проблема решена.

В компонентах не надо прописывать было Ip.