Массив & CActiveRecord

Совсем недавно начал разбираться с Yii. Не могу побороть один момент. Подскажите - не сочтите за труд: что я делаю не так?

Есть 2 связанные модели. Operation и InvLines.

Одна операция может содержать несколько строк. Потому обработку и запись строк InvLines делаю в OperationController.

При редактировании приведенные ниже код файла /views/operation/_form.php корректно заполняет данными из связанной таблицы. Тут все работает как хотелось бы.




<?

if(is_array($model->invLines)){

	foreach($model->invLines as $enc=>$value)

	{

		?>

		<tr>

			<td><?php echo CHtml::textField("Operation[invLines][$enc][description]", $model->invLines[$enc]->description, array(size=>60)); ?></td>

			<td><?php echo CHtml::textField("Operation[invLines][$enc][quantity]", $model->invLines[$enc]->quantity, array(size=>2)); ?></td>

			<td><?php echo CHtml::dropDownList("Operation[invLines][$enc][unit_id]", $model->invLines[$enc]->unit_id, CHtml::listData(Units::model()->findAll(), 'id_unit', 'unit_name_it')); ?></td>

			<td><?php echo CHtml::textField("Operation[invLines][$enc][price]", $model->invLines[$enc]->price); ?></td>

		</tr>

		<?

	}

}

?>



Проблемы начинаются когда форма (Operation) заполнена не корректно (например не заполнено обязательное поле). В таком случае приведенный выше код не заполняет форму. В этом случае данные находятся в массиве и их нет в модели (хотя остальные данные корректно обрабатываются). Почему так происходит? Как добавить эти данные в модель?

invLines - добавлен в rules в виде:




array('invLines', 'safe')



Насколько это корректно и правильно? Как можно "скормить" массив?

Если нельзя массив, как можно описать правила в данном случае - когда не известна длинна массива?

Перефразирую вопрос: когда модель берет данные из таблицы, поскольку в связанной таблице несколько строк на строку данных основной модели то модель формирует их в виде такого массива в модели:




$model->invLines[$enc]->description;

$model->invLines[$enc]->quantity;

//.....



Но когда данные приходят из формы - они принимают вид обычного массива,

тоесть доступны таким образом:

$model->invLines[0][description];

и не доступны как в первом случае ($model->invLines[$enc]->description;)

У меня никак не получается в ручную создать структуру подобную искомой. Как это сделать?

Попробуйте для начала заглянуть вот сюда

Спасибо Nick G.но это похоже немного мимо…

В обработке табличного ввода описан случай редактирования уже имеющихся данных. С этим проблем как-раз и нет.

Может я сумбурно описал проблему - попробую немного другими словами.

Когда из главной таблицы подтягиваются данные, вместе с ними подтягиваются данные из связанной таблицы. Связь один ко многим, и доступны они таким образом


$model->invLines[$i]->description

Данные в модель связанной таблицы сохраняю таким образом:




foreach($inv_lines['description'] as $id => $value)

{

    if($id==0)

        continue;


    $invLinesModel=new invLines;

    $invLinesModel->description = $inv_lines['description'][$id];

    $invLinesModel->quantity = $inv_lines['quantity'][$id];

    $invLinesModel->unit_id = $inv_lines['unit_id'][$id];

    $invLinesModel->price = $inv_lines['price'][$id];

    $invLinesModel->operation_id = $id_operation;

    if($invLinesModel->save())

    {

    }


}

и тут проблем нет.

Проблема возникла тогда, когда данные не читаются из модели, и не пишутся нее.

Когда в форме ошибка, и надо вернуть заполненную форму.

После классического


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

в $model->attributes попадает искомый массив из формы:


Array

(

    [0] => Array

        (

            [description] => DWESC

            [quantity] => 1

            [unit_id] => 1

            [price] => 1

        )


)

Как переопределить значения чтобы можно было с ними работать как в случае с чтения из модели?


$model->invLines[$i]->description

Неужели никто с такой проблемой не сталкивался?

Разобрался. Может кому пригодится, чтобы не ломать копья как я.

Преобразование массива значений в массив объектов




foreach($_POST['Operation']['invLines'] as $i=>$value)

{

    $line = new invLines();


    $line->description = $value['description'];

    $line->quantity = $value['quantity'];

    $line->unit_id = $value['unit_id'];

    $line->price = $value['price'];

    $lines[] = $line;

}

$model->invLines = $lines;