Select2 с Symfony с пользовательскими тегами - PullRequest
0 голосов
/ 14 октября 2019

У меня есть senario, что я хочу выпадающий список select2, который позволяет пользователям выбирать несколько вариантов. Но когда они выбирают опцию, я хочу, чтобы панель выбора отображала аббревиатуру выбранного элемента. Прямо сейчас у меня есть массив значений ключей, где ключом является аббревиатура, а значением является полнотекстовый.

Сейчас я не могу найти способ получить «оригинальный» ключ моего массива, когда явыберите опцию. Также я не вижу ничего, что может относиться к ключу массива.

Класс формы

 $builder->add('relations', ChoiceType::class, [
    'choices' => [
        'isp' => 'Internet service provider',
        'db' => 'Database'
    ]);

Представление

{{ form_row(form.relations) }}

Javascript

<script>
    $(document).ready(function() {
        $('#form_relations').select2({
            closeOnSelect : false,
            placeholder : "Placeholder",
            allowHtml: true,
            allowClear: true,
            multiple: true
        });
    });    
</script>

Сейчас он просто будет использовать значение массива, когда вывыберите опцию, однако я хотел бы использовать сокращение. Я попытался войти выбранные параметры, но, похоже, не содержит ключ массива. Я также попытался просмотреть массив, который Symfony возвращает представлению, и он, кажется, заменяет ключи инкрементным индексом вместо того, чтобы хранить мой собственный. Есть ли способ убедиться, что Symfony будет хранить мои собственные ключи и использовать их, когда опция выбрана с помощью select2JS?

1 Ответ

0 голосов
/ 14 октября 2019

Решение должно состоять в том, чтобы установить дополнительный data-attribute к вашим параметрам. Чтобы сделать это, вы должны использовать объект , чтобы установить свой выбор. Итак, давайте сначала добавим новый класс Option:

namespace App\Model;

class MyOption 
{
    private $name;
    private $abbreviation;

    public function __construct($name, $abbreviation) {
        $this->name = $name;
        $this->abbreviation = $abbreviation;
    }

    function getName() {
        return $this->name;
    }

    function getAbbreviation() {
        return $this->abbreviation;
    }
}

Теперь создайте раскрывающийся список в своем типе формы следующим образом:

use App\Model\MyOption;
public function buildForm(FormBuilderInterface $builder, array $options) 
{
    $builder->add('relations', ChoiceType::class, [
        'choices' => [
            new MyOption('Internet service provider', 'isp'),
            new MyOption('Database', 'db'),
        ],
        'choice_label' => function(MyOption $option, $key, $value) {
            return $option->getName();
        },
        'choice_attr' => function(MyOption $option, $key, $value) {
            return ['data-abbreviation' => $option->getAbbreviation()];
        },
    ]);

}

Результат будет примерно таким:

<select id="product_option_relations" name="product_option[relations]">
    <option value="0" data-abbreviation="isp">Internet service provider</option>
    <option value="1" data-abbreviation="db">Database</option>
</select>

Далее вы сможете получить выбранное сокращение, например, с помощью jQuery:

$("#product_option_relations").find(':selected').data('abbreviation');
...