Date with DatePicker (solved)

If I understand correctly (probably not, of course), following this guide:

http://www.yiiframew…widget-jui.html

it can be possible to configure DatePicker in few steps:

Formatter in web.cfg:




    	'formatter' => [

        	'dateFormat' => 'dd-MM-yyyy',

        	'decimalSeparator' => ',',

        	'thousandSeparator' => ' ',

        	'currencyCode' => 'EUR',

        	'locale' => 'it-IT',

        	'defaultTimeZone' => 'Europe/Rome',



DatePicker in ActiveForm:




<?= $form->field($model, 'data')->widget(\yii\jui\DatePicker::className(), [

	// if you are using bootstrap, the following line will set the correct style of the input field

	'options' => ['class' => 'form-control'],

	// ... you can configure more DatePicker properties here

]) ?>



And the rules in module:




	public function rules()

	{

    	return [

        	//...

        	[['data'], 'safe'], //maybe is this redundant ?

        	['data', 'default', 'value' => null],

        	['data', 'date', 'timestampAttribute' => 'data'],

        	//...

    	];

	}



In Mysql table the field "data" is setting as "date" (that is what I need, but I tried also with "timestamp"). In any case when I update or when I create new record the "data" field return 0000-00-00.

Where I do wrong, please?

DatePicker has own formatting functions.

http://api.jqueryui…tion-dateFormat

I don’t agree. Look at $dateFormat public property in http://www.yiiframew…datepicker.html

"If not set the default value will be taken from Yii::$app->formatter->dateFormat"

Infact, my dateFormat in “formatter” section of web.cfg is ‘dateFormat’ => ‘dd-MM-yyyy’, and DatePicker rapresent the date in this exactly way. And correspond to DatePicker ‘dateFormat’ => ‘php:d/m/Y’ or ‘dateFormat’ => ‘dd-MM-yyyy’.

The your suggested format in http://api.jqueryui.com/ seems don’t correspond to yii2 formatter. Infact, accordling to $.datepicker.formatDate( format, date, settings ) in http://api.jqueryui.com/, “dd” it should be the day of month (two digit), instead for getting the day of month (two digit) I must write “MM”, like I write above.

I don’t find other better solution, but this is working:

In model


	public function beforeSave($insert)

	{

    	$this->data = Yii::$app->formatter->asDate($this->data, 'yyyy-MM-dd');

    	parent::beforeSave($insert);

    	return true;

	}


	public function afterFind()

	{

    	$this->data = Yii::$app->formatter->asDate($this->data, 'dd-MM-yyyy');

    	//$this->importo = Yii::$app->formatter->asCurrency($this->importo, 'EUR');

    	parent::afterFind();

    	return true;

	}

Validation:


['data', 'date', 'format' => 'dd-MM-yyyy'],

Your solution didn’t work to me.

Could you help me, please?

Web




        'formatter' => [

            'dateFormat' => 'dd/MM/yyyy',

            'decimalSeparator' => ',',

            'thousandSeparator' => '.',

            'currencyCode' => 'BR',

        ],



Model




    public function rules()

    {

        return [

            [['nome', 'quant_max_disciplinas', 'periodo_letivo', 'habilitado', 'id_tipo_situacao_inscricao_inicial', 'data_inscricao_inicio', 'data_inscricao_termino'], 'required'],

            [['descricao'], 'string'],

            [['quant_max_disciplinas', 'habilitado', 'id_tipo_situacao_inscricao_inicial'], 'integer'],

            ['data_inscricao_inicio', 'date'],

            ['data_inscricao_termino', 'date'],

            [['nome'], 'string', 'max' => 255],

            [['site'], 'url', 'defaultScheme' => 'http'],

            [['periodo_letivo'], 'string', 'max' => 10]

        ];

    }


    public function beforeSave($insert)

    {

        $this->data_inscricao_inicio = Yii::$app->formatter->asDate($this->data_inscricao_inicio, Yii::$app->formatter->dateFormat);

        $this->data_inscricao_termino = Yii::$app->formatter->asDate($this->data_inscricao_termino, Yii::$app->formatter->dateFormat);

        parent::beforeSave($insert);

        return true;

    }


    public function afterFind()

    {

        $this->data_inscricao_inicio = Yii::$app->formatter->asDate($this->data_inscricao_inicio, Yii::$app->formatter->dateFormat);

        $this->data_inscricao_termino = Yii::$app->formatter->asDate($this->data_inscricao_termino, Yii::$app->formatter->dateFormat);

        parent::afterFind();

        return true;

    }



Controller




    public function actionCreate()

    {

        $model = new Instancia();


        if ($model->load(Yii::$app->request->post()) && $model->validate()) {

            if ( $model->save()) {

                return $this->redirect(['view', 'id' => $model->id]);

            }

        } else {

            return $this->render('create', [

                'model' => $model,

            ]);

        }

    }



View




    <?= $form->field($model, 'data_inscricao_inicio')->widget(\yii\jui\DatePicker::classname(), [ 'options' => ['class' => 'form-control'], ])

    ?>


    <?= $form->field($model, 'data_inscricao_termino')->widget(\yii\jui\DatePicker::classname(), [

        'options' => ['class' => 'form-control'],

    ])  ?>



I think your problem is here:




    public function beforeSave($insert)

    {

        $this->data_inscricao_inicio = Yii::$app->formatter->asDate($this->data_inscricao_inicio, Yii::$app->formatter->dateFormat);

        $this->data_inscricao_termino = Yii::$app->formatter->asDate($this->data_inscricao_termino, Yii::$app->formatter->dateFormat);

        parent::beforeSave($insert);

        return true;

    }


    public function afterFind()

    {

        $this->data_inscricao_inicio = Yii::$app->formatter->asDate($this->data_inscricao_inicio, Yii::$app->formatter->dateFormat);

        $this->data_inscricao_termino = Yii::$app->formatter->asDate($this->data_inscricao_termino, Yii::$app->formatter->dateFormat);

        parent::afterFind();

        return true;

    }




If you use mysql you must save the date field in table with mysql date format:

‘yyyy-MM-dd’ and transform in afterfind.

So change your code in your model:




    public function beforeSave($insert)

    {

        $this->data_inscricao_inicio = Yii::$app->formatter->asDate($this->data_inscricao_inicio, 'yyyy-MM-dd');

        $this->data_inscricao_termino = Yii::$app->formatter->asDate($this->data_inscricao_termino, 'yyyy-MM-dd');

        parent::beforeSave($insert);

        return true;

    }


    public function afterFind()

    {

        $this->data_inscricao_inicio = Yii::$app->formatter->asDate($this->data_inscricao_inicio, 'dd-MM-yyyy');

        $this->data_inscricao_termino = Yii::$app->formatter->asDate($this->data_inscricao_termino, 'dd-MM-yyyy');

        parent::afterFind();

        return true;

    }

1 Like

Thanks, now i can save at database. :D