toutouwai/fieldtype-dynamic-options

一个用于在运行时生成动态选项的ProcessWire Fieldtype模块。

v0.1.7 2021-11-15 07:37 UTC

This package is auto-updated.

Last update: 2024-10-03 06:06:37 UTC


README

一个ProcessWire CMS/CMF模块。通过钩子动态生成选项的字段类型。

配置

输入字段类型

您可以在动态选项字段的详细信息标签页中选择一系列输入字段类型。根据所选输入字段类型是用于“单选”还是“多选”,您的字段将返回字符串或数组。

最大项目数

您可以为字段定义最大项目数。当达到限制时,该模块支持的输入字段将变为禁用。此选项仅适用于您已选择用于多选的输入字段类型。

格式化为Pagefile/Pageimage对象

如果字段将存储指向Pagefiles/Pageimages的路径/URL,则可以启用此选项,以便格式化值是“单个”字段的Pagefile/Pageimage对象或“多个”字段的Pagefile/Pageimage对象数组。

有一个相关的选择图片输入字段模块,允许您直观地选择图片缩略图。

定义可选项

动态选项字段的可选项应在/site/ready.php中的FieldtypeDynamicOptions::getSelectableOptions钩子中设置。钩子应返回一个数组,其格式为'value' => 'label'。

一个示例钩子在动态选项字段的详细信息标签页中显示

$wire->addHookAfter('FieldtypeDynamicOptions::getSelectableOptions', function(HookEvent $event) {
    // The page being edited
    $page = $event->arguments(0);
    // The Dynamic Options field
    $field = $event->arguments(1);
    if($field->name === 'your_field_name') {
        $event->return = [
            'red' => 'Red',
            'green' => 'Green',
            'blue' => 'Blue',
        ];
    }
});

格式化值

如果动态选项字段使用“单个”输入类型,则其格式化值是一个字符串;如果使用“多个”输入类型,则其格式化值是一个数组。动态选项字段的未格式化值始终是一个数组。

有关将格式化值设置为Pagefile/Pageimage对象(s)的选项的描述,请参阅上面的配置部分。

可能的用途示例

dynamic-options

$wire->addHookAfter('FieldtypeDynamicOptions::getSelectableOptions', function(HookEvent $event) {
    // The page being edited
    $page = $event->arguments(0);
    // The Dynamic Options field
    $field = $event->arguments(1);

    // Select from the "files" field on the page
    if($field->name === 'select_files') {
        $options = [];
        foreach($page->files as $file) {
            // Value is basename, label is description if one exists
            $options[$file->basename] = $file->get('description|basename');
        }
        $event->return = $options;
    }

    // Select from files in a folder
    if($field->name === 'select_folder_files') {
        $options = [];
        $path = $event->wire()->config->paths->root . 'my-folder/';
        $files = $event->wire()->files->find($path);
        foreach($files as $file) {
            // Value is full path, label is basename
            $options[$file] = str_replace($path, '', $file);
        }
        $event->return = $options;
    }

    // Select from non-system templates
    if($field->name === 'select_template') {
        $options = [];
        foreach($event->wire()->templates as $template) {
            if($template->flags & Template::flagSystem) continue;
            $options[$template->id] = $template->name;
        }
        $event->return = $options;
    }

    // Select from non-system fields
    if($field->name === 'select_field') {
        $options = [];
        foreach($event->wire()->fields as $field) {
            if($field->flags & Field::flagSystem) continue;
            $options[$field->id] = $field->name;
        }
        $event->return = $options;
    }

    // Select from FormBuilder forms
    if($field->name === 'select_formbuilder_form') {
        $form_names = $event->wire()->forms->getFormNames();
        // Use form names as both keys and values
        $event->return = array_combine($form_names, $form_names);
    }

});