Не сохраняются модели при использовании redirect

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
kanstantsin
Сообщения: 4
Зарегистрирован: 2014.02.25, 11:24

Не сохраняются модели при использовании redirect

Сообщение kanstantsin » 2014.03.14, 23:30

Добрый день.

Никак не могу понять, почему не сохраняется модель.
Я сгенерировал с помощью gii модели таблиц и crud.

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

if ($model->save()) {
    $this->redirect(array('view', 'id' => $model->id), false);
}
Проблема в том, что после редиректе на страницу просмотра модель оказывается несохранённой.
НО! (прямо перед написанием поста обнаружил) Если выставить параметр $terminate = false:

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

$this->redirect(array('view', 'id' => $model->id), false); 
то всё сохраняется нормально.

Но вопрос всё равно остаётся. Почему не срабатывает сохранение модели?

Спасибо.

Странник
Сообщения: 274
Зарегистрирован: 2013.04.08, 10:35
Откуда: Нижний Новгород

Re: Не сохраняются модели при использовании redirect

Сообщение Странник » 2014.03.15, 13:37

Включите логи и посмотрите.
Или форму и модель выложите.

kanstantsin
Сообщения: 4
Зарегистрирован: 2014.02.25, 11:24

Re: Не сохраняются модели при использовании redirect

Сообщение kanstantsin » 2014.03.22, 18:23

Оу, думал уже никто не ответит :|
Т.е. включить логи? Те, что внизу страницы? Ведь если не перенаправлять страницу страницу с аттрибутом termanate=true, то всё сохраняется.

Вот сама модель (одна из, т.к. это касается всех моделей):

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

<?php

/**
 * This is the model class for table "project_stage_report".
 *
 * The followings are the available columns in table 'project_stage_report':
 * @property integer $id
 * @property integer $project_stage_id
 * @property string $description
 *
 * The followings are the available model relations:
 * @property ProjectStage $projectStage
 */
class ProjectStageReport extends ActiveRecord
{
    public function tableName()
    {
        return 'project_stage_report';
    }

    public function rules()
    {
        return array(
            array('project_stage_id, description', 'required'),
            array('project_stage_id', 'numerical', 'integerOnly' => true),
            array('description', 'length', 'max' => 45),
            array('id, project_stage_id, description', 'safe', 'on' => 'search'),
        );
    }

    public function relations()
    {
        // NOTE: you may need to adjust the relation name and the related
        // class name for the relations automatically generated below.
        return array(
            'projectStage' => array(self::BELONGS_TO, 'ProjectStage', 'project_stage_id'),
        );
    }

    public function attributeLabels()
    {
        return array(
            'id' => 'ID',
            'project_stage_id' => 'Project Stage',
            'description' => 'Description',
        );
    }

    public function search()
    {
        // @todo Please modify the following code to remove attributes that should not be searched.

        $criteria = new CDbCriteria;

        $criteria->compare('id', $this->id);
        $criteria->compare('project_stage_id', $this->project_stage_id);
        $criteria->compare('description', $this->description, true);

        return new CActiveDataProvider($this, array(
            'criteria' => $criteria,
        ));
    }

    public static function model($className = __CLASS__)
    {
        return parent::model($className);
    }
}
Вот часть контроллера для редактирования, например:

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

public function actionUpdate($id)
    {
        $model = $this->loadModel($id);

        $this->performAjaxValidation($model);

        if (isset($_POST['ProjectStageReport'])) {
            $model->attributes = $_POST['ProjectStageReport'];
            if ($model->save()) {
                $this->redirect(array('view', 'id' => $model->id));
            }
        }

        $this->render('update', array(
            'model' => $model,
        ));
    }
Вот сама форма:

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

<div class="form">

    <?php $form = $this->beginWidget('CActiveForm', array(
        'id' => 'project-stage-report-form',
        'enableAjaxValidation' => true,
        'enableClientValidation' => true,
        'clientOptions' => array(
            'validateOnSubmit' => true,
        ),
        'focus' => array($model, 'login'),
    )); ?>

    <p class="note">Fields with <span class="required">*</span> are required.
    </p>

    <?php echo $form->errorSummary($model); ?>

    <div class="row">
        <?php echo $form->labelEx($model, 'description'); ?>
        <?php echo $form->textField($model, 'description', array('size' => 45, 'maxlength' => 45)); ?>
        <?php echo $form->error($model, 'description'); ?>
    </div>

    <div class="row buttons">
        <?php echo CHtml::submitButton(Yii::t('app', $model->isNewRecord ? 'Create' : 'Save')); ?>
    </div>

    <?php $this->endWidget(); ?>

</div><!-- form -->
Ещё есть прослойка ActiveRecord, но файл, можно сказать пустой:

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

class ActiveRecord extends CActiveRecord
{
    const SCENARIO_CREATE = 'insert';
    const SCENARIO_UPDATE = 'update';
    const SCENARIO_SEARCH = "search";

    public static function model($className = __CLASS__)
    {
        return parent::model($className);
    }
}
Ну и сам конфиг:

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

'db' => array(
            'connectionString' => 'mysql:host=localhost;dbname=docs',
            'emulatePrepare' => true,
            'username' => 'root',
            'password' => 'root',
            'charset' => 'utf8',
        ),

Stas
Сообщения: 441
Зарегистрирован: 2011.11.29, 16:00

Re: Не сохраняются модели при использовании redirect

Сообщение Stas » 2014.03.22, 18:46

$model->save(false)
где-то не проходит валидация

ApJIeKuHo
Сообщения: 191
Зарегистрирован: 2011.09.28, 11:21

Re: Не сохраняются модели при использовании redirect

Сообщение ApJIeKuHo » 2014.03.22, 23:07

по идее если валидация не проходит - перенаправления не должно быть
Стучитесь да откроется Вам, Молитесь да услышаны будете!
P.S.: Yii Jabber Conference: yii@conference.jabber.ru

kanstantsin
Сообщения: 4
Зарегистрирован: 2014.02.25, 11:24

Re: Не сохраняются модели при использовании redirect

Сообщение kanstantsin » 2014.03.23, 00:44

Stas, валидация проходит (редиректит же).
Для полной уверенности сделал $model->save(false) - тоже не сохранилось.

Кстати! Только сейчас обратил внимание.
После сохранения записи (я имею в виду добавление) автоинкремент в базе срабатывает.
Т.е. редиректит на страницу: /projectStageReport/view/id/12
Если ещё раз попытаться создать запись: /projectStageReport/view/id/13

kanstantsin
Сообщения: 4
Зарегистрирован: 2014.02.25, 11:24

Re: Не сохраняются модели при использовании redirect

Сообщение kanstantsin » 2014.03.23, 00:51

А ларчик просто открывался...

Проблема была в преждевременной оптимизации: использование транзакций в переопределённом CController. Добавил по какому-то из советов "на потом" и забыл.

Спасибо за внимание:)

Ответить