Настройки дополнения

Простые настройки дополнения

Под простыми настройками понимается форма настроек дополнения в панели управления, поля в которую добавляются посредством объявления их в методе init дополнения. Указываются они в форме массива следующим образом:

$this->configSettings(array(
    'key1' => array( // Уникальный ключ настройки, допустимые символы: a-z, A-Z, 0-9, -, _
        'title' => 'Название поля отображаемое в форме',
        'title.description' => 'Описание поля отображаемое под названием поля в виде серого текста уменьшенного размера',
        'description' => 'Дополнительное описание отображаемое под полем',
        'tip' => 'Всплывающая подсказка в виде иконки-вопроса возле названия поля или справа от поля (в случае поля ввода числа)',
        'placeholder' => 'Пример значения для текстовых полей ввода (text, textarea, password)',
        'input' => 'Тип поля: text, textarea и т.п. Все доступные типы полей описаны ниже',
        'type' => 'Тип данных: TYPE_STR, TYPE_BOOL, ... Возможно указать тип отличный от типа по умолчанию',
        'default' => 'Значение по умолчанию, должно соответствовать типу данных поля, для избежания ошибок с приведением типов',
        'required' => true/false, // Обязательное поле, по умолчанию - false
        'readonly' => true/false, // Поле доступно только для чтения, без возможности изменить в нем значение указываемое в настройке "default", по умолчанию - false
        'onChange' => function($newValue, $oldValue){
            // Функция выполняющая выполнить дополнительную валидацию указываемого пользователем значения.
            // Применимо ко всем типам полей, предполагающих выбор / ввод значения пользователем.
            // Пример проверки нового значения:
            // if (empty($newValue)) {
            //    $this->errors->set('Ошибка при проверке нового значения');
            //    return false;
            // }
            return $newValue; // Возвращает итоговое значение настройки или false в случае ошибки
        },
    ),
    'key2' => array(
        // ...
    ),
));

В дополнении к указанным настройкам у поля также могут быть специфичные дополнительные настройки, смотрите пример их объявления в настройках каждого типа. В дальнейшем обращение к данным настройкам, а вернее получение значений указанных в форме, возможно при помощи метода $this->config, например:

$value1 = $this->config('key1');

Также доступен метод $this->configUpdate выполняющий изменение значения настройки и его сохранение:

$this->configUpdate('key1', 'value');

Текстовые поля

Поле ввода текста:

array(
    'text1' => array(
        'title' => 'Однострочный текст',
        'input' => 'text',
        //'width' => 100, // Ширина поля в пикселях (100, '100px', '50%'), по умолчанию на всю ширину
    ),
    'text2' => array(
        'title' => 'Многострочный текст',
        'input' => 'textarea',
    ),
);

Тип данных по умолчанию - TYPE_STR.
По умолчанию текстовые поля являются мультиязычными и при включении нескольких языков в проекте возможно указать значение для каждого из языков, отключить это можно указав 'lang' => false,. При получении значения также можно указать требуемую версию языка:

$text1 = $this->config('text1');
$text1_ru = $this->config('text1', '', 'ru');

Флаг (отметка)

Поле отметки (да/нет).

array(
    'key' => array(
        'title' => 'Название',
        'description' => 'Описание отображаемое справа от отметки',
        'input' => 'checkbox',
    ),
);

Тип данных по умолчанию - TYPE_BOOL.

Группа отметок

Группа отметок да/нет для выбора нескольких значений.

array(
    'key' => array(
        'title' => 'Название',
        'input' => 'checkbox-group',
        'options' => array(
            1 => array('title' => 'Отметка №1'),
            2 => array('title' => 'Отметка №2'),
            //...
        ),
    ),
);

Тип данных по умолчанию - TYPE_ARRAY, для приведения к нужному типу используйте TYPE_ARRAY_, например TYPE_ARRAY_UINT. Сохраненные данные возвращаются ($this->config()) в виде массива.

Выпадающий список (select)

Поле для выбора одного значения из списка доступных.

array(
    'key' => array(
        'title' => 'Название',
        'input' => 'select',
        'options' => array( // Также здесь может быть функция (callback) возвращающая массив схожей структуры
            '1' => array('title' => 'Вариант №1'),
            '2' => array('title' => 'Вариант №2', 'description' => 'Дополнительное описание, отображаемое в случае если вариант выбран'),
            //...
        ),
    ),
);

Тип данных по умолчанию - TYPE_STR.

Пароль (password)

Поле для ввода пароля.

array(
    'key' => array(
        'title' => 'Название',
        'input' => 'password',
    ),
);

Тип данных по умолчанию - TYPE_NOTRIM (строка без обработки). Значение хранится в зашифрованном виде и не отображается при редактировании.
Также при необходимости можно принудительно шифровать значение любого из полей указав в настройках поля 'encrypt' => true,

Число

Поле для ввода числа.

array(
    'key' => array(
        'title' => 'Название',
        'input' => 'number',
        'min' => 5, // Минимально допустимое значение
        'max' => 100, // Максимально допустимое значение
        'tip' => $this->lang('мин'), // Пример краткого описания, например единицы в которых указывается значение 
    ),
);

Тип данных по умолчанию - TYPE_UINT (беззнаковое целое).
Настройка tip будет отображаться справа от поля в случае если текст не длиннее 15 символов.

Изображение

Поле для загрузки файлов изображений.
Допустимые расширения: jpg, jpeg, gif, png, svg

array(
    'image1' => array(
        'title' => 'Название',
        'input' => 'image',
        'image' => array(
            'sizes' => array(
                'small' => array(
                    'width'    => 100, 'height'   => false,
                    'vertical' => array('width' => false, 'height' => 100)
                ),
                'view' => array(
                    'width'    => 800, 'height'   => false,
                    'vertical' => array('width' => false, 'height' => 800)
                ),
            ),
            //'maxSize' => 10485760, # Максимально допустимый размер файла изображения в байтах
            'limit' => 1, # Максимально доступное кол-во загружаемых файлов изображений
        ),
    ),
);

В поле sizes указываются все необходимые изображения в которых будет сохранено исходное загружаемое изображение.
Текстовый ключ размера должен быть уникальным и указываться латиницей, допустимые символы: a-z, A-Z, 0-9, -, _ Для получения URL загруженного файла изображения используйте метод $this->configImages:

$url = $this->configImages('image1', 'small'); // Вторым параметром указывается ключ требуемого размера
// В случае если в настройке limit указано значение 2 и более метод вернет список URL требуемого размера 

Файл

Поле для загрузки одного файла.
Допустимые расширения по умолчанию: jpg,jpeg,gif,png,bmp,tiff,ico,odt,doc,docx,docm,xls,xlsx,xlsm,ppt,rtf,pdf,djvu,zip,gzip,gz,7z,rar,txt,xml

array(
    'file1' => array(
        'title' => 'Название',
        'input' => 'file',
        'file' => array(
            // Дополнительные настройки:
            //'extensionsAllowed' => 'png,svg,ico',
            //'maxSize' => 3145728, // максимально допустимый размер загружаемого файла в байтах
            //'publicStore' => true/false, // true - после загрузки файлы доступны по прямой ссылке (URL)
        ),
    ),
);

Для получения URL загруженного файла используйте метод $this->configFiles:

$url = $this->configFiles('file1');

В случае если загружаемый файл не должен быть доступен по прямой ссылке после загрузки, можно изменить директорию хранения на /files/extensions/ следующим образом:

'file' => array(
    'publicStore' => false,
),

Дополнительные типы полей

Скрытое поле

Поле не отображаемое в форме, но значение которого может быть указано/изменено в дополнении.
Зачастую необходимо для данных формируемых в процессе установки, получаемых из внешних источников.

array(
    'key' => array(
        'title' => 'Название',
        'input' => 'hidden',
    ),
);

Тип данных по умолчанию - TYPE_STR.

Разделитель

Поле разделящее поля горизонтальной полосой <hr />.
Зачастую необходимо для данных формируемых в процессе установки, получаемых из внешних источников.

array(
    'key' => array(
        'input' => 'divider',
    ),
);

Тип данных по умолчанию - TYPE_STR.
Ключ поля при этом может быть указан например D1, D2.

Заголовок

Поле-заголовок для группы полей.

array(
    'key' => array(
        'title' => 'Заголовок',
        'input' => 'title',
    ),
);

Тип данных по умолчанию - TYPE_STR.
Ключ поля при этом может быть указан например D1, D2.

Табы настроек

В случае если настроек много и необходимо разделить их на несколько табов сделать это можно следующим образом:

$this->configSettings(array(
    'key1' => array(
        'title' => 'Поле №1',
        'input' => 'text',
        'tab'   => 'tabKey1', // ключ таба 1
    ),
    'key2' => array(
        'title' => 'Поле №2',
        'input' => 'text',
        'tab'   => 'tabKey2', // ключ таба 2
    ),
), array(
    'tabs' => array(
        'tabKey1' => array( // Уникальный ключ таба, допустимые символы: a-z, A-Z, 0-9, -, _
            'title' => 'Таб №1',
        ),
        'tabKey2' => array(
            'title' => 'Таб №2',
        ),
    ),
));

В примере настройка key1 будет отображаться в табе №1, а настройка key2 в табе №2.

Видимость полей

Простые поля формы могут быть взаимосвязаны между собой посредством настроек видимости, например следующим образом:

array(
    'key1' => array(
        'title' => '№1',
        'input' => 'checkbox',
    ),
    'key2' => array(
        'title' => '№2',
        'input' => 'checkbox',
        'visibleIf' => ['key1' => true],
    ),
    'key3' => array(
        'title' => '№3',
        'input' => 'checkbox',
        'hiddenIf' => ['key1' => true, 'key2' => true],
    ),
);

В примере поле №2 будет отображаться только если было отмечено поле №1, а поле №3 будет скрыто если было отмечена одно из полей №1 или №2. В параметре hiddenIf/visibleIf указывается список полей в формате 'ключ поля'=>'значение поля'.

Настройки и компонент Формы

Более сложные настройки дополнения могут формироваться на основе компонента Формы. Сделать это можно в методе init() дополнения следующим образом:

    /** @var \bff\extend\extension\settings\Form  */
    public $settings;

    public function init()
    {
        parent::init();
        
        $this->settings = $this->configSettingsForm($this->langAdmin('Настройки'));
        $this->settings->tab('tab1', $this->langAdmin('Основные настройки'));
        $this->settings->text('title', $this->langAdmin('Заголовок'));
        $this->settings->checkbox('enabled', $this->langAdmin('Выключено'));
        
        $this->configSettings(array(
            // ...
        ));
        
    }

Обратите внимание что вызов метода configSettings также обязателен и должен выполняться после вызова configSettingsForm. О всех доступных типах полей форм читайте в статье "Поля формы".