На этом этапе возникает проблема: при создании группы социальной сети, система не создает соответствующие записи в таблицах БД, где хранятся настройки прав доступа к заданным функциям. Эти записи автоматически создаются только после первого изменения прав доступа, до того они определяются системой, средствами PHP. Причем, по умолчанию, используется режим не «разрешено всем», а «разрешено только участникам». Следовательно, попытка выбрать все записи, у которых в поле ROLE не установлено значение константы SONET_RELATIONS_TYPE_ALL («разрешено всем»; в нашем случае это и будет вызов CPTK_SocialNetwork:: GetByRoleFeaturesIdArray() с установленным дополнительным фильтром array('!ROLE' => SONET_RELATIONS_TYPE_ALL), приведет к получению неверного результата. Этот нюанс можно считать досадной ошибкой архитектуре модуля, но к счастью дело поправимо без вмешательства в ядро системы. В нашем случае, оказалось достаточно добавления обработчика события OnSocNetGroupAdd, где и выполняются операции необходимые корректной записи в БД структуры прав. В группах, которые были созданы ранее, эта ошибка была исправлена с помощью мастера.
Двигаемся дальше — получаем массив блогов, из которых будут выбираться новые записи.
$arBlogID = array(); //массив блогов, из которых будут выбраться новые записи
if(!empty($arEntityUsersID) || !empty($arEntityGroupsID)) {
//подключаем модуль блогов
if(!CModule::IncludeModule('blog')) {
$this->AbortResultCache();
return;
}
}
if(!empty($arEntityUsersID)) {
//по владельцу блога
$arOrderBlog = array();
$arFilterBlog = array(
'OWNER_ID' => array_keys($arEntityUsersID),
'GROUP_ID' => $arParams['BLOG_GROUP_ID'],
'GROUP_SITE_ID' => SITE_ID,
'ACTIVE' => 'Y'
);
unset($arEntityUsersID);
$arGroupByBlog = false;
$arNavigationBlog = false;
$arSelectFieldsBlog = array(
'ID',
'SONET_GROUP_ID'
);
$rsItems = CBlog::GetList($arOrderBlog, $arFilterBlog, $arGroupByBlog, $arNavigationBlog, $arSelectFieldsBlog);
while($arItem = $rsItems->Fetch()) {
if(intval($arItem['SONET_GROUP_ID']) <= 0) {
$id_ = intval($arItem['ID']);
$arBlogID[$id_] = $id_;
}
}
unset($rsItems, $id_, $arOrderBlog, $arGroupByBlog, $arNavigationBlog, $arSelectFieldsBlog);
}
if(!empty($arEntityGroupsID)) {
//по группе блога в соцсети
$arOrderBlog = array();
$arFilterBlog = array(
'SOCNET_GROUP_ID' => array_keys($arEntityGroupsID),
'GROUP_ID' => $arParams['BLOG_GROUP_ID'],
'GROUP_SITE_ID' => SITE_ID,
'ACTIVE' => 'Y'
);
$arGroupByBlog = false;
$arNavigationBlog = false;
$arSelectFieldsBlog = array(
'ID',
'OWNER_ID'
);
$rsItems = CBlog::GetList($arOrderBlog, $arFilterBlog, $arGroupByBlog, $arNavigationBlog, $arSelectFieldsBlog);
while($arItem = $rsItems->Fetch()) {
if(intval($arItem['OWNER_ID']) <= 0) {
$id_ = intval($arItem['ID']);
$arBlogID[$id_] = $id_;
}
}
unset($rsItems, $id_, $arOrderBlog, $arGroupByBlog, $arNavigationBlog, $arSelectFieldsBlog);
}
Здесь все вполне прозрачно и комментариев не требует. И, наконец, выбираем записи из блогов, которые и станут основой для формирования конечного результата – "Ленты друзей".
if(!empty($arBlogID)) {
$arFilter = array(
'BLOG_ACTIVE' => 'Y',
'BLOG_GROUP_SITE_ID' => SITE_ID,
'PUBLISH_STATUS' => BLOG_PUBLISH_STATUS_PUBLISH,
'BLOG_ID' => array_keys($arBlogID),
'ACTIVE' => 'Y'
);
unset($arBlogID);
if($arParams['MAX_DAYS_COUNT'] > 0) {
//задан промежуток времени для выборки сообщений 86400 – кэшируем на сутки
$from = intval(time() - $arParams['MAX_DAYS_COUNT']*86400);
$arFilter['>=DATE_PUBLISH'] = ConvertTimeStamp($from, 'FULL');
}
$arGroupBy = false;
$arSelectFields = array(
'ID',
'BLOG_ID',
'TITLE',
'DATE_PUBLISH',
'AUTHOR_ID',
'DETAIL_TEXT',
'BLOG_ACTIVE',
'BLOG_URL',
'BLOG_GROUP_ID',
'BLOG_GROUP_SITE_ID',
'AUTHOR_LOGIN',
'AUTHOR_NAME',
'AUTHOR_LAST_NAME',
'BLOG_USER_ALIAS',
'BLOG_OWNER_ID',
'BLOG_USER_AVATAR',
'NUM_COMMENTS',
'VIEWS',
'ATTACH_IMG',
'BLOG_SOCNET_GROUP_ID'
);
$rsItems = CBlogPost::GetList($arOrder, $arFilter, $arGroupBy, $arNavParams, $arSelectFields);
$rsItems->bShowAll = $arParams['PAGER_SHOW_ALL'];
//создаем объект парсера сообщений блогов
$obParser = new blogTextParser(false, $arParams['PATH_TO_SMILE']);
while($arItem = $rsItems->GetNext()) {
//здесь код разбора записи блога – ссылки, аватары, картинки, выполняем парсинг текста сообщения и т.д.
}
unset($obParser, $arOrder, $arGroupBy, $arSelectFields);
unset($arEntityGroupsID);
}
На этом содержательная часть работы заканчивается. Далее подключаем шаблон для оформления полученных данных HTML-кодом и лента сообщений "как в ЖЖ" готова.