Yii2 mit Datumformat dd.mm.yyyy und Zahlformat "xxxx,nn"

Hier im deutschen Forum ist zwar kaum was los, aber ich versuche mal mein Glück:

Der Umgang mit abweichendem (deutschen) Datumformat wurde in Yii2 wohl leider nicht verbessert?!

Auch das Dezimalzahlenformat (xxxx,nn statt xxxx.nn) wird nicht out of the box unterstützt?!

Es ist nicht möglich, bei Yii2 an einer zentralen Stelle die entsprechenden Formate zu konfigurieren, so dass

Gridview, Detailview und Activeform die Daten entsprechend dem eingestellten Format anzeigen und abspeichern!

Wie löst man das dann?

Die Anforderungen sind wie folgt:

  1. Datumfelder sollen im Format dd.mm.yyyy eingegeben werden (Activeform) und beim Speichern automatisch ins passende Datenbank-Format (Unix Timestamp) umgewandelt werden.

  2. Bei einem Eingabefeld vom Typ DECIMAL soll das Komma als Dezimaltrennzeichen eingerichtet werden.

Der Anwender soll 1234,99 eingeben können und nicht 1234.99 eingeben müssen.

  1. Die Ausgabe im Gridview und Detailview soll im eingestellten Format erfolgen. Im Gridview muss das Format auch beim Filter funktionieren.

Das soll natürlich automatisiert erfolgen. Wenn man viele Tabellen mit vielen Datum-/Dezimalfeldern hat, macht es keinen Sinn, jedes Feld manuell anzufassen und umzuwandeln.

Hi,

das mit den Datumsformaten ist wie schon beschrieben, eine ganz eigene Sache… Allerdings kann man sich mit I18n und DateFormatter echt gut helfen…

Ich benütze auch gerne die Erweiterung von Krajee die sich nach meiner Meinung echt gut um das Thema kümmert… - Kalenderformat kann für Sicht und Speichern separat definiert werden und in der Oberfläche kümmert sich ein JS um die Umwandlung…:)

LG Philipp

Hallo, ich bin erst seit kurzem mit Yii am werkeln.

Habe das gleiche Problem und folgende Lösung:

Ändern der value im model nachdem es erstellt ist:


$this->Preis = yii::$app->formatter->asDecimal($this->Preis,2);

Und für die Validation und das Zurückschreiben in die DB eine filter rule:


['Preis', 'filter', 'filter' => function ($value) {$value = str_replace(',', '.', $value); return $value; }],

Das muss dann in jedem model für jedes Decimal-Feld gemacht werden.

Es funktioniert, aber was ist davon zu halten?

Hi yiim,

das ist ganz einfach über die web.php Config machbar.

Hier ein kleines Beispiel.




'components' => [

  'formatter' => [

      'dateFormat' => 'd.M.Y',

      'thousandSeparator' => ',',

      'decimalSeparator' => '.'

  ]

]



Über die oben aufgezeichnete Config-Einstellung kann nur die Ausgabe angepasst werden, aber nicht die Eingabe (siehe mein Punkt 1 und 2)

Hi yiim,

ja das ist richtig.

Die eingabe kann man dann über das jeweilige Model Steuern.

Bsp:


    

public function rules()

{

   return [

         [['dateField'], 'date', 'format' => 'yyyy-d-M H:m'],

   ];

}



Wäre ja schön, wenn es so einfach wäre…

Ich verwende jetzt folgende Extension, mit der die Eingabe "31.12.2015" beim Speichern automatisch in das passende Datenbankformat umgewandelt wird:

Auch wenn der Eintrag schon älter ist und hier tatsächlich nix los ist.

Ich benutze YII2 und hatte ähnliche Probleme.

Es ging hier um ein Feld für den Geburtstag.

MySQL Tabelle profile

Feld birthdate mit dem Datatype DATE.

Model Profile




    /**

     * @inheritdoc

     */

    public function rules()

    {

        return [

            ...

            [['birthdate'], 'date', 'format' => 'php:Y-m-d'],

        ];

    }



Ich musste tatsächlich ‘php:Y-m-d’ schreiben ohne ‘php:’ hatte es nicht funktioniert, wegen des PHP DateTime Formats.

Siehe Doku

Views/profile/_form.php




<?php

        echo $form->field($model, 'birthdate')->widget(DatePicker::className(), [

            'language' => 'de',

            'inline' => false,

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

            'clientOptions' => [

                'showAnim'=>'slideDown',

                'yearRange' => '-115:+0',

                'changeMonth'=> true,

                'changeYear'=> true,

                'autoSize'=>true,

                'showOn'=> "button",

                'buttonText' => 'Kalender',

            ]

        ]);

    ?>



Evtl. gibt es auch noch bessere Lösungen, bei mir funktioniert es aber aktuell so.