Bitrix формирование урлов многоуровневых разделов

Сайты каталоги в основном имеют структуру многоуровневых разделов. При тестировании могут потребоваться урлы этих разделов. Рекурсивное формирование ссылок и экспорт их в csv будет рассмотрен в этой статье.

329zamorozhennie-ovoshi/green-gorohЗамороженные овощи/Зеленый горошек «Premiko»
330conserves/cucumberКонсервированные овощи/Огурцы
331v-steklannih-bankah/gribОвощи в стеклянных банках/Грибы
332v-steklannih-bankah/tomatosОвощи в стеклянных банках/Помидоры
333zamorozhennie-ovoshi/brokkoliЗамороженные овощи/Брокколи
334conserves/tomateКонсервированные овощи/Банка томатов

Скрипт я написал в ООП стиле
Допустим у нас есть массив разделов где присутствует некий текст, напр. кнопка «Купить».


$strSql = "SELECT * FROM b_iblock_section WHERE DESCRIPTION LIKE '%>Купить<%'";

Выполнение данного запроса вернет массив разделов. Нас интересует полный путь до данного раздела.


$res = $DB->Query($strSql, false);
            if ($res->result->num_rows == false) {
                return;
            }
            while ($row = $res->Fetch()) {
$this->sectns['url'] = $this->sectns['nav'] = [];
              // CODE  - для формирования УРЛ
               $this->getSect($this->sectns['url'], $row['IBLOCK_SECTION_ID'], 'CODE');
             // NAME - для "хлебных крошек"
              $this->getSect($this->sectns['nav'], $row['IBLOCK_SECTION_ID'], 'NAME');
            }

Далее нам нужна функция к-я рекурсивно выдает урлы


    protected function getSect(&$sect, $id, $param)
    {
        $res = CIBlockSection::GetByID($id);
        if ($ar_res = $res->GetNext()) {
            if ($ar_res['IBLOCK_SECTION_ID'] != false) {
                array_unshift($sect , $ar_res[$param]); 
                getSect($sect, $ar_res['IBLOCK_SECTION_ID'], $param);
            } else {
                array_unshift($sect , $ar_res[$param]); 
            }
        }
        return $sect;
    }

Массивы готовы, запишем их в csv файл.

    /**
     *
     */
    protected function WriteToCSV()
    {
        // заголовок для csv
        if($this->csv_header != ''){
            array_unshift($this->sectns_2, array($this->csv_header));
        }
        $path = dirname(__FILE__) . "/" . $this->csv_file;
        $f1 = fopen($path, $this->mode);
        foreach ($this->sectns['nav'] as $key => $value) {
          fputcsv($f1, [implode('/' , $value), implode('/' , $this->sectns['url'][$key]]));
        }
        fclose($f1);
    }

После объединения массива добавляю заголовок, и записываю в режиме «w» или «a» в зависимости от параметра.
В нем в конструкторе идет проверка на sql запрос или ID элемента. Соответственно элементы, для которых мы формируем url и навигацию — из таблицы b_iblock_element и b_iblock_section.

2 Comments

  1. можно гораздо проще и более правильно с использованием АПИ
    CModule::IncludeModule(‘iblock’);
    $arFilter = array(‘IBLOCK_ID’ => 7, ‘ACTIVE’ => ‘Y’);
    $arSelect = array(‘ID’,’NAME’,’SECTION_PAGE_URL’);
    $rsSection = CIBlockSection::GetTreeList($arFilter, $arSelect);
    while($arSection = $rsSection->GetNext()) {
    $arRow = array(
    $arSection[‘ID’],
    $arSection[‘NAME’],
    $arSection[‘SECTION_PAGE_URL’]
    );
    }

    • Метод GetTreeList я узнал позже. Моя задача была привести этот многомерный массив в csv вид для тестировщика.
      И кстати, gettreelist не возвращает Названия разделов в виде хлебных крошек, а только название искомого раздела.

Leave a comment

Your email address will not be published.


*