Настройки блока

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

 

1. Настройки блока по умолчанию

Очевидно, что почти каждый блок должен обладать настройками по-умолчанию, чтобы он мог работать сразу же, как только будет добавлен. Для этого в классе блока можно определить метод getDefaultSettings(), который должен вернуть массив стандартных настроек. Эти же настройки будут использоваться, если пользователь выполнит сброс уже настроенного блока до заводских настроек. Пример метода приведен ниже:

// Стандартные настройки блока
public function getDefaultSettings()
{
    return array(
        'background_color' => '#ebebeb',
        'text_color' => '#393939',
        'links_color' => '#393939',
        'links_hover_color' => '#00aaf8',
        'my_custom_setting' => '1',
    );
}

 

2. Дополнительные переменные в шаблоне настроек

По умолчанию, система передает в шаблон настроек переменные $block_id и $settings, которые содержат идентификатор блока и его настройки, однако, Вы можете передать дополнительные переменные, переопределив метод getSettingsHtml(). Пример приведен ниже:

public function getSettingsHtml()
{
    if(!$this->id) { return ''; }
    $view = wa()->getView();
    $view->assign('block_id', $this->id);
    $view->assign('settings', $this->getSettings());

    // Дополнительно передадим информацию о блоке
    $view->assign('myCustomInfo', static::getInfo());

    return $view->fetch($this->getSettingsTemplatePath());
}

 

3. Сохранение настроек блока

Вам не обязательно писать отдельный контроллер в своем плагине или блоке, чтобы сохранить настройки, так как он уже есть в системе. Его адрес: ?module=block&action=saveSettings, куда Вы должны передать методом POST массив settings[], обязательным элементом которого является settings[id] - идентификатор блока. Чтобы еще больше упростить задачу, мы создали небольшой jQuery-плагин fSend, который распространяется по лицензии MIT, и он уже есть в стандартной поставке Конструктора. Поэтому, форма с настройками легко делается вот так:

<form class="l-form my-block-settings-form mt10" action="?module=block&action=saveSettings">
    <input type="hidden" name="settings[id]" value="{$block.id|escape}">
    <div class="field">
        <div class="name">Моя настройка</div>
        <div class="value">
            <input type="text" name="settings[my_custom_setting]" value="{$settings.my_custom_setting|escape}"><br>
            <span class="hint">Комментарий к моей настройке</span>
        </div>
    </div>
    <div class="field">
        <input type="submit" class="l-button" value="Сохранить">
        <span class="form-preloader" style="display: none;"></span>
        <span class="form-message"></span>
    </div>
</form>
<script type="text/javascript">
    $(document).ready(function() {
         $('.my-block-settings-form').fSend(function(jData) {
             // Дополнительные действия, если требуется
         });   
    });
</script>

Такая форма сама передаст данные, примет ответ и покажет прелоадер, все включено!

 

4. Собственные методы сохранения настроек

Вы можете создать в блоке собственный метод-обработчик, аналогичный по функциональности контроллеру плагина, чтобы в нём принять данные так, как нужно, и обработать их по Вашему алгоритму. Это делается в два этапа:

Сначала создайте в блоке метод с произвольным именем, который и будет обрабатывать настройки. Например:

// Особый обработчик для сохранения настроек
public function myCustomSettingsSave()
{
    $setting = waRequest::post('my_custom_setting', '', 'string');
    // Тут можно добавить любой код для обработки
    return array(
        'result' => 1,
        'message' => 'Отлично, сохранили настройку, значение:'.htmlspecialchars($setting, ENT_QUOTES)
    );
}

Теперь требуется сделать так, чтобы блок знал, в каком случае ему требуется вызывать этот метод. Для этого служит метод execMap(), который возвращает массив соответствий идентификаторов вызова именам методов.

// Карта выполнения бекенд-методов
public function execMap()
{
    return array(
        'myCustom' => 'myCustomSettingsSave',
    );
}

Все почти готово. Теперь, чтобы вызвать созданный метод блока, можно отправить запрос на url вида: 

?module=block&action=exec&block_id={$block.id|escape}&func=myCustom

Как видно, параметр block_id содержит идентификатор блока, а func - идентификатор метода.

 

5. Обновление предпросмотра

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

$('.preview-reload').trigger('click');

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