По какому принципу работает $model->attributes = $_POST['FormData'] в Yii?

workOnFood

Новичок
Всем доброго дня.
Разбираюсь с Yii и никак не могу понять как работает это присвоение -

PHP:
$model->attributes = $_POST['FormData'];
Смотрел в СActiveRecord и в CModel, там нет свойства attributes. Также не нашел связи с __set __get методами. Может быть плохо искал конечно, но уже башка не варит от обилия умного кода. Есть свойство _attributes да и то приватное... Если бы существовало public $attributes можно было бы предположить что поля типа $model->id являются ссылками на элементы массива attributes, а так как его нет я честно говоря теряюсь в догадках. Помогите разобраться плиз.

upd:

Я пишу небольшой пробный проектик и после изменения структуры таблицы, добавленное поле не апдейтится в CRUD. Удалось локализовать проблему до $model->attributes. Есть поле формы is_admin, в $_POST данные приходят в нужном виде, а в $model->attributes находится значение которое в данный момент находится в базе.
Вот я и пытаюсь разобраться как работает это присвоение $model->attributes = $_POST['FormData'] чтобы знать откуда начинать распутывать код. Ну же люди помогите, я знаю среди вас есть как минимум два спеца по Yii )
 

fixxxer

К.О.
Партнер клуба
не нужно быть спецом по yii чтобы понимать, что надо искать __set по иерархии наследования
 

workOnFood

Новичок
safe в рулзах стоит для этого поля?
Угу, прописал в модели все по аналогии с полями созданными при помощи gii.

не нужно быть спецом по yii чтобы понимать, что надо искать __set по иерархии наследования
Мне тоже так кажется, видимо собака зарыта в CController от которого наследуется CModel, буду копать в этом направлении.
 

Redjik

Джедай-мастер
workOnFood
1)ого Model наследуется от Component
2)Все логика присваивания находится в CActiveRecord
 

Redjik

Джедай-мастер
Благодаря тому что все расшираяется от CComponent и становится возможным механизм поведений (behaviors), когда его постигаешь - влюбляешься в yii окончательно и бесповоротно =)
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
в магическом сеттере прописано, что методы с префиксом set, например, setFoo() можно вызвать через оператор присвоения ->foo=...

куда смотреть:
1. после вызова $model->attributes = $_POST['FormData'];
сделай var_dump($model->attributes); и посмотри, присвоено ли значение.

2. раскомментируй в конфиге
'class'=>'CWebLogRoute',
и посмотри какой запрос выполняется

может, у тебя опечатка в имени поля, может, еще что-то
 

Redjik

Джедай-мастер
grigori
да у него вроде нет ошибок, он понять принцип работы стремится =)

В CActiveRecord есть свойство atributes, а в методе __set есть в начале строчка if (!$this->setAttributes($vars)===false) (пишу по памяти, сейчас не могу точно код глянуть) - вот в этом месте и происходит присвоение
 

workOnFood

Новичок
Gas

Хех, если бы прочитал статью внимательнее нашел бы ответ на свой вопрос еще вчера)

The key is $model->attributes = $_POST['Comment'];, which is deceptively simple.

In reality this is calling

$model->setAttributes( $_POST['Comment'] ); // this is an array!
grigori

Спасибо что показал на пальцах, теперь я понимаю что при присвоении $model->attributes значения в CComponent вызывается метод CModel::setAttributes() в котором и происходит присвоение свойствам(полям таблицы) значений из массива, там же осуществляется getAttributes если свойства необходимо прочитать.

Проблема обнаружилась в рулзах -
PHP:
array('id, username, password, email, is_admin', 'safe', 'on'=>'search')
Добавил строчку -

PHP:
array('id, username, password, email, is_admin', 'safe', 'on'=>'update')
и все заработало.

Всем спасибо за помощь.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
PHP:
array('id, username, password, email, is_admin', 'safe', 'on'=>'search, update')
 

workOnFood

Новичок
grigori

О, спасибо) А я сначала хотел в array их запихнуть потом сообразил что два одинаковых индекса получится и решил временно написать дважды все поля, пока руки дойдут до рулзов.
 
Сверху