Yii Framework Forum

CRUD hecho con gii no inserta


(Claudio González) #1

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


(Eloy Gonzalez) #2

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,
    ]);

(Claudio González) #3

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.


(Eloy Gonzalez) #4

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

(Juan Carlos Reyes Suazo) #5

Puedes publicar el modelo por favor?


(Claudio González) #6

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’,

        ],
    ];
}

}


(Eloy Gonzalez) #7

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.


(Claudio González) #8

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’,

        ],
    ];
}

}


(Eloy Gonzalez) #9

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


(Claudio González) #10

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.


(Eloy Gonzalez) #11

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.

(Claudio González) #12

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


(Rahif) #13

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();

(Claudio González) #14

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


(Juan Carlos Reyes Suazo) #15

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


(Claudio González) #16

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.