2013-05-31 10 views
5

Qual è il modo migliore per gestire rappresentazioni di stringa e traduzioni di codici numerici in Symfony2?Tradurre codici di stato numerici in Symfony2 e SonataAdmin

Supponiamo che io sono un soggetto come questo:

<?php 

class Message 
{ 
    const STATUS_NEW  = 0; 
    const STATUS_SENT  = 1; 
    const STATUS_DELIVERED = 2; 

    /** 
    * @var int 
    */ 
    private $status = self::STATUS_NEW; 

    public function getStatus() 
    { 
     return $this->status; 
    } 
} 

Sul front-end e back-end nel SonataAdmin Io non voglio mostrare codici numerici ma stringhe. E.g "Nuovo", "Inviato" e "Consegnato". Ma voglio anche essere in grado di tradurre queste stringhe (ad esempio in olandese "Nieuw", "Verzonden" e "Afgeleverd").

Quindi ci sono due fasi di conversione: in primo luogo dal codice numerico a una chiave stringa o di traduzione, e poi alla stringa localizzata.

Dove e come faccio a fare al meglio queste conversioni? Sia nel front-end nei miei controller/viste e in un SonataAdmin basato sul supporto?

+0

Stai già definendo quelle stringhe ('Nuovo', 'Inviato' e 'Consegnato') da qualche parte nel tuo codice? O in un database? – cheesemacfly

+0

No, non ancora. Sto cercando il posto migliore per metterli. Penso che le traduzioni saranno le più facili da capire. Ma qual è il miglior posto dove andare da quei codici numerici alle stringhe? –

+1

Sono d'accordo con te sul fatto che la parte di traduzione è facile. Quello che ho fatto, è mettere quelle coppie chiave/valore in un file di configurazione che carico nel database con il pacchetto doctrine fixture e poi tradurle usando l'estensione Translatable dal bundle DoctrineExtension. Ma sicuramente non sono sicuro se sia una buona soluzione o no ... – cheesemacfly

risposta

6

Se fossi in te, vorrei aggiungere un metodo per la mia Classe messaggio

public function getStatusString() { 
    return 'message.status.'.$this->status; 
} 

E poi, gestire nel file di traduzione in questo modo:

message.en.xlf

risposta
<?xml version="1.0"?> 
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2"> 
    <file source-language="en" datatype="plaintext" original="file.ext"> 
     <body> 
      <trans-unit id="1"> 
       <source>message.status.0</source> 
       <target>New</target> 
      </trans-unit> 
      <trans-unit id="2"> 
       <source>message.status.1</source> 
       <target>Sent</target> 
      </trans-unit> 
      <trans-unit id="3"> 
       <source>message.status.2</source> 
       <target>Delivered</target> 
      </trans-unit> 
     </body> 
    </file> 
</xliff> 
+3

Questa è una buona idea: D – Rocco

0

Yoh di è una bella soluzione a questo problema.

Tuttavia quando a implementare i miei codici di stato mi piace avere i codici dei messaggi di stato e di diritto all'interno della mia classe di entità.

Perciò ho wan't di mostrare la mia soluzione, che non è buono come la soluzione di Yoh perché manca l'internazionalizzazione, ma funziona bene per me.

class Message 
{ 
    ... 
    const STATUS_NEW  = 0; 
    const STATUS_SENT  = 1; 
    const STATUS_DELIVERED = 2; 

    ... 
    public static $statusCodes = array(
     Message::STATUS_NEW => "New", 
     Message::STATUS_SENT => "Sent", 
     Message::STATUS_DELIVERED => "Delivered" 
    ); 

    public static function getStatusCodes() 
    { 
     return self::$statusCodes; 
    } 

    public function getReadableStatus() 
    { 
     if (!is_null($this->getStatus())) { 
      return self::$statusCodes[$this->getStatus()]; 
     } else { 
      return null; 
     } 
    } 
} 

E in Admin Classe Sonata per Messaggio modificare il campo in configureFormFields() a:

->add('status', 'choice', array(
        'label' => "current Status", 
        'help' => "What's that status of the message ?", 
        'choices' => Message::getStatusCodes() 
       ) 
      ) 

E se si desidera visualizzare il valore nell'elenco quindi modificare configureListFields() per:

->add('status', 'string', array('template' => 'YourBundleName:Admin:message_list_status_field.html.twig')) 

E creare un ramoscello di nome 'message_list_status_field.html.twig':

{% extends 'SonataAdminBundle:CRUD:base_list_field.html.twig' %} 
{% block field %} 
    <div> 
     {{ object.readableStatus }} 
    </div> 
{% endblock %} 
Problemi correlati