В качестве цели мы поставим такую задачу: подписчиком будет указываться пол и в зависимости от этого выбора в письме рассылки она или он получит "Уважаемая" или "Уважаемый" в качестве обращения.
[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. Добавляю вкладку
AddEventHandler("main", "OnAdminTabControlBegin", "MyOnAdminTabControlBegin"); function MyOnAdminTabControlBegin(&$form) { if (strpos($GLOBALS["APPLICATION"]->GetCurPage(),"/bitrix/admin/subscr_edit.php")===false){} else { $subscr_arrmy["USER_PROPERTIES"]=$GLOBALS["USER_FIELD_MANAGER"]->GetUserFields( "MY_SUBSCRIPTION", $_REQUEST["ID"], LANGUAGE_ID ); if ($_REQUEST["ID"]): $form->tabs[] = array("DIV" => "my_edit", "TAB" => "Дополнительные данные", "ICON"=>"main_user_edit", "TITLE"=>"Дополнительные данные о подписчике", "CONTENT"=> ' <tr valign="top"> <td>ФИО:</td> <td><input type="text" name="UF_FULLNAME" value="'.$subscr_arrmy["USER_PROPERTIES"]["UF_FULLNAME"]["VALUE"].'" size="30"><br></td> </tr> <tr valign="top"> <td>Телефон:</td> <td><input type="text" name="UF_PHONE" value="'.$subscr_arrmy["USER_PROPERTIES"]["UF_PHONE"]["VALUE"].'" size="30"><br></td> </tr> <tr valign="top"> <td>Компания:</td> <td><input type="text" name="UF_ORGANIZATION" value="'.$subscr_arrmy["USER_PROPERTIES"]["UF_ORGANIZATION"]["VALUE"].'" size="30"><br></td> </tr> ' ); endif; } }2. Добавляю дополнительные столбцы в таблице подписчиков(у меня их три).
AddEventHandler("main", "OnAdminListDisplay", "MyOnAdminListDisplay"); function MyOnAdminListDisplay(&$list) { //add custom group action if($list->table_id == "tbl_subscr"){ $timeArOption=array( "FULLNAME"=>array( "id"=>"FULLNAME", "content"=>"ФИО", ), "PHONE"=>array( "id"=>"PHONE", "content"=>"Телефон", ), "ORGANIZATION"=>array( "id"=>"ORGANIZATION", "content"=>"Организация", ) ); foreach ($timeArOption as $key=>$tumeOp): $list->aHeaders[$key]=$tumeOp; $list->arVisibleColumns[]=$key; endforeach; foreach($list->aRows as $row): $subscr_arrmy["USER_PROPERTIES"]=$GLOBALS["USER_FIELD_MANAGER"]->GetUserFields( "MY_SUBSCRIPTION", $row->arRes["ID"], LANGUAGE_ID ); foreach ($timeArOption as $key=>$tumeOp): $row->aHeaders[$key] = $tumeOp; $row->aHeadersID[]=$key; $row->aFields[$key]["view"]=array( "type" => "html", "value" => $subscr_arrmy["USER_PROPERTIES"]['UF_'.$key]["VALUE"] ); $row->arRes[$key]=$subscr_arrmy["USER_PROPERTIES"]['UF_'.$key]["VALUE"]; endforeach; endforeach; } }3. Сохраняю пользовательские свойства.
AddEventHandler("main", "OnBeforeProlog", "MyOnBeforeProlog"); function MyOnBeforeProlog() { if (strpos($GLOBALS["APPLICATION"]->GetCurPage(),"/bitrix/admin/subscr_edit.php")===false){} else { if($_SERVER["REQUEST_METHOD"] == "POST"){ if ($_REQUEST["ID"]): global $USER_FIELD_MANAGER; $arUserFields = $USER_FIELD_MANAGER->GetUserFields("MY_SUBSCRIPTION"); $arUsFields = array(); foreach($arUserFields as $FIELD_ID => $arField) $arUsFields[$FIELD_ID] = $_REQUEST[$FIELD_ID]; $USER_FIELD_MANAGER->Update("MY_SUBSCRIPTION", $_REQUEST["ID"], $arUsFields); endif; } } }$list->aHeaders[$key]=$tumeOp;
$list->aVisibleHeaders[$key]=$tumeOp;
endforeach;
Нужно добавить