Как отобразить шрифт удивительный значок в форме symfony

Я хочу показать весь шрифт awesome icon в опции выбора с помощью Symfony Form Builder.

Я добавляю поле select:

$choices = $this->getFontAwesome(); $form->add( $key, ChoiceType::class, array('label' => 'Texte', 'choices' => $choices, 'attr' => array('class' => "fa" ) ) ); 

Моя функция getFontAwesome ();

  public function getFontAwesome(){ $webroot = $this->get('kernel')->getRootDir() . '/../web'; $pattern = '/\.(fa-(?:\w+(?:-)?)+):before\s+{\s*content:\s*"\\\\(.+)";\s+}/'; $subject = file_get_contents( $webroot . '/assets/vendor/font-awesome/css/font-awesome.css'); preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER); foreach($matches as $match) { $icons[$match[1]] = '&#x' . $match[2] . ';' ; } return $icons ; } 

Но в поле выбора не видите значок:

Поле показывает код, а не значок

введите описание изображения здесь

Как я могу сделать ? Я пытаюсь htmlspecialschars и другие (htmlentities, ..), но не работают.

Если вы не используете какие-либо js-плагины, такие как Select2 или Bootstrap-select , у вас есть http://jsfiddle.net/NyL7d/ эту возможность, но нам нужно немного поработать.

Во-первых, сказать, что использование <i class="fa fa-heart"></i> качестве метки не является выбором, поскольку элемент <option> не может содержать дочерние элементы, а только текст. ( см. соответствующий вопрос )

Для повторного использования создадим тип формы с именем «IconChoiceType» как дочерний элемент «ChoiceType»:

 namespace AppBundle\Form\Type; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\FormView; use Symfony\Component\OptionsResolver\OptionsResolver; class IconChoiceType extends AbstractType { /** * Cache for multiple icon fields or sub-requests. * * @var array */ private $choices; private $kernelRootDir; public function __construct($kernelRootDir) { $this->kernelRootDir = $kernelRootDir; } public function buildView(FormView $view, FormInterface $form, array $options) { // Pass this flag is necessary to render the label as raw. // See below the twig field template for more details. $view->vars['raw_label'] = true; } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ 'attr' => [ // It's the key of the solution and can be done in many ways. // Now, the rendered <select> element will have a new font. 'style' => "font-family: 'FontAwesome';" ], 'choices' => $this->getFontAwesomeIconChoices(), ]); } public function getParent() { return ChoiceType::class; } protected function getFontAwesomeIconChoices() { if (null !== $this->choices) { // don't to load again for optimal performance. // useful for multi-icon fields and sub-requests. return $this->choices; } // BTW we could configure the path to the "font-awesome.css". $fontAwesome = file_get_contents($this->kernelRootDir.'/../web/assets/vendor/font-awesome/css/font-awesome.css'); // this regular expression only works with uncompressed version (not works with "font-awesome.min.css") $pattern = '/\.(fa-(?:\w+(?:-)?)+):before\s+{\s*content:\s*"\\\\(.+)";\s+}/'; if (preg_match_all($pattern, $fontAwesome, $matches, PREG_SET_ORDER)) { foreach ($matches as list(, $class, $code)) { // this may vary depending on the version of Symfony, // if the class name is displayed instead of the icon then swap the key/value $this->choices['&#x'.$code.';'] = $class; } } return $this->choices; } } 

и их соответствующую службу регистрации:

 # app/config/service.yml services: app.form.icon_choice_type: class: AppBundle\Form\Type\ChoiceIconType # Symfony has already a container parameter to the kernel root directory. arguments: ['%kernel.root_dir%'] tags: - { name: form.type } 

хорошо, пока нет другого результата, отличный от вашего.

 <select id="form_icon" name="form[icon]" style="font-family: 'FontAwesome';"> <option value="fa-glass">&#xf000;</option> <option value="fa-music">&#xf001;</option> ... </select> 

введите описание изображения здесь

Где сейчас проблема? Семейство шрифтов <select> готово, но значки, которые они не показывают, почему?

По умолчанию в Symfony среда Twig экранирует все значения, которые отображаются с помощью htmlspecialchars ( подробнее ), поэтому нам нужно переписать это поведение только для этого типа формы. Для этого мы создаем шаблон fields.html.twig в fields.html.twig app/Resources/views/form и копируем этот код внутри:

 {# app/Resources/views/form/fields.html.twig #} {# here isn't need to create the expected `icon_choice_widget` like shown the documentation, because this looks equal to `choice_widget` from `ChoiceType`, only we need overwrite the block that renders the label. #} {%- block choice_widget_options -%} {% for group_label, choice in options %} {%- if choice is iterable -%} <optgroup label="{{ choice_translation_domain is same as(false) ? group_label : group_label|trans({}, choice_translation_domain) }}"> {% set options = choice %} {{- block('choice_widget_options') -}} </optgroup> {%- else -%} {# this line has been overwritten, see {{- block('choice_option_label') -}} to end #} <option value="{{ choice.value }}"{% if choice.attr %} {% set attr = choice.attr %}{{ block('attributes') }}{% endif %}{% if choice is selectedchoice(value) %} selected="selected"{% endif %}>{{- block('choice_option_label') -}}</option> {%- endif -%} {% endfor %} {%- endblock choice_widget_options -%} {%- block choice_option_label -%} {# this block has been called from choice_widget_options block #} {%- if raw_label|default(false) -%} {# the label is rendered as raw when IconChoiceType is used #} {{ choice_translation_domain is same as(false) ? choice.label|raw : choice.label|trans({}, choice_translation_domain)|raw }} {%- else -%} {{ choice_translation_domain is same as(false) ? choice.label : choice.label|trans({}, choice_translation_domain) }} {%- endif -%} {%- endblock -%} 

Обратите внимание, что {{ choice.label|raw }} raw отображает необработанный текст, который хранится (он предотвращает экранирование), в метку, в данном случае содержимое шрифта значка.

наконец, вам необходимо зарегистрировать тему формы, например, описать документацию :

 # app/config/config.yml {# ... #} twig: form_themes: - 'form/fields.html.twig' 

Вывод:

 $form->add('icon', IconChoiceType::class); 

введите описание изображения здесь