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)