TUTORIAL YII FRAMEWORK (CAPÍTULO 9) – FECHAS CON CJUIDATEPICKER

En el /protected/views/nombre_del_modelo/_form.php modifica nuestra fecha por:

<div class="row">
 <?php echo $form->labelEx($model,'fecha'); ?>
 <?php
 if ($model->fecha!='') {
 $model->fecha=date('d-m-Y',strtotime($model->fecha));
 }
 $this->widget('zii.widgets.jui.CJuiDatePicker', array(
 'model'=>$model,
 'attribute'=>'fecha',
 'value'=>$model->fecha,
 'language' => 'es',
 'htmlOptions' => array('readonly'=>"readonly"),

 'options'=>array(
 'autoSize'=>true,
 'defaultDate'=>$model->fecha,
 'dateFormat'=>'dd-mm-yy',
 'buttonImage'=>Yii::app()->baseUrl.'/images/calendar.png',
 'buttonImageOnly'=>true,
 'buttonText'=>'Fecha',
 'selectOtherMonths'=>true,
 'showAnim'=>'slide',
 'showButtonPanel'=>true,
 'showOn'=>'button',
 'showOtherMonths'=>true,
 'changeMonth' => 'true',
 'changeYear' => 'true',
 ),
 )); ?>
 <?php echo $form->error($model,'fecha'); ?>
 </div>

Antes de guardar debemos verificar que la fecha no venga vacía, eso lo hacemos en la función actionCreate, recuerda que /images/calendar.png es una imagen que hayas decido colocar allí. Al darle clic en la imagen se mostraría lo siguiente:


if($model->fecha=='') {
 $model->fecha=NULL;
 }

Si queremos formatear la fecha en la consulta a ‘d-m-Y’ debemos modificar en el /protected/views/nombre_del_modelo/view.php:

 if ($model->fecha!='') {
 $fecha=date('d-m-Y',strtotime($model->fecha));
 }
 else {
 $fecha='';
 }

Y en el ‘attributes’⇒array modificar ‘fecha’ con:

 array('name'=>'fecha', 'value'=>$fecha,),

Anuncios

Publicado el 27/01/2012 en Yii Framework. Añade a favoritos el enlace permanente. 5 comentarios.

  1. javiermarcuzzi

    En primer lugar gracias por su aporte, pero hay o por lo menos yo tengo un inconveniente, no me guarda la fecha en la base de datos, al ir al listado de datos, las fechas son 0000-00-00

    Mi código es casi igual, solo cambié una cosa, fecha por Nacimiento.

    labelEx($model,’Nacimiento’); ?>

    Nacimiento!=”) {
    $model->Nacimiento=date(‘d-m-Y’,strtotime($model->Nacimiento));
    }
    $this->widget(‘zii.widgets.jui.CJuiDatePicker’, array(
    ‘model’=>$model,
    ‘attribute’=>’Nacimiento’,
    ‘value’=>$model->Nacimiento,
    ‘language’ => ‘es’,
    //’htmlOptions’ => array(‘readonly’=>”readonly”),

    ‘options’=>array(
    ‘autoSize’=>true,
    ‘defaultDate’=>$model->Nacimiento,
    ‘dateFormat’=>’dd-mm-yy’,
    ‘buttonImage’=>Yii::app()->baseUrl.’/images/calendar.png’,
    ‘buttonImageOnly’=>true,
    ‘buttonText’=>’Nacimiento’,
    ‘selectOtherMonths’=>true,
    ‘showAnim’=>’slide’,
    ‘showButtonPanel’=>true,
    ‘showOn’=>’button’,
    ‘showOtherMonths’=>true,
    ‘changeMonth’ => ‘true’,
    ‘changeYear’ => ‘true’,
    ),
    )); ?>

    error($model,’Nacimiento’); ?>

    • saludos, aparentemente el codigo está bien, puedes poner que error te arroja el servidor?, estas colocandolo en el _form.php?, existe el campo Nacimiento en la base de datos?, que tipo es ese dato?, que base de datos usa?

      • javiermarcuzzi

        Creo que es la forma más fácil de responder su pregunta técnica, es medio larga pero clara, simplemente envío el sql y el controller generado por Gii. Estaba realizando una prueba con yii y es todo el contenido existente. No hay nada creado por mí, excepto mi intento de para utilizar cjuidatepicker según su escrito.

        /*
        Navicat MySQL Data Transfer

        Source Server : local_javier
        Source Server Version : 50516
        Source Host : localhost:3306
        Source Database : yii_probar

        Target Server Type : MYSQL
        Target Server Version : 50516
        File Encoding : 65001

        Date: 2012-03-03 16:40:51
        */

        SET FOREIGN_KEY_CHECKS=0;

        — —————————-
        — Table structure for `pais`
        — —————————-
        DROP TABLE IF EXISTS `pais`;
        CREATE TABLE `pais` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `Pais` varchar(255) DEFAULT NULL,
        PRIMARY KEY (`id`),
        KEY `ind_pais` (`id`)
        ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

        — —————————-
        — Records of pais
        — —————————-
        INSERT INTO `pais` VALUES (‘1’, ‘Argentina’);
        INSERT INTO `pais` VALUES (‘2’, ‘Brasil’);

        — —————————-
        — Table structure for `persona`
        — —————————-
        DROP TABLE IF EXISTS `persona`;
        CREATE TABLE `persona` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `Nombre` varchar(255) DEFAULT NULL,
        `Apellido` varchar(255) DEFAULT NULL,
        `Nacimiento` date DEFAULT NULL,
        `Pais` int(11) DEFAULT NULL,
        PRIMARY KEY (`id`),
        KEY `gent` (`id`),
        KEY `pais` (`Pais`),
        CONSTRAINT `pais` FOREIGN KEY (`Pais`) REFERENCES `pais` (`id`)
        ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

        — —————————-
        — Records of persona
        — —————————-
        INSERT INTO `persona` VALUES (‘1’, ‘Javier’, ‘Apellido’, ‘0000-00-00’, ‘1’);
        INSERT INTO `persona` VALUES (‘2’, ‘it’, ‘iit’, ‘0000-00-00’, ‘2’);

        array(‘index’,’view’),
        ‘users’=>array(‘*’),
        ),
        array(‘allow’, // allow authenticated user to perform ‘create’ and ‘update’ actions
        ‘actions’=>array(‘create’,’update’),
        ‘users’=>array(‘@’),
        ),
        array(‘allow’, // allow admin user to perform ‘admin’ and ‘delete’ actions
        ‘actions’=>array(‘admin’,’delete’),
        ‘users’=>array(‘admin’),
        ),
        array(‘deny’, // deny all users
        ‘users’=>array(‘*’),
        ),
        );
        }

        /**
        * Displays a particular model.
        * @param integer $id the ID of the model to be displayed
        */
        public function actionView($id)
        {
        $this->render(‘view’,array(
        ‘model’=>$this->loadModel($id),
        ));
        }

        /**
        * Creates a new model.
        * If creation is successful, the browser will be redirected to the ‘view’ page.
        */
        public function actionCreate()
        {
        $model=new Persona;

        // Uncomment the following line if AJAX validation is needed
        // $this->performAjaxValidation($model);

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

        $this->render(‘create’,array(
        ‘model’=>$model,
        ));
        }

        /**
        * Updates a particular model.
        * If update is successful, the browser will be redirected to the ‘view’ page.
        * @param integer $id the ID of the model to be updated
        */
        public function actionUpdate($id)
        {
        $model=$this->loadModel($id);

        // Uncomment the following line if AJAX validation is needed
        // $this->performAjaxValidation($model);

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

        $this->render(‘update’,array(
        ‘model’=>$model,
        ));
        }

        /**
        * Deletes a particular model.
        * If deletion is successful, the browser will be redirected to the ‘admin’ page.
        * @param integer $id the ID of the model to be deleted
        */
        public function actionDelete($id)
        {
        if(Yii::app()->request->isPostRequest)
        {
        // we only allow deletion via POST request
        $this->loadModel($id)->delete();

        // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
        if(!isset($_GET[‘ajax’]))
        $this->redirect(isset($_POST[‘returnUrl’]) ? $_POST[‘returnUrl’] : array(‘admin’));
        }
        else
        throw new CHttpException(400,’Invalid request. Please do not repeat this request again.’);
        }

        /**
        * Lists all models.
        */
        public function actionIndex()
        {
        $dataProvider=new CActiveDataProvider(‘Persona’);
        $this->render(‘index’,array(
        ‘dataProvider’=>$dataProvider,
        ));
        }

        /**
        * Manages all models.
        */
        public function actionAdmin()
        {
        $model=new Persona(‘search’);
        $model->unsetAttributes(); // clear any default values
        if(isset($_GET[‘Persona’]))
        $model->attributes=$_GET[‘Persona’];

        $this->render(‘admin’,array(
        ‘model’=>$model,
        ));
        }

        /**
        * Returns the data model based on the primary key given in the GET variable.
        * If the data model is not found, an HTTP exception will be raised.
        * @param integer the ID of the model to be loaded
        */
        public function loadModel($id)
        {
        $model=Persona::model()->findByPk($id);
        if($model===null)
        throw new CHttpException(404,’The requested page does not exist.’);
        return $model;
        }

        /**
        * Performs the AJAX validation.
        * @param CModel the model to be validated
        */
        protected function performAjaxValidation($model)
        {
        if(isset($_POST[‘ajax’]) && $_POST[‘ajax’]===’persona-form’)
        {
        echo CActiveForm::validate($model);
        Yii::app()->end();
        }
        }
        }

  2. en la funcion implementada debes cambiar ‘dateFormat’=>’dd-mm-yy’,
    por ‘dateFormat’=>’yy-mm-dd’, y donde dice $model->fecha=date(‘d-m-Y’,strtotime($model->fecha)); cambiarlo por $model->fecha=date(‘Y-m-d’,strtotime($model->fecha));

    Luego, todo lo anterior, mantiene el formato en que mysql almacena los valores tipo date. Otro punto a tener en consideracion es si tu campo date de tu base de datos es datetime, no he incursionado en como maneja eso yii porque no tengo datos de ese tipo en mi bd, pero si he probado ingresando la fecha en formato y-m-d y funciona sin problemas 😉

  3. hola disculpa implemente y al guardar la fecha me la da en 0000-00-00

    En la base de datos el campo se llama ‘fecha’ y es de tipo ‘date’
    y aqui estan los scripts

    en el controlador el actionCreate queda así

    ” public function actionCreate()
    {
    $model=new Cita;

    // Uncomment the following line if AJAX validation is needed
    // $this->performAjaxValidation($model);

    if(isset($_POST[‘Cita’]))
    {

    if($model->fecha==”) {
    $model->fecha=NULL;
    }

    $model->attributes=$_POST[‘Cita’];
    if($model->save())
    $this->redirect(array(‘view’,’id’=>$model->id));
    }

    $this->render(‘create’,array(
    ‘model’=>$model,
    ));
    } ”

    el apartado de ‘fecha’ en el form queda asi


    labelEx($model,’fecha’); ?>
    fecha!=”) {
    $model->fecha=date(‘d-m-Y’,strtotime($model->fecha));
    }
    $this->widget(‘zii.widgets.jui.CJuiDatePicker’, array(
    ‘model’=>$model,
    ‘attribute’=>’fecha’,
    ‘value’=>$model->fecha,
    ‘language’ => ‘es’,
    ‘htmlOptions’ => array(‘readonly’=>”readonly”),
    ‘options’=>array(
    ‘autoSize’=>true,
    ‘defaultDate’=>$model->fecha,
    ‘dateFormat’=>’dd-mm-yy’,
    ‘buttonImage’=>Yii::app()->baseUrl.’/images/calendar.png’,
    ‘buttonImageOnly’=>true,
    ‘buttonText’=>’Fecha’,
    ‘selectOtherMonths’=>true,
    ‘showAnim’=>’slide’,
    ‘showButtonPanel’=>true,
    ‘showOn’=>’button’,
    ‘showOtherMonths’=>true,
    ‘changeMonth’ => ‘true’,
    ‘changeYear’ => ‘true’,
    ),
    )); ?>
    error($model,’fecha’); ?>

    por favor ayuda

Tu Opinión es Importante, Comenta!

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s