使用 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(): arraystatic 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 列表连接枚举的主要内容,如果未能解决你的问题,请参考以下文章

Yii2:Gridview过滤器中的kartik\Select2下拉列表

使用连接创建动态数据透视表列表

使用多个“和”连接多个表

表连接方式

如何使用3表连接zend / sql获取对象列表?

从连接表列表中选择唯一的列名