Обновление записи (Релиционная AR)

пока писал пост сам нашел решение (так часто бывает, по крайней мере у меня :-)) )

Но все же уточню правильно ли я понимаю что

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

в function rules() ?? при условии что функция safeAttr…  в моделе не определена… ?

Спасибо.

Нет. Если safeAttributes не определено, то массовове присвоение будет присваивать все элементы.

rules не как не влияет на массовое присваивание. в нем просто описаны правила валидации для элементов.

а вот safeAttributes содержит в себе список элементов которые МОГУТ быть перезаписаны через мас присваивание. если не используете safeAttributes  - тогда могут быть присвоины все переменные, но такой подход я крайне не рекомендую.

Не то что бы я против :slight_smile: просто у меня так не работае, только когда я определяю поля правилами тогда в них попадает юзер инпут

Я проверил не раз уже…

Причем код генерировался самим фреймворком.

Т.е. запись сохраняется все верно, однако из поста присваиваются только те поля которые есть в правилах.

причем в автогенерированном коде в ф-ции рулес есть комментарий

// NOTE: you should only define rules for those attributes that

// will receive user inputs.

Я понимаю что я не такой матерый в этом фреймворке, но  я откровенно пытаюсь понять где правда…

Болле того Вы попробуйте сгенерить на автомате для какой нить таблицы модель и контроллер

и посмотрите какие методы есть в моделе и как  происходит сохранение изменение в контроллере…

Quote

Нет. Если safeAttributes не определено, то массовове присвоение будет присваивать все элементы.

Это не так. Если safeAttributes() не определена, то массовое присвоение будет работать только в отношение всех полей таблицы. Свойства класса тоже могут быть атрибутами модели. ИХ НУЖНО прописывать в safeAttributes() отдельно. Как показывает good practice, где-то так:



class ARModel extends ActiveRecord


{


    public $property;





    public safeAttributes()


    {


        return array(


            parent::safeAttributes(), 'property'


        );


    }


}


А Вы попробуйте закомментировать у себя функцию rules

и оставить только safeAttributes ???

у меня туда юзерские данные не попадают

и об это свидельствует и вар дамр, и содержание самой таблицы…

Я бы хотел думать что где то мой косяк,  но я вроде пользуюсь с генерированным кодом …

Пожалуйста попробуйте у себя, воспроизвести мою ситуацию…

Попробовали. Единственный эффект - исчезли звездочки у полей, которые были обязательными. Запись успешно вставляется в БД, и это ожидаемо, потому что класс CModel содержит функцию rules(), которая возвращает пустой массив, так что никаких правил и ограничений, которые могут препятствовать вставке, нет.

Может выложите неработающий код модели и экшена?

Quote

Попробовали. Единственный эффект - исчезли звездочки у полей, которые были обязательными. Запись успешно вставляется в БД, и это ожидаемо, потому что класс CModel содержит функцию rules(), которая возвращает пустой массив, так что никаких правил и ограничений, которые могут препятствовать вставке, нет.

Может выложите неработающий код модели и экшена?

пожалуйста.

В модели у меня есть safeAttr…

однако ф-ция rules пустая, и он мне все поля ставит НУЛАями

Может быть дело в версии фреймворка ?я ее с свна дергал… а ?

или обновиться до 1.0.7 ?

Вы знаете поставив аптану начав дебаг

Я наткнулся вот на эту функцию

	public function getSafeAttributeNames()


	{


		$attributes=array();


		$unsafe=array();


		foreach($this->getValidators() as $validator)


		{


			if($validator instanceof CUnsafeValidator)


			{


				foreach($validator->attributes as $name)


					$unsafe[]=$name;


			}


			else


			{


				foreach($validator->attributes as $name)


					$attributes[$name]=true;


			}


		}





		foreach($unsafe as $name)


			unset($attributes[$name]);


		return array_keys($attributes);


	}


	}

что в файле CModel.php

а вызывается она из этого же файла

из функции

public function setAttributes($values,$safeOnly=true)

вот в этой строчке

$attributes=array_flip($safeOnly ? $this->getSafeAttributeNames() : $this->attributeNames());

423я строчка

так вот до вызова функции в attributes бфл полный набор данных

а после выхова этой функции там пустой массив

а потом далее

здесь же

foreach($values as $name=>$value)


		{


			if(isset($attributes[$name]))


				$this->$name=$value;


		}

а т.к. в attributes пусто то и иссет не проходит и ничего не присваивается …

вот так вот …

Хотите верьте, хотите - нет, но я проверил, и у меня всё работает ;D Причем пробовал многие вариации.

Насчет getSafeAttributeNames(). У меня в CModel код абсолютно другой ??? Обновиться до 1.0.7 конечно следует. Может дело действительно в версии? Хотя как-то всё сомнительно.

Удалите полностью метод rules из модели.

Удаление метода проблему не решило.

Переход до версии 1.0.7 решил проблему теперь работает как описано в документации :slight_smile:

ну а вообще наверно я не внимателен был

в секции для скачки черным по белому написано

WARNING: Unreleased source code in SVN may contain known bugs and are subject to changes without prior notice.

а так всем спасибо! было приятно что здесь есть толковое рускоговорящее сообщество, теперь я один из Вас! :slight_smile: ;D (в хорошем смысле конечно)

а так Yii мне крайне нравится :-)…

ЗЫ - хочу майку  с лого Yii )))

Quote

ЗЫ - хочу майку  с лого Yii )))

а это идея ) надо заказать будет :)

В продолжение оффтопа… и мне, и мне!)

Правда название фреймфорка в рускоязычном призношении,  может трактоваться не однозначно :-)… но это уже совсем другая история…

чего не однозначно? Yii == "Ыыыы" xD