将枚举与 select2 列表连接

Connect enums with select2 list

我有一个用于我的数据表的创建和编辑表单,我有一个下拉列表 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,我想用它来生成 select 列表。我在名为

的 .php 文件中有这个 class

MailMessageType

<?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; }

我必须将此枚举 class 与我的创建和编辑表(如我的第一张图片)一起使用,并且我需要使用 select2 作为数字发送到我的表单 插件脚本,不是简单的select或

我该怎么做?

非常感谢:D

您可以将枚举作为 key/value 数组访问。如果您查看 library on GitHub 您将看到执行此操作的两个函数 static asArray(): array and static asSelectArray(): array。在你的情况下,要让数组填充你的 select 你会打电话:

// 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() to convert the key to a string. In this case it thinks a capital letter is a new word and puts a space between each, hence getting C o m01. However it provides a Localization feature which allows you to 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',
    ],
];

此翻译优先,应该会为您提供正确转换的字符串。您还必须正确扩展枚举 class:

use BenSampo\Enum\Enum;
use BenSampo\Enum\Contracts\LocalizedEnum;

final class MailMessageType extends Enum implements LocalizedEnum
{
    // ...
}

如果您不想使用本地化,您可以单独 override the getDescription() method