В качестве цели мы поставим такую задачу: подписчиком будет указываться пол и в зависимости от этого выбора в письме рассылки она или он получит "Уважаемая" или "Уважаемый" в качестве обращения.
[spoiler]Сначала скучная часть по настройке публичной части и размещению компонент подписки. В демо данных эта работа уже выполнена мастером создания сайта. И эту часть можно пропустить.
Предполагаем наличие "Персонального раздела" пользователя в папке /personal. Если это не ваш случай, то в последующих примерах надо будет внести соответствующие изменения.
В шаблоне сайта размещаем компонент формы подписки:
- Открыть вкладку "Разработка" (/index.php?bitrix_include_areas=Y&bitrix_show_mode=configure).
- Открыть шаблон сайта на редактирование - "Шаблон" - "Панель управления" - "Редактировать шаблон".
- В шаблон добавляем код вывода списка рассылок для подписки:
<?$APPLICATION->IncludeComponent(
"bitrix:subscribe.form",
"",
Array()
);?> - "Сохранить".
- "Разработка".
- Находим компонент и в меню компонента выбираем "Редактировать параметры компонента".
- Параметр "Страница редактирования подписки" задаем равным "#SITE_DIR#personal/subscribe/subscr_edit.php".
- "Сохранить".
Компонент может "жаловаться" на отсутствие рубрик подписки. Создадим одну.
- В административной части откроем страницу "Список рассылок" (/bitrix/admin/rubric_admin.php?lang=ru)
- "Добавить".
- Название "Новости сайта".
- Другие поля по вкусу.
- "Сохранить".
Возвращаемся в режим "Разработка" в публичной части сайта, переходим в "Персональный раздел" и сбрасываем кеш ("Обновить" или /personal/index.php?clear_cache=Y&bitrix_include_areas=Y&bitrix_show_mode=configure).
Создаем раздел управления подписками:
- "Создать" - "раздел".
- "Имя папки" - subscribe;
- Заголовок раздела - Подписка;
- "Далее";
- "Готово";
- Открывается визуальный редактор.
- Размещаем компонент "Страница рассылок" (bitrix:subscribe.index);
- "Страница редактирования подписки" - "#SITE_DIR#personal/subscribe/subscr_edit.php";
- "Сохранить";
- "Создать" - "Страницу".
- Имя файла - subscr_edit.php;
- разотмечаем "добавить пункт меню";
- "Далее";
- "Готово";
- Открывается визуальный редактор.
- Размещаем компонент "Страница редактирования подписки" (bitrix:subscribe.edit);
- "Сохранить";
- Настройка модуля.
- Публичный раздел, где находится страница редактирования подписки "#SITE_DIR#personal/subscribe/";
- Использовать HTML редактор Да;
- Отправлять картинки в виде вложений в письмо - Да;
- "Сохранить";
Можно протестировать. Подписаться на рубрику, создать и отправить выпуск.
Переходим собственно к задаче. Во первых надо определиться с идентификатором сущности к которой будут привязываться значения дополнительных свойств. Пусть это будет MY_SUBSCRIPTION. В качестве уникального идентификатора объектов этой сущности будут выступать b_subscription.ID.
На админской странице bitrix/admin/userfield_admin.php?lang=ru щелкаем по кнопке "Добавить" и получаем форму создания нового поля.
- Тип данных - Список
- Объект - MY_SUBSCRIPTION
- Код поля - UF_GENDER
- Остальные поля - не трогаем
- "Применить"
- Переходим на вкладку "Список"
- Задаем возможные значения - Женский и Мужской
- "Применить"
Кастомизируем компонент subscribe.edit. Копируем его из /bitrix/components/bitrix в папку /bitrix/components/demo и заменяем вызов на странице /personal/subscribe/subscr_edit.php на demo:subscribe.edit.
Выводим значения пользовательских свойств подписки в форме. В файле component.php после
$arResult["ALLOW_REGISTER"] = $bAllowRegister?"Y":"N";
добавляем чтение значений из базы данных
$arResult["USER_PROPERTIES"] = $GLOBALS["USER_FIELD_MANAGER"]->GetUserFields(
"MY_SUBSCRIPTION",
$arResult["ID"],
LANGUAGE_ID
);
А в файле setting.php шаблона выводим прочитанное (оформлять по вкусу):
<table>
<?foreach ($arResult["USER_PROPERTIES"] as $FIELD_NAME => $arUserField):?>
<tr>
<td><?echo $arUserField["EDIT_FORM_LABEL"]?>:</td>
<td><?$APPLICATION->IncludeComponent(
"bitrix:system.field.edit",
$arUserField["USER_TYPE"]["USER_TYPE_ID"],
array(
"bVarsFromForm" => false,
"arUserField" => $arUserField
),
null,
array("HIDE_ICONS"=>"Y"));?></td>
</tr>
<?endforeach;?>
</table>
Для сохранения значений в базе данных в файле component.php после строк
if($ID>0)
{
...
$res = $obSubscription->Update($ID, $arFields);
...
}
else
{
...
$ID = $obSubscription->Add($arFields);
...
}
добавляем код установки значений свойств
if($res && $ID > 0)
{
global $USER_FIELD_MANAGER;
$arUserFields = $USER_FIELD_MANAGER->GetUserFields("MY_SUBSCRIPTION");
$arFields = array();
foreach($arUserFields as $FIELD_ID => $arField)
$arFields[$FIELD_ID] = $_REQUEST[$FIELD_ID];
$USER_FIELD_MANAGER->Update("MY_SUBSCRIPTION", $ID, $arFields);
}
Для красоты у данного поля в административной части можно указать:
- Обязательное - Да
- Подпись - Пол
Заводим новую подписку или открываем на редактирование уже существующую и указываем пол подписчика.
Теперь соглашаемся на использование "макроса" в выпуске. Пусть #GENDER_HELLO# будет заменяться на Уважаемая/Уважаемый в зависимости от пола.
Создаем обработчик события BeforePostingSendMail (
<?
// файл /bitrix/php_interface/init.php
// регистрируем обработчик
AddEventHandler("subscribe", "BeforePostingSendMail", Array("MyClass", "BeforePostingSendMailHandler"));
class MyClass
{
// создаем обработчик события "BeforePostingSendMail"
function BeforePostingSendMailHandler($arFields)
{
$rs = CSubscription::GetByEmail($arFields["EMAIL"]);
if($ar = $rs->Fetch())
{
global $USER_FIELD_MANAGER;
$arUserFields = $USER_FIELD_MANAGER->GetUserFields("MY_SUBSCRIPTION", $ar["ID"]);
if($arUserFields["UF_GENDER"]["VALUE"] == 1)
$arFields["BODY"] = str_replace("#GENDER_HELLO#", "Уважаемая", $arFields["BODY"]);
elseif($arUserFields["UF_GENDER"]["VALUE"] == 2)
$arFields["BODY"] = str_replace("#GENDER_HELLO#", "Уважаемый", $arFields["BODY"]);
else
$arFields["BODY"] = str_replace("#GENDER_HELLO#", "", $arFields["BODY"]);
}
else
{
$arFields["BODY"] = str_replace("#GENDER_HELLO#", "", $arFields["BODY"]);
}
return $arFields;
}
}
?>
Удачи в разработке!
пошел за морковкой
Или для тех, кто на испытательном?
Дайте цвет (#RRGGBB). Поправлю.
И добавить циклы по $USER->GetUserGroupArray().
1. Добавляю вкладку
2. Добавляю дополнительные столбцы в таблице подписчиков(у меня их три).
3. Сохраняю пользовательские свойства.
$list->aHeaders[$key]=$tumeOp;
$list->aVisibleHeaders[$key]=$tumeOp;
endforeach;
Нужно добавить