В 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']
.