nakukryskin / orchid-repeater-field

此包已被废弃且不再维护。未建议替代包。

将重复字段支持添加到Orchid RAD平台。


README

Support Ukraine Badge

Orchid Platform Repeater Field

简介

我们都曾在某个时候使用过WordPress。受Advanced Custom Fields的启发。

此包将重复字段支持添加到Orchid RAD平台

预要求

您必须已安装并配置Orchid Platform

版本支持: .*

对于^13.0.1版本,请使用^13.0.0标签及更高版本。

旧版本不支持当前大多数功能。

对于6.*版本,请使用2.0.5标签

对于5版本,请使用1.0.0标签

对于4.7.1版本,请使用0.0.8标签

如何使用

  1. 使用composer安装包: composer require nakukryskin/orchid-repeater-field

    laravel的最新版本将自动发现并使用包。

  2. 在您的Orchid布局目录中创建RepeaterFields.php。示例

 <?php
 
 namespace App\Http\Orchid\Layouts\Repeaters;
 
 use Orchid\Screen\Layouts\Rows;
 use Orchid\Screen\Fields\Input;
 use Orchid\Screen\Fields\Select;
 
 class RepeaterFields extends Rows
 {
     function fields(): array
     {
         return [
             Input::make('repeater_name')
                 ->type('text')
                 ->max(255)
                 ->required()
                 ->title('Nested Field'),
             
             Select::make('select.')
                 ->multiple()
                 ->options([
                     'test' => 'Test',
                     'test2' => 'Test2'
                 ])
                 ->required()
         ];
     }
 }
  1. 只需在您的屏幕中开始添加RepeaterField::make('repeater')即可:示例
public function layout(): array
{
   return [
       Layout::rows([
           RepeaterField::make('repeater')
               ->title('Repeater')
               ->layout(App\Http\Orchid\Layouts\Repeaters\RepeaterFields::class),
       ])
   ];
}
  1. 打开您的屏幕并检查此处是否有重复字段

高级使用

重复字段也支持必需、最大和最小参数。您可以通过调用RepeaterField来添加这些参数。

RepeaterField::make('repeater')
    ->title('Repeater')
    ->layout(App\Http\Orchid\Layouts\Repeaters\RepeaterFields::class)
    ->required()
    ->min(10)
    ->max(20)

如果将->required()传递给构造函数,则自动将min设置为1。如果用户尝试删除此字段,则会阻止并显示消息。

您还可以使用->confirmText('Are you sure that you want to delete the block?')方法更改删除块时的文本。

要显示保存时的必需消息,您必须将此规则添加到您的屏幕规则中,例如'content.*.repeater' => 'required'

您还可以使用buttonLabel()方法重命名按钮标签。例如。

RepeaterField::make('repeater')
    ->title('Repeater')
    ->layout(App\Http\Orchid\Layouts\Repeaters\RepeaterFields::class)
    ->buttonLabel('Add new repeater field')

在极端情况下,如果您正在使用某种动态数据加载,并且需要将附加数据传递到您的布局中,请使用->ajaxData()方法。此方法可以与可调用的函数和数组数据一起工作。这在您需要为每个字段过滤数据时非常有用。

要使用ajaxData,首先将trait AjaxDataAccess连接到您的布局

<?php

namespace App\Orchid\Layouts;

use Nakukryskin\OrchidRepeaterField\Traits\AjaxDataAccess;
use Orchid\Screen\Layouts\Rows;
use Orchid\Screen\Fields\Input;
use Orchid\Screen\Fields\Select;

class RepeaterFields extends Rows
{
    use AjaxDataAccess;

    public function fields(): array
    {
        return [
            Select::make('select.')
                ->title('Select')
                ->multiple()
                ->options($this->getSelectOptions())
                ->required(),
        ];
    }
    
    protected function getSelectOptions() {
        return $this->getAjaxData()->get('select_options');
    }
}

之后,在主屏幕上,确定您想要传输的内容。在示例中,我们根据当前用户角色生成列表

Repeater::make('repeater')
      ->title('Repeater')
      ->layout(\App\Orchid\Layouts\RepeaterFields::class)
      ->ajaxData(function () {
          $data = [
              'select_options' => [
                  'default' => 'Default option',
              ],
          ];
   
          if (request()->user()->id === 1) {
              $data['select_options']['only_first'] = 'Option only for user with id #1';
          }
   
          return $data;
      }),

Dynamic ajax data with anonymous function

您可以在重复字段中结合输出选项和向用户输出什么以及何时输出的内容。请注意,您的布局不知道当前屏幕上其他字段的当前状态,并且如果您想要传输有关当前字段的任何数据,您必须首先保存记录并使用主屏幕的数据和查询。

Repeater::make('repeater')
         ->title('Repeater')
         ->layout(\App\Orchid\Layouts\RepeaterFields::class)
         ->ajaxData([
             'select_options' => [
                 'default' => $this->query()['name'] ?? 'Default Name',
             ],
         ]),

Using other field from query to