Laravel/jQuery date format Ro

Salut!
Am o problema care poate este simpla, dar inca n-am gasit solutie.

Am un formular care are 3 inputuri in care introduc cu datepicker-ul o data, in “dateFormat” ii selectez formatul Romaniei “dd.mm.YY”, iar in partea de Controller(Laravel) preiau aceste date ca pe un string, si vreau sa-l introduc in baza ca data, dar in mysql formatul este yyyy-mm-dd. La fiecare din cele n- input-uri cu date trebuie sa le fac conversia Ro->En apoi cand le preaiua din BD fac En->Ro. Ma gandesc daca nu pot sa fac un mask peste aceste inputuri, sa-mi afiseze formatul Romanesc dar sa trimita in controller formatul natural din BD ?

Multumesc!

Sigur are parametru pentru așa ceva datepickerul pe care îl folosești. Despre ce librărie e vorba?

Despre datepickerul standard de la jquery 2.1.3

O solutie pentru jumatate din problema ta: adica doar pentru partea de selectare din baza de date.

Poti include doua functii in Model:

public function getCreatedAtAttribute($date)
{
    return Carbon\Carbon::createFromFormat('Y-m-d H:i:s', $date)->format('d-M-Y');
}
    
public function getUpdatedAtAttribute($date)
{
    return Carbon\Carbon::createFromFormat('Y-m-d H:i:s', $date)->format('d-M-Y');
}

Sau o alta metoda (netestata de mine): https://laracasts.com/discuss/channels/general-discussion/handling-form-dates/replies/21051

Asa am facut si eu in Model, dar trebuie sa fie ceva mai simplu, daca stai sa te gandesti ca as avea 5 inputuri * 3 formulare deja is 30 de functii (15 set, 15 get).
Pentru set suprascriu metoda din Eloquent in felul urmator:

public function setDataValoareSolicitata($value)
    {
        $this->attributes['data_valoare_solicitata'] = date("Y-m-d",strtotime($value));
        // $this->setDate('data_valoare_solicitata',$value); 
    }

Sper ca am inteles la ce te referi si mentionez ca la GET si/sau SET nu trebuie sa apelezi functia getCreatedAtAttribute($data)

In Viewer sau Controller (depinde unde vrei sa folosesti data) poti folosi $created_at si iti returneaza automat data specificata in functia din Model.

Documentatie: http://laravel.com/docs/5.0/eloquent#accessors-and-mutators

Asa este, iti face automat fiindca get/setNumeCampDinBdAttribute($value) suprascriu metodele standard din Eloquent. Dar asta inseamna ca eu in model tre sa fac multe functii, vreau o metoda simpla care sa-mi rezolve treaba asta in partea de front (tre sa fie ceva optiune la vreun datepicker care sa afiseze o valoare dar sa trimita spre server alta valoare)

Nu știu cât de best-practice e să faci treaba asta doar în front-end…

1 Like

Am inteles, din pacate la front-end nu ma bag :slight_smile: (in ideea in care nu am experienta cu datepicker sau cum se pot manipula datele cat mai sigur)

Obligatoriu sa faci in back end! Nu-i nevoie sa repeti intreg codul lui @memelea in fiecare getter, ci faci o privata care se ocupa de asta. E buna gandirea ta de nu a avea overhead, dar nu te bazezi niciodata pe user input.

Ca sa faci exact ce vrei tu, vezi altField si altFormat: http://api.jqueryui.com/datepicker/#option-altField

1 Like

ce inseamna “faci o privata” ? sa fac o metoda privata sau ?

Da, faci o metoda privata care contine codul ce transforma user input date, pe care o apelezi in metoda setter (nu getter cum am zis anterior). Iar fiecare setter va contine doar apelul catre metoda privata.

dar si la getter voi avea nevoie sa transform din yyyy-mm-dd in dd.mm.yy (RO)

Nu mai stiu daca se descurca jQuery singur sa interpreteze si alte formate de data (din fericire nu mai fac front end de mult timp), dar daca ai nevoie, doar apelezi privita respectiva si la getter. La setter e foarte important pentru a-ti proteja baza de date.

Scrisesem oleacă de flame, dar m-am uitat mai bine și soluția lui @memelea e cea corectă/elegantă. :smiley:

1 Like