вторник, 28 октября 2014 г.

Битрикс. Сбор карты секций для брендов.


В одном из дизайнов пришла страничка, где для бренда собираются показываются секции, подсекции и показываются счётчики.
В проекте используются инфоблоки версии два, для каждого города создан свой Тип ИБ, внутри которого уже и существуют каталоги, и внутри них соответственно секции и подсекции ИБ. Элементы могут находиться где угодно как на верхнем уровне, так и в секциях/подсекциях  (но не одновременно).
Помимо карты секций, у бренда должна быть возможность добавления описания, картинки, ссылки на официальный сайт и некоторых специфичных выключателей.



Итак, на построение пришли две страницы:
1. список брендов с алфавитной строкой сверху, по клику на буковки показываются все бренды, начинающиеся на этот символ. По умолчанию показываются все бренды с постраничкой. ссылки на бренды с чпу!
алфавитный указатель. кириллица и цифры свалены в кучу.

2. страничка бренда, которая содержит информацию о бренде и карту секций с счётчиками.

карта бренда

Концепция

1. Требование чпу подводит нас к использованию комплексного компонента новости. Список и деталка как раз побрендово, сохраняется возможность использовать эрмитаж для редактирования и для подобных фишек битрикса. Просто копируем стандартно комплексный шаблон и мучаем его как хотим.
2. Для этого все бренды должны собираться в один инфоблок Бренды. Тут же будет и описание бренда и остальные его свойства.
3. Что делать с картой секций? Генерить в файлы, что же ещё; на лету даже с кешированием база несколько напрягалась бы. Ссылки с элементов карты должны вести на смарт-фильтр по производителю по указанной секции.


Бренды и генерация

Свойство Производитель приходит нам для каждого инфоблока в enum, при этом EXTERNAL_ID каждого элемента енума прозрачен для всех инфоблоков, то есть может служить "идентификатором".

А дальше всё относительно просто.
1. Для каждого города, у нас их пока всего четыре, собираем список секций поинфоблочно.
2. Затем получаем список элементов поинфоблочно/посекционно (тут только так, потому что у нас свойства хранятся по версии два).
3. Считаем вхождения каждого бренда. Заодно тут же добавляем в базу бренд, если его там нет. Для этого мы храним отдельный массивчик, который отражает состояние инфоблока Бренды, чтобы каждый раз его не спрашивать.
4. вар_экспортом получаем строковое представление массива карты и сохраняем его в файл для соответствующего бренда в соответствующую папку города.

Тонкости

Сами понимаете, что код получается специфический, и предоставить я его не могу, ещё и по корпоративным причинам. Но могу рассказать про тонкости.

Коды для ЧПУ
В инфоблок Бренды надо также сохранять CODE для бренда, иначе какой там ЧПУ. Автоматически он добавляется только при работе через админку, так что тут всё ручками-ручками.
$brand_code = CUtil::translit($brand_name, 'ru', array('max_len'=>100, 'change_case'=>'L',"replace_space"=>"-","replace_other"=>"-"));

Удаление карт брендов
Само собой, что карту надо удалять, когда бренд сделан нективным. Также карту надо удалять, когда для бренда нет активных элементов. Понять это просто - у нас есть список всех брендов из базы (см. пункт три в разделе Бренды и генерация), для каждого бренда из этого списка смотрим, были ли получены элементы в процессе генерации. Если нет, то удаляем карту.

Урлы секций для смарт-фильтра
А вот это интересно. Чтобы понять как формируется урл для смарт-фильтра после фильтра по свойству пришлось раскапывать недра компоненты смарт-фильтра.
Тут получилось всё не так просто =)
$iblock_url = $section_semantic_url.'?arrFilter_'.$propId.'_'.abs(crc32($brand_enumid)).'=Y&set_filter=Y';

где $section_semantic_url - это человеко-понятный урл секции, для которой будем производить фильтрацию;
$propId - это айди свойства Производитель в текущем инфоблоке, то есть для каждого каталога надо ещё получать айдишку свойства;
$brand_enumid - айдишка элемента (элемента енума) из свойства $propId для нужного бренда.

Соответственно не забываем выставить set_filter в Y, иначе смарт-фильтр не включится.

Комментариев нет:

Отправить комментарий