В этой статье рассмотрим как добавить в ЖЛ новый элемент. Рассмотрим на примере новостей (или любых других элементов ИБ). [spoiler]
Сразу скажу, что изучал практически в слепую, так как совершенно новый функционал был, много нового и непонятного Огромное спасибо Владимиру Артемову за посильную помощь в особых тупиках.
Итак, поехали. Для удобства чтения и копирования код можно смотреть здесь.
0. Придумаем название для ENTITY_TYPE и EVENT_ID. ENTITY_TYPE - это тип ваших событий. Например, MYNEWS (макс.длина 50 символов, только буквы и цифры. рекомендуется со своим префиксом, чтобы не случилось конфликта) EVENT_ID - ID события, но тоже константа. Пусть будет news.
Все методы будут в классе CSonetLogHandlers, ниже перечислю его методы.
Как вы можете видеть - в ключах присутствуют сущности из п.0. От комментариев воздержусь. Языковые значения предназначены для вывода в разных местах ЖЛ. По логике их можете изменить.
3. OnFillSocNetFeaturesList.
public static function OnFillSocNetFeaturesList(&$arSocNetFeaturesSettings)
{
$arSocNetFeaturesSettings['news']['subscribe_events']['news']['ENTITIES']['MYNEWS'] = array();
}
И опять тут видим сущности из п.0. Просто примите как должное данный массив
4. OnFillSocNetAllowedSubscribeEntityTypes.
public static function OnFillSocNetAllowedSubscribeEntityTypes(&$arSocNetAllowedSubscribeEntityTypes)
{
$arSocNetAllowedSubscribeEntityTypes[] = 'MYNEWS';
global $arSocNetAllowedSubscribeEntityTypesDesc;
$arSocNetAllowedSubscribeEntityTypesDesc['MYNEWS'] = array(
'TITLE_LIST' => 'Новости',
'CLASS_DESC_GET' => 'CSonetLogHandlers',
'METHOD_DESC_GET' => 'GetIBlockByID',
'CLASS_DESC_SHOW' => 'CSonetLogHandlers',
'METHOD_DESC_SHOW' => 'ShowEntityLink',
);
}
Аналогично. Сущность MYNEWS. Опять принимаем как должное.
5. Страшный и ужасный метод, который отвечает как за показ новости в ЖЛ, так и за ее отправку по e-mail или ЛС (если есть такие указания подписчика). Также здесь собираются поля тултипа всплывающего и прочее. Если есть желание разобраться, просто поэкспериментируете параметрами.
Пару слов о 'IS_IMPORTANT' => false у $arResult['EVENT_FORMATTED']. Если его поставить в true, то новость выделится такой красивой рамочкой:
Если оставить в false, будет типичная запись, с автором и прочими атрибутами.
6. В п.4 описываются некие методы. Они отвечают за получение информации об инфоблоке и выводе его в подписке (ссылки слева в блоках "статьи" и "форумы":
Это GetIBlockByID и ShowEntityLink.
public static function GetIBlockByID($ID)
{
if (CModule::IncludeModule('iblock'))
if ($arInfo = CIBlock::GetByID($ID)->GetNext())
return array('NAME_FORMATTED' => $arInfo['NAME'], 'URL' => $arInfo['LIST_PAGE_URL']);
}
public static function ShowEntityLink($arEntityDesc, $strEntityURL, $arParams)
{
return '<a href="'.$arEntityDesc['URL'].'">'.$arEntityDesc['NAME_FORMATTED'].'</a>';
}
Ну все. Обработчики все написаны. Осталось добавить запись в лог.
7. За это отвечает вот такая относительно не страшная функция:
Функции передается ID элемента ИБ и тип события (MYNEWS).
Просто собираем информацию о элементе и инфоблоке и добавляем ее, потом отсылаем уведомление. А выводом уже занимаются обработчики выше. Замечу, что без определения обработчиков выше, добавление не произойдет, так как не определены нужные типы еще.
Чтобы сообщение отображались в ленте после добавления, нужно после строчки CSocNetLog::Update($logID, array('TMP_ID' => $logID)); добавить CSocNetLogRights::Add($ID, array("G2"));.
Максим не смог добавить коммент, я отписал как есть, в суть проблемы не вникал. Давненько с соцсетью не работал.
Кстати, последний актуальный пример кода добавления здесь: http://bxapi.ru/src/?id=183311 И в этом же файле /bitrix/modules/intranet/include.php есть все необходимые обработчики.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».