Bitrix: предыдущий с последующий элементы для news.detail (через запросы)

Замечательно работавший код без кеша, с кешем компонентов, превратился в «говно», довольно часто стало такое происходить, с этим битриксом.

Посмотрев исходник и запрос, решено было его переписать в рабочий вариант (код стал легче и быстрее)
$iid = $arParams["IBLOCK_ID"];
$dpu = $arParams["DETAIL_URL"];

$q = $DB->query("SET @rank_prev = 0, @rank_cur = 0");
$q = "SELECT prev.ID as ID, prev.NAME as NAME, REPLACE('$dpu', '#ELEMENT_CODE#', prev.CODE) as LINK
FROM (SELECT @rank_cur:=@rank_cur+1 AS rank, ID, NAME, CODE FROM b_iblock_element WHERE ACTIVE = 'Y' AND IBLOCK_ID = '$iid' ORDER BY ACTIVE_FROM DESC) as cur
INNER JOIN (SELECT @rank_prev:=@rank_prev+1 AS rank, ID, NAME, CODE FROM b_iblock_element WHERE ACTIVE = 'Y' AND IBLOCK_ID = '$iid' ORDER BY ACTIVE_FROM DESC) as prev
ON prev.rank + 1 = cur.rank
WHERE cur.ID = ".$arResult["ID"];
$q = $DB->query($q);
while ($ob = $q->getNext()) $arResult["LEFT_ARROW"] = $ob;

$q = $DB->query("SET @rank_cur = 0, @rank_next = 0");
$q = "SELECT next.ID as ID, next.NAME as NAME, REPLACE('$dpu', '#ELEMENT_CODE#', next.CODE) as LINK
FROM (SELECT @rank_cur:=@rank_cur+1 AS rank, ID, NAME, CODE FROM b_iblock_element WHERE ACTIVE = 'Y' AND IBLOCK_ID = '$iid' ORDER BY ACTIVE_FROM DESC) as cur
INNER JOIN (SELECT @rank_next:=@rank_next+1 AS rank, ID, NAME, CODE FROM b_iblock_element WHERE ACTIVE = 'Y' AND IBLOCK_ID = '$iid' ORDER BY ACTIVE_FROM DESC) as next
ON cur.rank + 1 = next.rank
WHERE cur.ID = ".$arResult["ID"];
$q = $DB->query($q);
while ($ob = $q->getNext()) $arResult["RIGHT_ARROW"] = $ob;
  • 0
  • 17 февраля 2014, 17:26
  • admin

Комментарии (0)

RSS свернуть / развернуть
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.