Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Выборка из нескольких инфоблоков

00 голосов
3
Доброго времени суток.

Ситауция такая:
Есть раздел "Новости" в нем три пока что одинаковых подраздела и подраздел архив. Информация для каждого подраздела хранится в своем инфоблоке, структура у них одинакова. Во всех трех инфоблоках имеется свойство ARCHIVES (архивная).
В каждом из трех разделов я вывожу статьи, не отмеченные флагом "Архивная"
А в подразделе "Архив" должны выводится статьи из всех трех инфоблоков, помеченные флагом "Архивная".

С помощью какой команды можно достать эти архивные статьи из трех инфоблоков.
спросил 11 Июнь, 13 от niker (160 баллов)

3 Ответы

00 голосов
Настоятельно рекомендую переносить архивные статьи и отдельный инфоблок.
Очень положительно скажется на производительности (особенно с ростом объемов).

Если инфоблоки НЕ хранятся в отдельных таблицах, то:
Код
<?
global $myFilter;
$myFilter = array("PROPERTY_ARCHIVES"=>"Y");
?>
<?$APPLICATION->IncludeComponent("my:news.list",
...
"IBLOCK_TYPE"=>"news",
"IBLOCK_ID":
"FILTER_NAME"=>"myFilter",
...
);

компонент my:news.list получается копированием /bitrix/components/bitrix/news.list в /bitrix/components/my
и удалением фильтра по IBLOCK_ID (строка 145: "IBLOCK_ID" => $arResult["ID"],)
ответил 11 Июнь, 13 от Miso (740 баллов)
00 голосов
Спасибо Максим.

На счет отдельного инфоблока для архива. Встает вопрос о том как переносить записи туда из других? Если только написать свой обработчик?

У меня тоже есть мысль сделать свой компонент под эти цели, но пока решил по другому, т.к. нет много времени на разработку (очистил он элементов дизайна):

Код
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");

$arIBlockID = array(7,12,13);
$arSelect = array();

if (CModule::IncludeModule("iblock"))
{
   $rsElements = CIBlockElement::GetList (array('TIMESTAMP_X' => 'DESC'), array('!PROPERTY_ARCHIVE_VALUE'=> 1, 'IBLOCK_ID' => $arIBlockID), false, Array("nPageSize"=>4), $arSelect);
   while ($arElement = $rsElements ->GetNext())
   {
      $arElement['PREVIEW_PICTURE'] = CFile::GetFileArray($arElement['PREVIEW_PICTURE']);
      $arResult['ITEMS'][] = $arElement;
   }
}
foreach ($arResult['ITEMS'] as $arItem)
{
   echo $arItem['NAME'].'<br>';
  echo $arItem['PREVIEW_TEXT'];?>
}

$APPLICATION->IncludeComponent("siemens:system.pagenavigationmain", "pager", Array(
   "NAV_RESULT"   =>   $rsElements,
   "SHOW_ALWAYS"   =>   false,
   "TEXT"   =>   "",
   "QUERY"   =>   ""
   )
); 
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>


Ваш пример обязательно разберу на досуге.
ответил 23 Июнь, 13 от niker (160 баллов)
00 голосов
Ну как идея - создать Агент, событие и его обработчик )

Тока пусть агент запускается 1 раз в день/неделю, в зависимости от скорости заполнения сайта.
ответил 27 Сен, 13 от GUCCI (440 баллов)

Похожие вопросы

+1 голос
1 ответ
спросил 18 Ноя, 15 от аноним
0 голосов
2 ответов
спросил 26 Апр, 14 от NASTIULEA (100 баллов)
0 голосов
6 ответов
спросил 17 Окт, 13 от Skarler (280 баллов)
0 голосов
2 ответов
0 голосов
2 ответов
спросил 03 Май, 13 от Denza (120 баллов)