Задать вопрос
nik_neman
@nik_neman
php-junior

Как в yii через форму обновить данные в БД?

Здравствуйте.
Есть 2 таблицы - первая это справочник показателей: indicator_type (id, name). Вторая для хранения значений indicator (id, indicator_type_id, value).
Нужно через форму обновлять данные в БД. Но столкнулся с проблемой вывести даже форму.
Модель Indicator создал через Gii.
В контроллере делаю так:
public function actionFilling()
    {        
        $model = Indicator::model()->findAll();
        $this->render('filling', array('model' => $model));
    }

Во вьюшке делаю вот так:
<div class="form">

    <?php
    $form = $this->beginWidget('CActiveForm');
    echo $form->errorSummary($model);
    foreach ($model as $type) {
        ?>
        <div class="row">
            <?php
            echo $form->hiddenField($model, '[' . $type->id . ']indicator_type_id');
            echo $form->textField($model, '[' . $type->id . ']value');
            ?>
        </div>
    <?php }
    ?>
    <div class="row buttons">
        <?php echo CHtml::submitButton('Отправить'); ?>
    </div>
    <?php $this->endWidget(); ?>
</div>

После всего этого получаю: Fatal error: Call to a member function hasErrors() on a non-object in Z:\home\yii.loc\www\framework\web\helpers\CHtml.php on line 2452
Как грамотно сделать форму для последующего обновления данных в БД?
Заранее спасибо.
  • Вопрос задан
  • 2472 просмотра
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
sanchezzzhak
@sanchezzzhak
Ля ля ля...
www.yiiframework.com/doc/guide/1.1/ru/form.view

Ошибка в том что вы отдаете массив моделий форме а надо 1 модель
$model = Indicator::model()->find();

www.yiiframework.com/doc/guide/1.1/ru/database.ar
Ответ написан
Комментировать
@rutrader
Возможно, проблема в том, что вы делаете выборку по всем элементам, вместо того, чтоб сделать выборку одного элемента.
find()
Ответ написан
Комментировать
olegtytarenko2
@olegtytarenko2
разработываю саты на cms PHP. Сейчас практикую yii
Не помню как в первой версии, но во второй можно сделать вот так

$model->updateAll($model->atributes, 'status = 1');


а вот есть отличный мануал который расписывает как правильно это сделать
www.yiiframework.com/doc/guide/1.1/ru/database.ar#sec-5
Ответ написан
Комментировать
nik_neman
@nik_neman Автор вопроса
php-junior
Всем спасибо за ответы.
Сумел сделать так:
Контроллер
public function actionFilling()
    {
        $model = Indicator::model()->findAll();
        if (isset($_POST['Indicator'])) {
            foreach ($_POST['Indicator'] as $type_id => $items) {
                $i = Indicator::model()->findByAttributes(array('indicator_type_id' => $type_id));
                if ($i === null) {
                    $i = new Indicator;
                }
                $i->attributes = $items;
                $i->save();
            }
        }
        $this->render('filling', array('model' => $model));
    }

Представление:
<div class="form">
    <?php
    $form = $this->beginWidget('CActiveForm');
    echo $form->errorSummary($model);
    foreach ($model as $type) {
        ?>
        <div class="row">
            <?php
              echo $form->hiddenField($type, '[' . $type->id . ']indicator_type_id');
              echo $form->textField($type, '[' . $type->id . ']value');
            ?>
        </div>
    <?php }
    ?>
    <div class="row buttons">
        <?php echo CHtml::submitButton('Отправить'); ?>
    </div>
    <?php $this->endWidget(); ?>

</div>
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы