Настройки и регистрация

В этом уроке добавляем две новые опции в настройки модификаций. Создаем «оповещатель» о новых регистрациях.

Настройки мода

В последних выпусках SMF 2.0.x появился такой хук — integrate_general_mod_settings. Он не добавляет отдельную страницу с параметрами мода, но помогает добавить нужные параметры на главную страницу в разделе Настройки модификаций.

Вот простейший пример:

function example_settings(&$config_vars)
{
    global $txt, $modSettings;

    loadLanguage('MyMod3');

    if (isset($config_vars[0]))
        $config_vars[] = array('title', 'mymod3_title');

    $config_vars[] = array('text', 'ext_email');
    $config_vars[] = array('text', 'ext_pm');
}

Как и прежде, используется функция loadLanguage для подключения нужного языка с именем MyMod3.{language}.php (/Themes/default/languages).

Подключается массив $config_vars, содержащий параметры на главной странице раздела Настройки модификаций. И обратите внимание на строчку:

if (isset($config_vars[0])) $config_vars[] = array('title', 'mymod3_title');

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

Итак, мы создали пару опций для хранения текстовых переменных. Теперь используем эти опции в следующем примере.

Вот как выглядят настройки нашего мода

Функции отправки писем и ЛС

Время от времени появляются вопросы вида «как сделать рассылку на e-mail о новых регистрациях?». А делать ничего не нужно — такая опция уже присутствует в настройках регистрации. Но уведомлять можно только администратора. А если требуется добавить ещё пару-тройку «специально уполномоченных» пользователей? В этом случае воспользуемся готовой функцией sendmail:

sendmail($to, $subject, $message, $from = null, $message_id = null, $send_html = false, $priority = 3, $hotmail_fix = null, $is_private = false)

Подбираем подходящий хук — integrate_register — он перехватывает регистрационные данные пользователей сразу после регистрации, но ДО занесения сведений в базу данных.

function example_register(&$regOptions, &$theme_vars)
{
    sendmail($to, $subject, $message, null, null, true, 3);
}

В массиве $regOptions содержатся сведения, указанные пользователем при регистрации. Например, $regOptions['username'] — имя. В файле примера (см. ссылку ниже), содержится развернутое описание, ознакомьтесь на досуге.

Функция sendmail требует указания некоторых входных параметров: $to, $subject и так далее. Заполним эти данные с помощью $regOptions, а заодно оформим это дело в виде таблицы, которая придёт на указанный в настройках e-mail:

function example_register(&$regOptions, &$theme_vars)
{
    global $txt, $modSettings;

    loadLanguage('MyMod3');

    if (!empty($modSettings['ext_email']) || !empty($modSettings['ext_pm'])) {
        $subject = $txt['new_user'] . ': ' . $regOptions['register_vars']['member_name'];

        if (!empty($modSettings['ext_email'])) {
            $to = $modSettings['ext_email'];

            $message = '<table border="1" cellpadding="2" cellspacing="1" width="100%" frame="void"><tbody>';
            $message .= '<tr><td><strong>' . $txt['user'] . '</strong>: </td><td>' . $regOptions['register_vars']['member_name'] . '</td></tr>';
            $message .= '<tr><td><strong>' . $txt['email'] . '</strong>: </td><td>' . $regOptions['register_vars']['email_address'] . '</td></tr>';
            $message .= '</tbody></table>';

            sendmail($to, $subject, $message, null, null, true, 3);
        }
    }
}

Получаем информацию в виде таблицы

Итак, в качестве $to используется указанный нами e-mail, $subject — это тема отправляемого письма, $message — текст, таблица с некоторой информацией, указанной пользователем при регистрации. Пару параметров пропускаем (указываем вместо них null), и вставляем true, указывая на то, что в письме отправляется HTML, с приоритетом «3» (используется по умолчанию, параметр срочности письма — когда дойдет, тогда дойдет):

sendmail($to, $subject, $message, null, null, true, 3);

Используем оставшуюся текстовую опцию для указания id пользователей — получателей;ЛС о новых регистрациях. И так же добавим для таких сообщений оформление в виде таблицы:

if (!empty($modSettings['ext_pm'])) {
    $to = $modSettings['ext_pm'];

    $message = '[ table]';
    $message .= '[ tr][ td][b ]' . $txt['user'] . '[/b ]: [/td ][ td]' . $regOptions['register_vars']['member_name'] . '[/td ][/tr ]';
    $message .= '[ tr][ td][b ]' . $txt['email'] . '[/b ]: [/td ][ td]' . $regOptions['register_vars']['email_address'] . '[/td ][/tr ]';
    $message .= '[/table ]';

    sendpm(array('to' => array($to), 'bcc' => array()), $subject, $message);
}

Обратите внимание: вместо HTML на этот раз уже используется BBC, поскольку личные сообщения отправляются внутри форума.

Здесь уже вместо sendmail задействуется функция sendpm, тоже из стандартной комплектации SMF и похожими параметрами: массив $to (состоит из двух вложенных массивов — «кому» отправляем и «копия» — кто ещё получает; только вот в качестве элементов этих массивов используется не e-mail, а id нужных пользователей), $subject и $message.

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

Учебный пример