2014-12-29 13 views
8

Wie können Sie das benutzerdefinierte Datumsformat für Symfony2-Formulare richtig einstellen?Wie wird das Datumsformat für Symfony-Formulare global festgelegt?

Standardformat ist wie Y-m-d, und wenn ich Datum wie m/d/Y oder d/m/Y eingeben, wird es als ungültig behandelt.

Gibt es eine Möglichkeit, das Format mit dem ausgewählten Gebietsschema in Beziehung zu setzen? Ich suche nach einer einfachen Lösung, ohne benutzerdefinierte Formulartypen zu schreiben.

+0

Sie können versuchen, benutzerdefinierten Formulartyp zu erstellen, http://symfony.com/doc/current/cookbook/form/create_custom_field_type.html –

Antwort

2

Sie können das Format in Ihrem FormType festlegen, wenn Sie ein anderes Format wünschen.

$builder->add('date_created', 'date', array(
    'widget' => 'single_text', 
    // this is actually the default format for single_text 
    'format' => 'yyyy-MM-dd', 
)); 

Der Standard es nicht 'Y-m-d' sein eine Instanz von IntlDateFormatter. Daher sollte das richtige Gebietsschema ausgewählt werden, wenn Sie keinen einzelnen Text verwenden.

Typ: integer oder String default: IntlDateFormatter :: MEDIUM (oder yyyy-MM-dd if Widget single_text ist)

http://symfony.com/doc/current/reference/forms/types/date.html#format http://php.net/manual/en/class.intldateformatter.php

+0

Vielen Dank für Ihre Antwort @Steinig. Ich weiß, dass ich benutzerdefinierte Format über die Optionen des Typs festlegen kann.Aber ich muss das global tun (vergaß früher zu erwähnen; habe meine Frage aktualisiert). Hier muss eine einfachere Lösung als das Aktualisieren aller Orte sein, an denen das Format "Datum" verwendet wird. Ich glaube, dass es viele Websites gibt, die ein nicht standardmäßiges Datumsformat verwenden (USA, Großbritannien und andere Länder). Also sollte dieses "Problem" üblich sein. Häufige Probleme haben normalerweise eine einfache Lösung :) – Johnny

1

Wenn Sie das Format Ihres Datumsfelds je nach Gebietsschema ändern möchten, müssen Sie dies tun Erstellen Sie ein benutzerdefiniertes Feld und verwenden Sie es anstelle von Datum. Es ist die einzige Art, die mir bewusst ist.

zunächst den Dienst erstellen und das Gebietsschema in den Argumenten übergeben:

# src/Acme/DemoBundle/Resources/config/services.yml 
services: 
    acme_demo.form.type.localedate: 
     class: Acme\DemoBundle\Form\Type\LocaleDateType 
     arguments: 
      - "%locale%" 
     tags: 
      - { name: form.type, alias: localedate } 

Erstellen Sie die Klasse mit dem Code für den neuen Feldtyp. Wie Sie sehen können, ist es auf dem Feldtyp Datum basiert und ändert das Format auf dem aktuellen Gebietsschema abhängig:

// src/Acme/DemoBundle/Form/Type/LocaleDateType.php 
namespace Acme\DemoBundle\Form\Type; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

class LocaleDateType extends AbstractType 
{ 
    private $locale; 

    public function __construct($locale) 
    { 
     $this->locale = $locale; 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'format' => $this->getFormat(),// return the format depending on locale 
     )); 
    } 

    private function getFormat() { 
     switch($this->locale) { 
      case 'es': 
       return 'dd-MM-yyyy';// return valid date format for this locale 
      default: 
       return 'yyyy-MM-dd'; 
     } 
    } 

    public function getParent() 
    { 
     return 'date'; 
    } 

    public function getName() 
    { 
     return 'localedate'; 
    } 
} 

es in Ihrer Anwendung verwenden anstelle des date Feldtyp:

$builder->add('date_created', 'localedate', array(
    'widget' => 'single_text', 
)); 

es Hoffnung hilft.

Mit freundlichen Grüßen.

1

Sie können das date_widget von symfony unter YourProjectFolder \ vendor \ symfony \ symfony \ src \ Symfony \ Bridge \ Twig \ Ressourcen \ views \ Form \ form_div_layout.html.twig überschreiben. Kopieren Sie die Datei auf einem anderen wie fields.html.twig und setzt es unter der globalen Ressource \ Ansichten \ Formular \ und überschreiben die date_widget (es auf dem Standardformat ändern):

{% block date_widget -%} 
{% if widget == 'single_text' %} 
    {{- block('form_widget_simple') -}} 
{% else -%} 
    <div {{ block('widget_container_attributes') }}> 
     {{- date_pattern|replace({ 
      '{{ year }}': form_widget(form.year), 
      '{{ month }}': form_widget(form.month), 
      '{{ day }}': form_widget(form.day), 
     })|raw -}} 
    </div> 
{%- endif %} 

{% - endblock date_widget% }

Dann in Ihrem Formular hinzu:

{% form_theme form 'AAAYourBundle:Form:fields.html.twig'%} 
Verwandte Themen