【问题标题】:Connect enums with select2 list使用 select2 列表连接枚举
【发布时间】: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 我需要用这些枚举填充列表,而不是我手动完成的枚举

标签: laravel forms enums jquery-select2


【解决方案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() 函数,您已经重写并且应该熟悉该函数
猜你喜欢
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多