2014-12-29 7 views
8

Qual è il modo corretto di impostare globalmente il formato di data personalizzato per i moduli Symfony2?Come impostare globalmente il formato della data per i moduli Symfony?

Il formato predefinito è come Y-m-d e, se immetto la data come m/d/Y o d/m/Y, viene considerato non valido.

C'è un modo per correlare in qualche modo il formato alle impostazioni locali selezionate? Sto cercando una soluzione semplice senza scrivere tipi di moduli personalizzati.

+0

Si può cercare di creare tipo di modulo personalizzato, http://symfony.com/doc/current/cookbook/form/create_custom_field_type.html –

risposta

2

È possibile impostare il formato in FormType se si desidera un altro formato.

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

Il predefinito non 'Y-m-d' sua un'istanza di IntlDateFormatter. In questo modo dovrebbe selezionare la locale corretta se non si usa un solo testo.

tipo: intero o stringa predefinito: IntlDateFormatter :: MEDIUM (o yyyy-MM-dd if widget è single_text)

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

+0

Grazie per la risposta @Pietroso. So che posso impostare il formato personalizzato attraverso le opzioni del tipo.Ma ho bisogno di farlo a livello globale (ho dimenticato di menzionare prima, ho aggiornato la mia domanda). Qui deve essere una soluzione più semplice rispetto all'aggiornamento di tutte le posizioni in cui viene utilizzato il formato 'date'. Credo che ci siano molti siti Web che utilizzano un formato data non predefinito (Stati Uniti, Regno Unito e altri paesi). Quindi questo "problema" dovrebbe essere comune. I problemi comuni di solito hanno una soluzione semplice :) – Johnny

1

Se si desidera modificare il formato del campo della data in base alle impostazioni locali, sarà necessario crea un campo personalizzato e usalo al posto della data. È l'unico modo di cui sono a conoscenza.

In primo luogo, creare il servizio e passare il locale negli argomenti:

# 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 } 

creare la classe con il codice per il nuovo tipo di campo. Come si può vedere, si basa sulla data di tipo di campo e cambia il formato a seconda della locale corrente:

// 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'; 
    } 
} 

utilizzarlo nella vostra applicazione invece del tipo date campo:

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

spero che aiuta.

Cordiali saluti.

1

È possibile eseguire l'override di date_widget di symfony in YourProjectFolder \ vendor \ symfony \ symfony \ src \ Symfony \ Bridge \ Twig \ Resources \ views \ Form \ form_div_layout.html.twig. Copiare il file in un'altra fields.html.twig come e metterlo sotto la risorsa globale \ vista \ Form \ e sovrascrivere il date_widget (cambiare per il formato di default):

{% 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% }

Poi nel modulo aggiuntivo:

{% form_theme form 'AAAYourBundle:Form:fields.html.twig'%} 
Problemi correlati