Октябрь CMS - тип поля диапазона или пользовательский в форме создания / обновления - PullRequest
0 голосов
/ 20 сентября 2019

Мне нужно установить диапазон ввода в форме для создания и обновления.В документации CMS за октябрь я нашел решение для списка, но в реестре нет поля «диапазон».

<input type="range" min="0" max="100" step="1">

Я использую «Плагин Builder». Наиболее близким решением былофункция «макросов», но документация о функции не сильно помогла.Кто-нибудь нашел решение для создания своих собственных типов ввода или диапазона?

Ответы [ 2 ]

1 голос
/ 21 сентября 2019

October CMS - очень расширяемая платформа.Вы можете расширить каждый аспект этого.

То же самое относится и к плагину для строителей, вы можете расширить его в соответствии со своими потребностями.

Пожалуйста, подождите, этот ответ будет долгим, но вы найдете его очень полезным.

FinalРезультаты

  1. Это добавит элемент управления в контрольный список, чтобы вы могли легко добавить его и использовать его также для других полей.

enter image description here

Настраиваемый - вам не нужно редактировать какой-либо файл / частичный, чтобы изменить его значения.это все внутри плагин строителя.ваши значения [мин., макс., шаг] имя поля и т. д. все, что вы можете редактировать / обновлять из плагина компоновщика.

enter image description here

Это автоматически.означает, что метки и имена полей все будут работать как другие элементы управления, вам не нужно ничего указывать.все будет динамически.

enter image description here

Итак, давайте начнем расширять плагин компоновщика:)

  1. добавьте этот код в метод загрузки вашего плагина, он в основном добавит элемент управления в список управления плагином Builder.[1-е изображение]
public function boot() {

  \Backend\Widgets\Form::extend(function($widget) {
    $widget->addViewPath(\File::symbolizePath('~/plugins/hardiksatasiya/sotest/classes/CustomDesignTimeProvider/field_partials'));
  });

  \Event::listen('pages.builder.registerControls', function($controlLibrary) {
    $properties = [
      'min' => [
        'title' => 'Min',
        'type' => 'string',
        'default' => '0',
        'ignoreIfEmpty' => false,
        'sortOrder' => 81
      ],
      'max' => [
        'title' => 'Max',
        'type' => 'string',
        'default' => '100',
        'ignoreIfEmpty' => false,
        'sortOrder' => 82
      ],
      'step' => [
        'title' => 'Step',
        'type' => 'string',
        'default' => '10',
        'ignoreIfEmpty' => false,
        'sortOrder' => 83,
      ]
    ];

    $controlLibrary->registerControl(
      'my_range',
      'Range Field',
      'Custom Range Field',
      \RainLab\Builder\Classes\ControlLibrary::GROUP_STANDARD,
      'icon-arrows-h',
      $controlLibrary->getStandardProperties(['stretch'], $properties),
      \HardikSatasiya\SoTest\Classes\CustomDesignTimeProvider::class
    );
  });

.... your extra code ...
теперь вам нужно создать / добавить необходимые зависимые файлы plugins/hardiksatasiya/sotest/classes/CustomDesignTimeProvider.php, plugins/hardiksatasiya/sotest/classes/CustomDesignTimeProvider/partials/_control-my_range.htm и plugins/hardiksatasiya/sotest/classes/CustomDesignTimeProvider/field_partials/_field_my_range.htm'

плагины / хардиксатасия / сотест / классы / CustomDesignTimeProvider.php

<?php namespace HardikSatasiya\SoTest\Classes;

use File;
use RainLab\Builder\Classes\ControlDesignTimeProviderBase;

class CustomDesignTimeProvider extends ControlDesignTimeProviderBase {

    public function renderControlBody($type, $properties, $formBuilder)
    {
        return $this->makePartial('control-'.$type, [
            'properties'=>$properties,
            'formBuilder' => $formBuilder
        ]);
    }

    public function renderControlStaticBody($type, $properties, $controlConfiguration, $formBuilder)
    {
        $partialName = 'control-static-'.$type;
        $partialPath = $this->getViewPath('_'.$partialName.'.htm');
        if (!File::exists($partialPath)) {
            return null;
        }
        return $this->makePartial($partialName, [
            'properties'=>$properties,
            'controlConfiguration' => $controlConfiguration,
            'formBuilder' => $formBuilder
        ]);
    }

    public function controlHasLabels($type)
    {
        return true;
    }

}

плагины / хардиксатасия / сотест / классы / CustomDesignTimeProvider / partials / _control-my_range.htm

<div class="builder-blueprint-control-text">
    <i class="icon-arrows-h"></i> Range Field
</div>
в то время как вышеуказанные шаги добавят наш пользовательский элемент управления в список построителей плагинов, следующим шагом будет частичное добавление поля формы.[3-е изображение]

плагины / хардиксатасия / сотест / классы / CustomDesignTimeProvider / field_partials / _field_my_range.htm

<!-- Range -->
<?php if ($this->previewMode): ?>
    <span class="form-control"><?= $field->value ? e($field->value) : '&nbsp;' ?></span>
<?php else: ?>
    <div  style="display: flex;">
        <span style="width: 30px; margin-right: 20px;" id="<?= $field->getId() ?>_val">
            <?= $field->value ?>
        </span>
        <span>
           [<?= $field->getConfig('min') ?>]
        </span>
        <input
            type="range"
            name="<?= $field->getName() ?>"
            id="<?= $field->getId() ?>"
            value="<?= e($field->value) ?>"
            min="<?= $field->getConfig('min') ?>"
            max="<?= $field->getConfig('max') ?>"
            step="<?= $field->getConfig('step') ?>"
            oninput="(function(input) { document.getElementById('<?= $field->getId() ?>_val').innerText = input.value;  })(this)"
            <?= $field->getAttributes() ?>
        />
        <span>
            [<?= $field->getConfig('max') ?>]
        </span>
    </div>
<?php endif ?>

Эти HTML-файлы представляют собой HTML-разметку, поэтому их можно редактироватьих и добавьте css / style в соответствии с вашими потребностями.

Как только вы выполните следующие шаги, вы сможете увидеть свой custom range control в контрольном списке построителя форм.теперь вы можете добавить его, обновить его, как и любой другой элемент управления по умолчанию.

Его полностью динамический, вы можете выбрать field-name, min, max, step, и он будет применен.

Примечание: Простоубедитесь, что вы заменили author-name и plugin-name в соответствии с настройкой, указанной в предоставленном коде.

, если у вас есть какие-либо сомнения, пожалуйста, прокомментируйте.

0 голосов
/ 20 сентября 2019

Ну, это было уникально, и после некоторых исследований и испытаний я нашел способ сделать это.Отмечу, что лично я не нашел никакой причины для оправдания ползунка диапазона в форме.Поэтому я понимаю, почему у OctoberCMS его нет.

  1. Внутри плагина компоновщика вам необходимо добавить поле ввода значения, которое вы хотите сохранить, и изменить настройку только для чтения.

Photo showing the field's options.

Внутри плагина Builder вы захотите добавить частичку.Я назвал свой частичный something.htm для целей тестирования.Весь путь к частичному: $/dle/test/models/products/something.htm Обратите внимание, что $ только для вызова начальной точки поиска.

enter image description here

Не в частичном something.htm У меня есть это: label и input диапазона.Элемент range не показывает сумму, но с помощью javascript и jquery мы можем связать этот диапазон с полем цены.

<label for="priceRange">Price Range</label> 
<input id="priceRange" type="range" min="0" max="10" step=".25" onchange="updateTextInput(this.value);">

Теперь вам нужно перейти к вашему create.htm и update.htm страницы под контроллером.IE: author/plugin/controllers/controller/create.htm.Здесь я ввел javascript / jquery для подключения диапазона к полю ввода.

<script>
function updateTextInput(val) {
  document.getElementById('Form-field-Products-price').value=val; 
}

var value = $('#Form-field-Products-price').val();

$('#priceRange').val(value);
</script>

enter image description here

...