theme isvalid form change symfony twig symfony-forms

isvalid - symfony using form



¿Obtener el nombre del país traducido de un código de país de 2 dígitos en Symfony2/Twig? (7)

Bueno, si está usando entidades, una opción en lugar de hacer filtros de ramas es crear una función para obtener el nombre del país dentro de la entidad.

use Symfony/Component/Intl/Intl; public function getCountryName() { return Intl::getRegionBundle()->getCountryName($this->getCountry()); }

Entonces en una ramita más tarde puedes hacer

{{ user.countryName }}

Estoy usando el campo Tipo de país Symfony2, funciona bien y los nombres de los países están traducidos. Estoy almacenando el código de país de dos dígitos en el country de la columna de mi entidad.

¿Cómo puedo mostrar el nombre del país completo y traducido? Así es como agregué el campo a la forma:

$builder ->add(''country'', ''country'', array( ''label'' => ''Paese'', ''preferred_choices'' => array(''IT'') ));

Y luego en mi controlador:

$user = $this->getDoctrine()->getRepository(''AcmeHelloBundle:User''); $countryCode = $user->getCountry(); $countryName = null; // Get translated country name from code

O en mi plantilla de ramita:

{# Output the country code and name #} {{ user.country }} {# translated country name from code #}


Con un filtro twig ( http://symfony.com/doc/current/cookbook/templating/twig_extension.html ):

new /Twig_SimpleFilter(''country_name'', function($value) { return /Symfony/Component/Intl/Intl::getRegionBundle()->getCountryName($value); }),

uso en una plantilla de ramita

{{ ''GB'' | country_name }} {# displays United Kingdom #}

funcionó para mí en Symfony 2.3


Inspirado por la respuesta de Hannoun Yassir, utilizo el campo Intl como en el tipo de país. El código de extensión twig es

<?php namespace Tbl/SagaBundle/Twig; use Symfony/Component/Intl/Intl; class CountryExtension extends /Twig_Extension { public function getFilters() { return array( new /Twig_SimpleFilter(''countryName'', array($this, ''countryName'')), ); } public function countryName($countryCode){ return Intl::getRegionBundle()->getCountryName($countryCode); } public function getName() { return ''country_extension''; } } ?>

Añadir extensión twig en services.yml

# src/Acme/DemoBundle/Resources/config/services.yml services: acme.twig.acme_extension: class: Acme/DemoBundle/Twig/CountryExtension tags: - { name: twig.extension }

uso en la plantilla (el nombre del país se mostrará en la configuración regional de forma predeterminada (consulte Symfony / Component / Intl / ResourceBundle / RegionBundleInterface.php)

{{ user.countryCode|countryName }}

Muchas gracias a Yassir, esta versión no usa locale en desuso desde la versión 2.3 >> deprecated


No estoy seguro si aún necesitas ... pero podría ayudar a alguien más. esto se puede hacer a través de una extensión de rama fácilmente (este código se basa en la respuesta de @ tomaszsobczak)

<?php // src/Acme/DemoBundle/Twig/CountryExtension.php namespace Acme/DemoBundle/Twig; class CountryExtension extends /Twig_Extension { public function getFilters() { return array( new /Twig_SimpleFilter(''country'', array($this, ''countryFilter'')), ); } public function countryFilter($countryCode,$locale = "en"){ $c = /Symfony/Component/Locale/Locale::getDisplayCountries($locale); return array_key_exists($countryCode, $c) ? $c[$countryCode] : $countryCode; } public function getName() { return ''country_extension''; } }

Y en sus archivos services.yml

# src/Acme/DemoBundle/Resources/config/services.yml services: acme.twig.country_extension: class: Acme/DemoBundle/Twig/CountryExtension tags: - { name: twig.extension }

Ejemplo de uso dentro de un archivo twig:

{{ ''US''|country(app.request.locale) }}


Puede usar el mismo componente que Symfony está usando para el tipo de campo del país

public function humanCountry() { $c = /Symfony/Component/Locale/Locale::getDisplayCountries(''en''); return array_key_exists($this->getCountry(), $c) ? $c[$this->getCountry()] : $this->getCountry(); }


Según el comentario anterior de @Rvanlaak, / Symfony / Component / Locale / Locale ahora está en deprecated . Creo que la forma más concisa de hacer esto ahora es:

use Symfony/Component/Intl/Intl; ... $country = Intl::getRegionBundle()->getCountryName($countryCode);


Use SonanaIntlBundle, podría hacer algo como esto:

{{ ''FR'' | country }} => France (if the current locale in request is ''fr'') {{ ''FR'' | country(''de'') }} => Frankreich (force the locale) {{ ''fr'' | language }} => français (if the current locale in request is ''fr'') {{ ''fr'' | language(''en'') }} => French (force the locale) {{ ''fr'' | locale }} => français (if the current locale in request is ''fr'') {{ ''fr'' | locale(''en'') }} => French (force the locale)

Lea más sobre esto