OctoberCMS: как установить автозагрузку виджета повторителя

Я могу установить виджет повторителя для автоматической загрузки при открытии формы?

он имеет свойство max item, может ли он автоматически загружаться до максимального номера элемента

так что пользователю не нужно нажимать кнопку подсказки

повторно обновлен

это мои fields.yaml

fields:
nowarta:
    label: 'No. Warta'
    oc.commentPosition: ''
    span: auto
    placeholder: 'format penulisan ''No. 34 Tahun XIX'''
    type: text
tanggal:
    label: Tanggal
    oc.commentPosition: ''
    mode: date
    format: 'd - F - Y'
    span: right
    type: datepicker
    ignoreTimezone: false
renungan:
    label: 'Renungan Mingguan'
    oc.commentPosition: ''
    span: full
    type: section
renungan[judul]:
    label: 'Judul Renungan'
    oc.commentPosition: ''
    span: storm
    type: text
    cssClass: 'col-sm-6 col-sm-push-0'
renungan[bahanbaca]:
    label: 'Bahan Bacaan'
    oc.commentPosition: ''
    span: storm
    type: text
    cssClass: col-sm-6
renungan[isi]:
    label: Renungan
    oc.commentPosition: ''
    span: storm
    cssClass: 'col-sm-12 col-sm-push-0'
    type: richeditor
    size: huge
tabs:
fields:
    temakebum:
        label: 'Kebaktian Umum'
        oc.commentPosition: ''
        span: full
        type: section
        tab: 'Kebaktian Umum & Komisi'
    temakebum[tema]:
        tab: 'Kebaktian Umum & Komisi'
        label: Tema
        oc.commentPosition: ''
        span: storm
        cssClass: col-sm-11
        type: text
    temakebum[bacaan]:
        label: 'Bahan Bacaan'
        oc.commentPosition: ''
        span: storm
        cssClass: col-sm-6
        type: text
        tab: 'Kebaktian Umum & Komisi'
    temakebum[pujian]:
        label: Pujian
        oc.commentPosition: ''
        span: storm
        cssClass: col-sm-6
        type: text
        tab: 'Kebaktian Umum & Komisi'
    kebum:
        label: ''
        oc.commentPosition: ''
        prompt: 'Tambah Data'
        maxItems: '3'
        span: full
        type: repeater
        tab: 'Kebaktian Umum & Komisi'
        form:
            fields:
                jeniskeb:
                    label: 'Jenis Kebaktian'
                    oc.commentPosition: ''
                    span: storm
                    cssClass: col-sm-4
                    type: dropdown
                    options: jenisKeb
                khotbah:
                    label: Pengkhotbah
                    oc.commentPosition: ''
                    span: storm
                    cssClass: col-sm-4
                    placeholder: ''
                    type: text

дд ($ форма-> поля)

array:6 [▼
  "nowarta" => array:5 [▶]
  "tanggal" => array:7 [▶]
  "renungan" => array:4 [▶]
  "renungan[judul]" => array:5 [▶]
  "renungan[bahanbaca]" => array:5 [▶]
  "renungan[isi]" => array:6 [▶]
]

и это то, что я сделал в контроллере, как вы хотите, чтобы это было..

class WartaRutin extends Controller
{
    public $implement = ['Backend\Behaviors\ListController','Backend\Behaviors\FormController','Backend\Behaviors\ReorderController'    ];

    public $listConfig = 'config_list.yaml';
    public $formConfig = 'config_form.yaml';
    public $reorderConfig = 'config_reorder.yaml';

    public function __construct()
    {
        parent::__construct();
        BackendMenu::setContext('Mismaiti.MyWarta', 'main-menu-item', 'side-menu-rutin');
    }

    public function formExtendFieldsBefore($form) {    
    // we are checking we are creating record or updating
    // or even we can use $form->context here but I used $model->id
    // if $form->context == 'update'
    // if $form->context == 'create'
        if(is_null($form->model->id)) {
            // create time
            $iteration = $form->fields['kebum']['maxItems'];

            if(is_numeric($iteration) && $iteration > 0) {
                $emptyFields = [];
                while($iteration > 0) {                        
                    $emptyFields[] = ['jeniskeb' => ''];
                    $iteration--;
                }
                $form->model->kebum = $emptyFields;
            }

        }

    }
}

и он возвращает ошибку, когда я пытался выполнить - я должен заменить все repeater_data в kebum

"Неопределенный индекс: kebum" в строке 30 C:\xampp\htdocs\mywarta\plugins\mismaiti\mywarta\controllers\WartaRutin.php

я что-то здесь упускаю..?

1 ответ

Решение

Хм, мы можем использовать one trick, что, как вам может понадобиться только в create time или, может быть, вы можете расширить его на update time as well,

Я использовал поле repeater_data Вы можете заменить его своим полем field

fields.yaml

fields:

    ... other fields ...

    repeater_data:
        label: Repeater
        oc.commentPosition: ''
        prompt: 'Add new item'
        maxItems: '5'
        span: auto
        type: repeater
        form:
            fields:
                title:
                    label: Text
                    oc.commentPosition: ''
                    span: auto
                    type: text
                category:
                    label: Dropdown
                    oc.commentPosition: ''
                    options:
                        1: 'Item 1'
                        2: 'Item 2'
                    span: auto
                    type: dropdown

контроллер

внутри вашего controller вам нужно добавить это method and code

public function formExtendFieldsBefore($form) {

    // we are checking we are creating record or updating
    // or even we can use $form->context here but I used $model->id
    // if $form->context == 'update'
    // if $form->context == 'create'
    if(is_null($form->model->id)) {

        // create time **logic**
        $iteration = $form->fields['repeater_data']['maxItems'];
        if(is_numeric($iteration) && $iteration > 0) {
            $emptyFields = [];
            while($iteration > 0) {

                // here you need to provide at least one field 
                // which you used in repeater I used `title`
                // and let it be empty or may be some default value 
                $emptyFields[] = ['title' => ''];
                $iteration--;
            }
            // dummy fields assignment to current form model
            $form->model->repeater_data = $emptyFields;
        }
        // **logic**

    }
    else {

        // if you need to adjust data in update time
        // you need to find difference and then need to add
        // additional dummy data as we are adding above
    }
}

Есть 2 сценария create time а также update time

Создать время

Когда пользователь создает запись, мы добавим dummy fields так репитер покажет им как они есть already there и это делается с помощью maxItems property того, что field so its fully dynamicТеперь пользователю не нужно нажимать эту кнопку.

Время обновления (предположим, maxItems=5)

Теперь для 2nd scenario у нас есть еще условие, если вы хотите, чтобы вы могли добавить некоторую логику и делать свои вещи там, предположим, что пользователь может добавлять только 2 записи одновременно, поэтому в следующий раз нам нужно добавить 3 dummy fields (2 заполнено + 3 манекена = всего 5 как maxItem), так что вы можете calculate there а также add it from else part,

Я надеюсь, что это поможет вам, если вы обнаружите какие-либо трудности, пожалуйста, прокомментируйте.

Другие вопросы по тегам