Select2 与带有自定义标签的 Symfony
Select2 with Symfony with custom tags
我的 senario 是我想要一个 select2 下拉列表,它允许用户 select 多个选项。但是当他们 select 一个选项时,我想让 select 栏显示 selected 项目的缩写。现在我有一个键值数组,其中键是缩写,值是全文。
现在,当我 select 一个选项时,我找不到获取数组的 "original" 键的方法。我也看不到任何与数组键相关的内容。
表格class
$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>
现在,当您 select 一个选项时,它只会使用数组的值,但我想使用缩写。我尝试记录 selected 选项,但这似乎不包含数组的键。我还尝试查看 symfony 返回视图的数组,它似乎用增量索引替换键而不是保留我自己的键。有没有一种方法可以确保 symfony 保留我自己的密钥并在使用 select2JS selected 选项时使用这些密钥?
解决方案应该是为您的选项设置一个额外的数据属性。为此,您应该使用 object 来设置您的选择。所以让我们先添加一个新的选项class:
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;
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');
我的 senario 是我想要一个 select2 下拉列表,它允许用户 select 多个选项。但是当他们 select 一个选项时,我想让 select 栏显示 selected 项目的缩写。现在我有一个键值数组,其中键是缩写,值是全文。
现在,当我 select 一个选项时,我找不到获取数组的 "original" 键的方法。我也看不到任何与数组键相关的内容。
表格class
$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>
现在,当您 select 一个选项时,它只会使用数组的值,但我想使用缩写。我尝试记录 selected 选项,但这似乎不包含数组的键。我还尝试查看 symfony 返回视图的数组,它似乎用增量索引替换键而不是保留我自己的键。有没有一种方法可以确保 symfony 保留我自己的密钥并在使用 select2JS selected 选项时使用这些密钥?
解决方案应该是为您的选项设置一个额外的数据属性。为此,您应该使用 object 来设置您的选择。所以让我们先添加一个新的选项class:
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;
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');