2013-05-31 3 views
5

Каков наилучший способ обработки строковых представлений и переводов числовых кодов в Symfony2?Перевести числовые коды состояния в Symfony2 и SonataAdmin

Предположим, у меня есть объект вроде этого:

<?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; 
    } 
} 

На переднем конце и во внутреннем интерфейсе SonataAdmin я не хочу, чтобы показать цифровые коды, но строки. Например, «Новое», «Отправлено» и «Поставлено». Но я также хочу уметь переводить эти строки (например, на голландском языке «Nieuw», «Verzonden» и «Afgeleverd»).

Итак, есть два шага преобразования: сначала от числового кода до строки или ключа перевода, а затем в локализованную строку.

Где и как лучше всего делать эти преобразования? Как в передней части моих собственных контроллеров/представлений, так и в поддержке SonataAdmin?

+0

Вы уже определяете эти строки ('New', 'Sent' и 'Delivered') где-то в вашем коде? Или в базе данных? – cheesemacfly

+0

Нет, еще нет. Я ищу лучшее место для их размещения. Я думаю, что переводы будут проще всего выяснить. Но каково лучшее место, чтобы перейти от этих числовых кодов к строкам? –

+1

Я согласен с вами в том, что переводная часть проста. То, что я сделал, помещает эти пары ключ/значение в файл конфигурации, который я загружаю в базу данных с помощью набора инструментов для доктрины, а затем переводит их, используя расширение Translatable из пакета DoctrineExtension. Но определенно не уверен, что это хорошее решение или нет ... – cheesemacfly

ответ

6

Если бы я тебя, я хотел бы добавить метод к моему классу сообщений

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

И затем, обрабатывать его в файле перевода, как это:

message.en.xlf

<?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

Это хорошая идея: D – Rocco

0

Ответ YoH - хорошее решение этой проблемы.

Однако, когда я реализую свои коды статуса, мне нравится иметь коды сообщений и статуса прямо внутри класса сущности.

Для этого я не хочу показывать свое решение, которое не так хорошо, как решение YoH, потому что ему не хватает интернационализации, но работает хорошо для меня.

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

И соната Администратор Класс для сообщения об изменении поля в configureFormFields() для:

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

И если вы хотите, чтобы показать значение в списке, то изменить configureListFields(), чтобы:

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

И создать ветку под названием 'message_list_status_field.html.twig':

{% extends 'SonataAdminBundle:CRUD:base_list_field.html.twig' %} 
{% block field %} 
    <div> 
     {{ object.readableStatus }} 
    </div> 
{% endblock %} 
Смежные вопросы