Еще раз про массовое присваивание....

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
alex3d
Сообщения: 19
Зарегистрирован: 2011.10.13, 13:06

Еще раз про массовое присваивание....

Сообщение alex3d »

Доброго времени суток!
Знаю, что тема обсуждалась много раз, но учитывая все прочтенные ветки и документацию составил код, который не хочет работать так, как он должен бы... :(
Проблема в следующем - у меня из формы в модель Jobposition надо передавать дополнительный атрибут "posada_input", которого НЕТ в таблице БД - т.е. как переменная:

Код: Выделить всё

<input id="Jobposition_posada_combobox" type="text" value="" name="Jobposition[posada_input]" class="ui-autocomplete-input ui-widget ui-widget-content ui-corner-left" autocomplete="off"/>
модель, "как книжка пишет" имеет дополнительный публичный атрибут, а сам атрибут добавлен в правила валидации как безопасный:

Код: Выделить всё

class Jobposition extends CActiveRecord
{
    public $posada_input; // сюда будет приходить текстовый еквивалент
    ...
public function rules()
    {
        return array(
            array('department_id, employee_id', 'required'),
            array('employee_id, vnutr_sum, posada, edu_posada, vo, education_id', 'numerical', 'integerOnly'=>true),
            array('stavka', 'numerical', 'min'=>0, 'max'=>1),
                                          array('department_id','numerical', 'integerOnly'=>true,'min'=>1,'tooSmall'=>'Значення атрибуту Відділ не може бути порожнім.'),
                                          array('date_start, date_end', 'date', 'format'=>'dd.MM.yyyy'),
                                          // !!!!!!!!!!!
                                          array('posada_input', 'length', 'max'=>255),
        );
    }
 
а теперь контроллер:

Код: Выделить всё

public function actionCreate()
    {
        $model=new Jobposition;
        if (isset($_POST['Jobposition'])) {
                                          // к моему удивлению, после ЭТОГО атрибут $model->posada_input не существует (хотя в $_POST['Jobposition'] он приходит)
            $model->attributes=$_POST['Jobposition'];
                                          // а ЕСЛИ ВОТ ТАК я его принудительно доприсваиваю то все становится как надо...
                                          $model->posada_input=$_POST['Jobposition']['posada_input'];
 
Вопрос - что я "недопонял" в массовом присваивании (с использованием собственных атрибутов модели)?
Заранее благодарен! Хочется просто разобраться, хоть и так оно работает.
HQ0
Сообщения: 182
Зарегистрирован: 2012.10.17, 17:21

Re: Еще раз про массовое присваивание....

Сообщение HQ0 »

А для posada_input поставил safe (или любой другой) валидатор?
Аватара пользователя
yiijeka
Сообщения: 3103
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: Еще раз про массовое присваивание....

Сообщение yiijeka »

// !!!!!!!!!!! он поставил же

код ваш воспроизвёл, всё работает у меня без всяких $model->posada_input=$_POST['Jobposition']['posada_input']; . т.е. после $model->attributes=$_POST['Jobposition']; у $model->posada_input присутствует.
а ЕСЛИ ВОТ ТАК я его принудительно доприсваиваю то все становится как надо...
Что становится как надо? Что у вас не получается?
alex3d
Сообщения: 19
Зарегистрирован: 2011.10.13, 13:06

Re: Еще раз про массовое присваивание....

Сообщение alex3d »

Какой ужас... :)
В попытке наочно привести здесь что выдает лог с переменными,

Код: Выделить всё

$model->attributes=$_POST['Jobposition'];
            echo Yii::trace(CVarDumper::dumpAsString($_POST['Jobposition']),'vardump');
            echo Yii::trace(CVarDumper::dumpAsString($model->attributes),'vardump');
            echo Yii::trace(CVarDumper::dumpAsString($model->posada_input),'vardump');
 
я к своему стыду увидел что хоть и в $model->attributes нет posada_input, но она доступна прямо по $model->posada_input....
Дело в том то я сразу пробовал так $model->posada_input обращаться, но не указывал правила валидации его. А потом когда добавил правило, почему-то так зациклился на $model->attributes и желании увидеть там мою переменную, что вообще забыл попробовать еще раз напрямую $model->posada_input использовать.

Короче, я заблуждался в том, что при массовом присваивании мое поле окажется в массиве $model->attributes. Спасибо что подтолкнули! :)
Аватара пользователя
S c
Сообщения: 883
Зарегистрирован: 2012.04.11, 14:46

Re: Еще раз про массовое присваивание....

Сообщение S c »

>я к своему стыду увидел что хоть и в $model->attributes нет posada_input
alex3d, $model->attributes выводит тебе только поля с модели.

Код: Выделить всё

foreach($this->getMetaData()->columns as $name=>$column)
    {
        if(property_exists($this,$name))
            $attributes[$name]=$this->$name;
        elseif($names===true && !isset($attributes[$name]))
            $attributes[$name]=null;
    }
 
но при безопасном присваивании должно нормально всё сохранять
Ответить