MyCloud
(Idarvel)
August 11, 2010, 7:28pm
1
Здраствуйте.
Я новичок, поэтому не сочтите за глупость мои вопросы.
Я пишу скрипт гостевой(точнее не скрипт а гостевая лишь часть) и буквально встал на одном месте.
Я не все данные которые нужно занести в бд передаю в 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
someone
(198506)
August 12, 2010, 4:45am
2
Проверь контроллер GuestController.php на accessControl(), надо чтобы create был доступен твоей роли
Небезопасные аттрибуты лучше присваивать в методах beforeSave() у модели:
вот пример:
public function beforeSave()
{
if($this->isNewRecord){
$this->created = time();
...
}
return parent::beforeSave();
}
, либо используя поведения, как пример TimestampBehaviour (в extensions такой есть).
MyCloud
(Idarvel)
August 12, 2010, 6:22am
3
Спасибо понял насчет атрибутов.
Вот что связанное с доступом нашел в контроллере:
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 запрос к базе проходит и запись создается, но без тех небезопасных атрибутов.
MyCloud
(Idarvel)
August 12, 2010, 7:39am
4
Сделал как вы советовали и появилась новая ошибка.
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: }
someone
(198506)
August 12, 2010, 8:41am
5
Приведи полный код модели и экшна контроллера.
по 403-ой ошибке - работаете как авторизованный пользователь?
MyCloud
(Idarvel)
August 12, 2010, 8:45am
6
Убрал снова в контроллер все данные.
Вроде норм стало работать.
Появились только еще несколько вопросов.
Я создал свое расширение в папке 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, на статические ссылки?
MyCloud
(Idarvel)
August 12, 2010, 11:13am
7
Проблема решена.
В компонентах не надо прописывать было Ip.