Вывести разделы инфоблока по первым буквам (алфавитный указатель типа) не меняя структуру каталога. ...

Михаил Базаров

Дата последнего входа: сегодня в 13:14
Дата регистрации: 7 февраля 2012 21:17
День рождения: 7 ноября
Пол: Мужской
Михаил Базаров -> Всем
июня 18, 2018 3:57 am
Вывести разделы инфоблока по первым буквам (алфавитный указатель типа) не меняя структуру каталога.

Например: у нас есть инфоблок с большим количеством разделов (картинка 1).
И мы хотим, на выводе на сайте разбить разделы по буквам (картинка 2).

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

Можно поступить следующим образом:
В шаблоне компонента catalog.section.list (Разделы инфоблока) удаляем все и меняем на такой код:
<?
foreach ($arResult["SECTIONS"] as $arSectionArray) {
      $sectFName = $arSectionArray['NAME'];
      $sectFLetter = mb_substr($sectFName, 0, 1, 'UTF-8');
      $arrayFirsletter .= '\'' . $sectFLetter . '\',';
}

eval('$FirstLetter=array(' . $arrayFirsletter . ');');
extract($FirstLetter);
$uniuLetter = array_unique($FirstLetter);

foreach ($uniuLetter as $onlyOnceLetter) {
       echo '<h3>' . $onlyOnceLetter . '</h3>';
      foreach ($arResult["SECTIONS"] as $arSection) {
         if (mb_substr($arSection['NAME'], 0, 1) == $onlyOnceLetter) { ?>
             <a href="<?= $arSection["SECTION_PAGE_URL"] ?>">
                 <?echo $arSection['NAME']; ?>
            </a>
          <?
          }
     }
}
?>

Пояснения:

Сначала собираем первые буквы всех разделов в одну переменную $arrayFirsletter , так как названия разделов
могут быть как на латинице, так и на кириллице используем mb_substr- с помощью которого и "отрубили" первые буквы названий разделов
foreach ($arResult["SECTIONS"] as $arSectionArray) {
      $sectFName = $arSectionArray['NAME'];
      $sectFLetter = mb_substr($sectFName, 0, 1, 'UTF-8');
      $arrayFirsletter .= '\'' . $sectFLetter . '\',';
}

Далее, с помощью eval, загоняем все буквы в массив array. Так как первые буквы разделов могут повторяться. Переводим array в array_unique - он отберет только уникальные буквы (то бишь без повторов)
eval('$FirstLetter=array(' . $arrayFirsletter . ');');
extract($FirstLetter);
$uniuLetter = array_unique($FirstLetter);

Собственно выводим эти буквы с помощью foreach
foreach ($uniuLetter as $onlyOnceLetter) {
       echo '<h3>' . $onlyOnceLetter . '</h3>';

Внутри которого еще один foreach - который отберет все разделы, начинающиеся на конкретную букву, ну и ссылка на раздел в каталоге.
Если первая буква названия раздела, совпадает с переменной $onlyOnceLetter (в которой, собственно первая буква)
foreach ($arResult["SECTIONS"] as $arSection) {
         if (mb_substr($arSection['NAME'], 0, 1) == $onlyOnceLetter) { ?>
             <a href="<?= $arSection["SECTION_PAGE_URL"] ?>">
                 <?echo $arSection['NAME']; ?>
            </a>
         



Фото:
Михаил Базаров
Кого коробит использование eval. В принципе не рекомендую им злоупотреблять.
Можно сразу загнать результат работы foreach в массив

$FirstLetter   = array();
foreach ($arResult["SECTIONS"] as $arSectionArray) {
     $sectFName = $arSectionArray['NAME'];
     $sectFLetter = mb_substr($sectFName, 0, 1, 'UTF-8');
     $FirstLetter[]   = $sectFLetter;
}
Андрей Белый
Спасибо, Михаил
Все работает!)

Авторизация

На сайте работает вход через социальные сети. Просто, выберите наиболее удобную сеть и авторизация произойдет автоматически:
Проходя авторизацию, Вы безоговорочно принимаете условия политики конфеденциальности