Uso di DatePicker con Mysql


(Lcnlcn) #1

Ciao a tutti ho difficoltà nel registrare un campo data in database mysql

utilizzo datePicker di kartik nel seguente modo :

$form->field($model, “DATASCADENZA”, [‘labelOptions’ => [‘label’ => ‘Data Operazione’]])

->widget(DatePicker::classname(), [

        'name' => 'DATASCADENZA',


        'disabled' => false,


        'pluginOptions' => [


            'autoclose' => true,


            'format' => 'dd/mm/yyyy'


        ]


    ]); 

in visualizzazione tutto ok.

Il problema è nel registrare nel db il record.

rules del model :

[[‘DATASCADENZA’], ‘date’, ‘format’ => ‘php:Y-m-d’],

nel controller :

prima del $model->save()

non faccio altro che

$model->DATASCADENZA = Yii::$app->formatter->asDate($post[‘DATASCADENZA’], ‘php:Y-m-d’);

$post[‘DATASCADENZA’] è il campo del form.

mi da il seguente errore:

‘28/12/2018’ is not a valid date time value: DateTime::__construct(): Failed to parse time string (28/12/2018) at position 0 (2): Unexpected character

Non riesco a capire il motivo

Vi ringrazio anticipatamente


(Lcnlcn) #2

Ho trovato questa soluzione :

$datetime = new \DateTime();

$newDate = $datetime->createFromFormat(‘d/m/Y’, $post[‘DATASCADENZA’]);

$model->DATASCADENZA = $newDate->format(‘Y-m-d’);

$model->save();

non è molto elegante

ma per il momento posso andare avanti

si accettano comunque suggerimenti

grazie


(Mariodipatria) #3

Crea Un behavior…




<?php


namespace app\components\behaviors;


use yii\base\Behavior;

use yii\db\ActiveRecord;

use yii\base\InvalidConfigException;




class DateBehavior extends Behavior

{

    public $owner;   

    public $date="date";

   

 

    public function init()

    {

        parent::init();

       

            if (!isset($this->date)) {

                throw new InvalidConfigException('The "date" must be specified.');

            }

        

    }

   

    public function events()

    {

        return [

            ActiveRecord::EVENT_BEFORE_INSERT => 'processDate',

            ActiveRecord::EVENT_BEFORE_UPDATE => 'processDate',

            ActiveRecord::EVENT_AFTER_FIND => 'afterFind',

        ];

    }


   

    public function processDate($event)

    {

            $date = \DateTime::createFromFormat('d/m/Y', $this->owner->{$this->date});

            $this->owner->{$this->date} = $date->format('Y-m-d') ;

    }


  

    public function afterFind($event)

    {

            $date = \DateTime::createFromFormat('Y-m-d', $this->owner->{$this-$this->date});

            $this->owner->{$this->date} = $date->format('d/m/Y');


    }


}




La flessibilità di questo approccio è che può richiamarlo dai tuoi model che fanno uso di un campo data da convertire e riconvertire.

Dopo la ricerca (EVENT_AFTER_FIND), converte i formato d/m/Y, quando inserisci o modifichi (EVENT_BEFORE_INSERT || EVENT_BEFORE_UPDATE) fa si che venga prima convertito in formato Mysql e poi sparato nel DB.