CRUD hecho con gii no inserta

Hola que tal, me pueden ayudar por favor.

Tengo varias tablas en un sistema, y cree los CRUD con GII de yii2, posteriormente los ajusté a mis necesidades, pero tengo uno que lo he creado en 2 instancias y sigue sin insertar los datos en la tabla.

No se que puede ser?

La vista: -form.php
<?php

use yii\helpers\Html;
use yii\widgets\ActiveForm;
use yii\widgets\MaskedInput;
use janisto\timepicker\TimePicker;

/* @var $this yii\web\View /
/
@var $model app\models\Mudanzas /
/
@var $form yii\widgets\ActiveForm */
?>

<?php $form = ActiveForm::begin(); ?>

<?= $form->field($model, 'unidad_id')->textInput() ?>

<?= $form->field($model, 'torre')->textInput(['maxlength' => true]) ?>

<?= $form->field($model, 'rut')->textInput(['maxlength' => true])->widget(MaskedInput::className(), 
        [
            'mask'          => '*9.999.999-*',
        ]
    ); 
?>

<?= $form->field($model, 'patente')->textInput(['maxlength' => true]) ?>

<?= $form->field($model, 'conductor')->textInput(['maxlength' => true]) ?>

<?= $form->field($model, 'fecha')->widget(TimePicker::className(), 
    [
        'language' => 'es',
        'mode' => 'date', //time, datetime
        'clientOptions'=>
        [
            'dateFormat' => 'yy-mm-dd',
            //'timeFormat' => 'HH:mm:ss',
            'showSecond' => true,
        ]
    ]); 
?>

<?= $form->field($model, 'hora_llegada')->widget(TimePicker::className(), 
    [
        'language' => 'es',
        'mode' => 'time',
        'clientOptions'=>
        [
            //'dateFormat' => 'yy-mm-dd',
            'timeFormat' => 'HH:mm:ss',
            'showSecond' => true,
        ]
    ]); 
?>

<?= $form->field($model, 'hora_salida')->widget(TimePicker::className(), 
    [
        'language' => 'es',
        'mode' => 'time',
        'clientOptions'=>
        [
            //'dateFormat' => 'yy-mm-dd',
            'timeFormat' => 'HH:mm:ss',
            'showSecond' => true,
        ]
    ]); 
?>
<?= $form->field($model, 'nota')->textarea(['rows' => 6]) ?>

<div class="form-group">
    <?= Html::submitButton('Guardar', ['class' => 'btn btn-success']) ?>
</div>

<?php ActiveForm::end(); ?>
esta es laactionCreate() public function actionCreate() { $model = new Mudanzas();
    if ($model->load(Yii::$app->request->post())) {

        if ( $model->save()) {
            $this->msgFlashSuccessCreate($model);
        } else {
            $this->msgFlashErrorCreate($model);
        }
        return $this->redirect(['index']);
    } else {
        return $this->render('create', [
            'model' => $model,
        ]);
    }
}

Tengo otras actioCreate igual que esta y las otras funcionan bien.

En el caso especifico muestra el msgFlasErrorCreate() y el mensaje es No se ha podido guardar el registro.

Me pueden ayudar por favor.

Un cordial saludo

Hola @Cgspc

Intenta revisar las reglas de validacion del modelo para ver si se cumplen todas

Has debug a las funciones para ver si entran en esas condicionales

Yii::$app->request->post();
$model->validate();
$model->save();

En caso que sea verdadero, el framework te guardará los datos en su tabla correspndiente, de lo contrario te mostrará el error.

Intenta con este código

if($model->load(Yii::$app->request->post()) && $model->validate())
{
    if($model->save())
    {
         Yii::$app->session->setFlash('success', 'Exito al registrar');
         return $this->;redirect(['index']);
    }
    else
    {
        Yii::$app->session->setFlash('danger', 'Error al registrar');
        return $this->;redirect(['index']);
    }
}

return $this->render('create', [
        'model' => $model,
    ]);
1 Like

Gracias Eloy, por tu respuesta.

Modifique el código que recomendaste, y no hizo nada.

No se como depurar el código, me puedes indicar como hacerlo, por favor.

Claro, puedes usar la funcion nativa de PHP

var_dump();  //depura la variable o función 
die();  // para detener el proceso de ejecución de PHP hasta este punto

Puedes publicar el modelo por favor?

Gracias Eloy, Donde pongo el var_dump( y que pongo aqui)

Gracias Juan Carlos, este es el modelo:
<?php

namespace app\models;

use Yii;
use yii\db\ActiveRecord;

/**

  • This is the model class for table “mudanzas”.

  • @property int $id

  • @property int $unidad_id

  • @property string $torre

  • @property string $rut

  • @property string $patente

  • @property string $conductor

  • @property string $fecha

  • @property string $hora_llegada

  • @property string $hora_salida

  • @property string $nota

  • @property string $created_at

  • @property string $updated_at

  • @property int $created_by

  • @property int $updated_by
    /
    class Mudanzas extends MyActiveRecord
    {
    /
    *

    • {@inheritdoc}
      */
      public static function tableName()
      {
      return ‘mudanzas’;
      }

    /**

    • {@inheritdoc}
      */
      public function rules()
      {
      return [
      [[‘unidad_id’, ‘torre’, ‘rut’, ‘patente’, ‘conductor’, ‘fecha’, ‘hora_llegada’, ‘created_at’, ‘updated_at’, ‘created_by’, ‘updated_by’], ‘required’],
      [[‘unidad_id’, ‘created_by’, ‘updated_by’], ‘integer’],
      [[‘fecha’, ‘hora_llegada’, ‘hora_salida’, ‘created_at’, ‘updated_at’], ‘safe’],
      [[‘nota’], ‘string’],
      [[‘torre’], ‘string’, ‘max’ => 1],
      [[‘rut’], ‘string’, ‘max’ => 12],
      [[‘patente’], ‘string’, ‘max’ => 10],
      [[‘conductor’], ‘string’, ‘max’ => 50],
      ];
      }

    /**

    • {@inheritdoc}
      */
      public function attributeLabels()
      {
      return [
      ‘id’ => ‘ID’,
      ‘unidad_id’ => ‘Unidad’,
      ‘torre’ => ‘Torre’,
      ‘rut’ => ‘Rut’,
      ‘patente’ => ‘Patente’,
      ‘conductor’ => ‘Conductor’,
      ‘fecha’ => ‘Fecha’,
      ‘hora_llegada’ => ‘Hora Llegada’,
      ‘hora_salida’ => ‘Hora Salida’,
      ‘nota’ => ‘Nota’,
      ‘created_at’ => ‘Creado el’,
      ‘updated_at’ => ‘Modificado el’,
      ‘created_by’ => ‘Creado por’,
      ‘updated_by’ => ‘Modificado por’,
      ];
      }
      }
      y este es MyActiveRecord
    <?php

namespace app\models;

use Yii;
use yii\behaviors\TimestampBehavior;
use yii\db\ActiveRecord;
use yii\db\Expression;
use yii\behaviors\BlameableBehavior;

/**

  • Modelo con la clase MiActiveRecor
  • Metodo Behaviors par toda la aplicación
    */

class MyActiveRecord extends ActiveRecord{
public function Behaviors()
{
return [
‘timestamp’ => [
‘class’ => TimestampBehavior::className(),
‘attributes’ => [
ActiveRecord::EVENT_BEFORE_INSERT => [‘created_at’, ‘updated_at’],
ActiveRecord::EVENT_BEFORE_UPDATE => [‘updated_at’]
],
‘value’ => new Expression(‘NOW()’),
],
‘blameable’ => [
‘class’ => BlameableBehavior::className(),
‘createdByAttribute’ => ‘created_by’,
‘updatedByAttribute’ => ‘updated_by’,

        ],
    ];
}

}

Esos campos según tu modelo son requeridos y en el formulario no están, debes incluirlos o usar el evento EVENT_BEFORE_VALIDATE para setear esos campos con valores de tipo enteros.

Los campos ‘created_by’, ‘updated_by’
Están agregados en MyAciveRecord,
public function Behaviors ()
{
return [
‘timestamp’ => [
‘class’ => TimestampBehavior :: className (),
‘attributes’ => [
ActiveRecord :: EVENT_BEFORE_INSERT => [‘created_at’, 'updated_at ‘],
ActiveRecord :: EVENT_BEFORE_UPDATE => [’ updated_at ']
],
’ value ‘=> new Expression (’ NOW () '),
],
’ blameable '=> [
’ class '=> BlameableBehavior :: className () ,
‘createdByAttribute’ => ‘created_by’,
‘updatedByAttribute’ => ‘updated_by’,

        ],
    ];
}

}

Claro amigo @Cgspc

Está bien lo que tienes en el código pero el evento EVENT_BEFORE_VALIDATE se lanza antes del EVENT_BEFORE_INSERT

para que pueda insertar los datos escritos en tu formulario YII los valida antes de hacer la inserción

Ok, te cuento, tengo varios modelos mas que funcionan de la misma forma ya que MyActiveRecord, lo llamo en todos ellos, y los demás si funcionan y este es el único que no inserta los datos, es por ello la duda que tengo, y lo que me hizo poner este post, porque no comprendo el porque sucede siendo que hay otros iguales que funcionan.

Si es así entonces ¿no será una restricción Foreign Key que no te permite realizar la inserción?

Porque es bien raro, sobre lo del var_dump()

has esto en el controller y vas viendo.

var_dump($model);
die();

// Fijate si estan seteados los valores en las propiedades de tu clase 
modelo, si es así quita el código anterior y coloca este y este ultimo debe 
devolverte un boolean

var_dump($model->validate());
die(); 

// Si se devuelve verdadero le usa
var_dump($model->save());
die();

// Este ultimo debe devolverte un boolean tambien, true si se realizó la 
inserción y false caso contrario.
1 Like

Gracias Eloy
Tus respuestas me han ayudado mucho, lo que hice fue modificar la yabla de la base de datos, para que aceptara datos nulos en created_by y updated_by, que era un error ya que los datos se ingresan gracias al Behaviors() y las funciones EVENT_BEFORE_INSERT y EVENT_BEFORE_UPDATE que son las encargadas de insertar los datos.

Muchas Gracias

1 Like

Al validar un modelo si hay errores se pueden ver todos los atributos que dan error y que error da cada uno de ellos. Haz lo siguiente:

$model->validate();
var_dump($model->getErrors());
die();

Gracias rahif, lo anoté para que no se me olvide, y ya se como debo hacer cuando tenga inconvenientes para insertar dastos.

Lamento no haber podido ayudar ni con los consejos para debuguear. Le había perdido el rastro a este post. @Cgspc

Gracias por la preocupación, Lo solucione, pero la verdad en este momento, no recuerdo que era, o lo que hice, para haber posteado la solución, para otros que pudieran tener el mismo inconveniente.