使用 select2 列表连接枚举
Posted
技术标签:
【中文标题】使用 select2 列表连接枚举【英文标题】:Connect enums with select2 list 【发布时间】:2021-01-23 15:57:13 【问题描述】:我有一个为我的数据表创建和编辑的表单,我有一个下拉菜单 looks like this
我像这样手动创建了下拉菜单:
<select name="type" id="type" class="form-control">
<option value="1">COM01</option>
<option value="2">COM02</option>
<option value="3">COM03</option>
<option value="4">COM04</option>
<option value="5">COM05</option>
<option value="6">COM06</option>
<option value="7">COM07</option>
<option value="8">COM08</option>
<option value="9">COM09</option>
</select>
但是,我使用的是Laravel Enums library by bensampo,我想用它来生成选择列表。我在一个名为 .php 的文件中有这个类
邮件消息类型
<?php
namespace App\Enums;
use BenSampo\Enum\Enum;
/**
* @method static static COM01()
* @method static static COM02()
* @method static static COM03()
* @method static static COM04()
* @method static static COM05()
* @method static static COM06()
* @method static static COM07()
* @method static static COM08()
* @method static static COM09()
* @method static static OptionOne()
* @method static static OptionTwo()
* @method static static OptionThree()
*/
final class MailMessageType extends Enum
const COM01 = 0;
const COM02 = 2;
const COM03 = 3;
const COM04 = 4;
const COM05 = 5;
const COM06 = 6;
const COM07 = 7;
const COM08 = 8;
const COM09 = 9;
我必须将这个 Enum 类与我的创建和编辑表一起使用(就像我的第一张图片),并且我需要将数字发送到我的表单使用 select2 插件脚本,而不是简单的选择器
我该怎么做?
非常感谢:D
【问题讨论】:
不确定如果您要问更复杂的问题怎么办,但您可以简单地保持选择列表不变并在 javascript 中调用$('#type').select2();
使其成为 select2 下拉列表
@JasonRoman 感谢您的回复,但我正在尝试使用枚举来做到这一点,我不想手动完成该列表这可能吗?
您的意思是要自动生成列表而不是手动生成?
@JasonRoman 我有一个名为 MailMessageType.php 的文件,带有 ENUMS by bensampo final class MailMessageType extends Enum 我需要用这些枚举填充列表,而不是我手动完成的枚举
【参考方案1】:
您可以将枚举作为键/值数组进行访问。如果你看library on GitHub
您将看到两个执行此操作的函数,static asArray(): array
和 static asSelectArray(): array
。在您的情况下,要让数组填充您的选择,您可以调用:
// returns [0 => 'COM01', 1 => 'COM02', 2 => 'COM03', ...]
MailMessageType::asSelectArray()
你可以像这样将它传递给你的模板:
return view('my.view', [
// ...
'mailMessageTypes' => MailMessageType::asSelectArray(),
]);
然后你可以在你的模板中循环遍历它:
<select name="type" id="type" class="form-control">
@foreach ($mailMessageTypes as $value => $label)
<option value=" $value ">
$label
</option>
@endforeach
</select>
然后初始化select2实例:
$('#type').select2();
更新
asSelectArray()
函数假定枚举库的版本为 3.3.0,但对于版本 2.x,该函数为 toSelectArray()
。
此外,该库使用名为getFriendlyKeyName()
的静态函数将密钥转换为字符串。在这种情况下,它认为大写字母是一个新词,并在每个字母之间放置一个空格,因此得到C o m01
。但是它提供了一个Localization 功能,允许您specify how the strings should be converted。在你的情况下,你会像这样制作一个文件:
// resources/lang/en/enums.php
<?php
use App\Enums\MailMessageType;
return [
MailMessageType::class => [
MailMessageType::COM01 => 'COM01',
MailMessageType::COM02 => 'COM02',
MailMessageType::COM03 => 'COM03',
MailMessageType::COM04 => 'COM04',
MailMessageType::COM05 => 'COM05',
MailMessageType::COM06 => 'COM06',
MailMessageType::COM07 => 'COM07',
MailMessageType::COM08 => 'COM08',
MailMessageType::COM09 => 'COM09',
],
];
此翻译优先,应为您提供正确转换的字符串。您还必须正确扩展您的枚举类:
use BenSampo\Enum\Enum;
use BenSampo\Enum\Contracts\LocalizedEnum;
final class MailMessageType extends Enum implements LocalizedEnum
// ...
如果您不想使用本地化,您可以单独override the getDescription()
method。
【讨论】:
非常感谢!!但是我的枚举版本很旧,我只有“toselectarray”,没关系,它可以工作,但选项在我看来是“C o m01” 我会相应地更新我的答案,这是因为 Enum 库转换值的方式 更新了我的答案,解释了为什么选项会这样显示,并指出旧版本功能toSelectArray()
非常感谢!!最后我用 public static function getDescription($value): string return 'COM0' 覆盖 getDescription() 。 $价值;返回父级::getDescription($value); // TODO: 更改自动生成的存根 谢谢!!
我为枚举库链接的文档包含您需要的所有信息,应该是 getDescription()
函数,您已经重写并且应该熟悉该函数以上是关于使用 select2 列表连接枚举的主要内容,如果未能解决你的问题,请参考以下文章