Меняем форму отправки сообщения

В SMF 2.1 можно кастомизировать форму отправки сообщения по своему вкусу. Для этого предназначен массив $context['posting_fields'], объявляющийся в Post.php.

По умолчанию он содержит два элемента: subject (поле заголовка) и icon (раскрывающийся список для выбора иконки сообщения). Рассмотрим их структуру:

    $context['posting_fields']['subject'] = array(
        'label' => array(
            'text' => $txt['subject'],
            'class' => isset($context['post_error']['no_subject']) ? 'error' : '',
        ),
        'input' => array(
            'type' => 'text',
            'attributes' => array(
                'size' => 80,
                'maxlength' => !empty($topic) ? 84 : 80,
                'value' => $context['subject'],
                'required' => true,
            ),
        ),
    );

    $context['posting_fields']['icon'] = array(
        'label' => array(
            'text' => $txt['message_icon'],
        ),
        'input' => array(
            'type' => 'select',
            'attributes' => array(
                'id' => 'icon',
                'onchange' => 'showimage();',
            ),
            'options' => array(),
            'after' => ' <img id="icons" src="' . $context['icon_url'] . '">',
        ),
    );

    foreach ($context['icons'] as $icon)
    {
        $context['posting_fields']['icon']['input']['options'][$icon['name']] = array(
            'value' => $icon['value'],
            'selected' => $icon['value'] == $context['icon'],
        );
    }

Метки label и элементы input обязательны. Текст label и тип input также нужно указывать. У поля subject тип text, у поля icon — select. С помощью массива attributes указываются атрибуты элементов: id, size, value и т. п. У метки элемента subject также указан класс (class), а у элемента icon в свойстве ’after’ размещено изображение, которое отображается справа от списка.

Каждый добавляемый в массив $context['posting_fields'] элемент должен быть одного из следующих типов:

  • text, password, color, date, datetime-local, email, month, number, range, tel, time, url, week
  • textarea
  • checkbox
  • select
  • radio_select

Когда тип элемента text, password, color, date, datetime-local, email, month, number, range, tel, time, url, week, textarea или checkbox, свойство attributes используется для задания начального значения элемента, а также для установки любых других HTML-элементов, необходимых в конкретной ситуации.

    // Поле для вызова цветовой палитры
    $context['posting_fields']['color'] = array(
        'label' => array(
            'text' => 'Цвет',
        ),
        'input' => array(
            'type' => 'color',
            'attributes' => array(
                'value' => '#ff0000', // Выбранный цвет по умолчанию
            ),
        ),
    );

    // Поле для указания времени и даты
    $context['posting_fields']['datetime-local'] = array(
        'label' => array(
            'text' => 'Дата и время',
        ),
        'input' => array(
            'type' => 'datetime-local',
        ),
    );

Реализация кода выше

Некоторые типы элемента input поддерживаются не всеми браузерами!

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

    $context['posting_fields']['mood'] = array(
        'label' => array(
            'text' => 'Настроение',
        ),
        'input' => array(
            'type' => 'select',
            'options' => array(
                'Хорошее' => array(
                    'value' => 'good',
                    'selected' => true,
                ),
                'Так себе' => array(
                    'value' => 'so_so',
                    'selected' => false,
                ),
                'Плохое' => array(
                    'value' => 'bad',
                    'selected' => false
                )
            ),
        ),
    );

Кроме того, как label, так input могут иметь атрибуты ’before’ и/или ’after’, содержащие HTML-код, отображаемый, соответственно, слева или справа от элемента. Наконец, если нужно, отображение элементов label и input можно переопределить с помощью свойства ’html’. Но используйте это в самом крайнем случае!

Пример переопределения:

$context['posting_fields']['subject'] = array(
    'label' => array('html' => '<label for="subject" id="caption_subject">' . $txt['subject'] . '</label>'),
    'input' => array('html' => '<input type="text" id="subject" name="subject" value="' . $context['subject'] . '" size="80" maxlength="80" required>')
);

Чтобы не редактировать файл Post.php, используйте хук integrate_post_end, в котором можно переопределить массив $context['posting_fields'].