选择2 with Symfony with custom tags

选择2 with Symfony with custom tags,symfony,jquery-select2,Symfony,Jquery Select2,我的建议是我想要一个select2下拉列表,允许用户选择多个选项。但是当他们选择一个选项时,我想让选择栏显示所选项目的缩写。现在我有一个键值数组,其中键是缩写,值是全文 现在,当我选择一个选项时,我找不到获取数组“原始”键的方法。我也看不到任何与数组键相关的内容 形式类 看法 Javascript $(文档).ready(函数(){ $(“#形成关系”)。选择2({ closeOnSelect:false, 占位符:“占位符”, allowHtml:是的, allowClear:是的, 多重:

我的建议是我想要一个select2下拉列表,允许用户选择多个选项。但是当他们选择一个选项时,我想让选择栏显示所选项目的缩写。现在我有一个键值数组,其中键是缩写,值是全文

现在,当我选择一个选项时,我找不到获取数组“原始”键的方法。我也看不到任何与数组键相关的内容

形式类 看法 Javascript

$(文档).ready(函数(){
$(“#形成关系”)。选择2({
closeOnSelect:false,
占位符:“占位符”,
allowHtml:是的,
allowClear:是的,
多重:对
});
});    

现在,当您选择一个选项时,它将只使用数组的值,但是我想使用缩写。我尝试记录所选选项,但这似乎不包含数组的键。我还尝试查看symfony返回到视图的数组,它似乎用增量索引替换键,而不是保留我自己的索引。是否有办法确保symfony保留我自己的密钥,并在使用select2JS选择选项时使用这些密钥?

解决方案应该是为您的选项设置额外的数据属性。为此,您应该使用对象来设置您的选择。因此,让我们先添加一个新的选项类:

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;
    }
}
现在在formType中创建下拉列表,如下所示:

use App\Model\MyOption;
结果是:

<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>
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>
$("#product_option_relations").find(':selected').data('abbreviation');