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

Шаблон вывода разделов каталога catalog.section.list

00 голосов
2
Собственно есть стандартный шаблон catalog.section.list:
Код
<div class="catalog-section-list">
<ul>
<?
$CURRENT_DEPTH=$arResult["SECTION"]["DEPTH_LEVEL"]+1;
foreach($arResult["SECTIONS"] as $arSection):
   if($CURRENT_DEPTH<$arSection["DEPTH_LEVEL"])
      echo "<ul>";
   elseif($CURRENT_DEPTH>$arSection["DEPTH_LEVEL"])
      echo str_repeat("</ul>", $CURRENT_DEPTH - $arSection["DEPTH_LEVEL"]);
   $CURRENT_DEPTH = $arSection["DEPTH_LEVEL"];
?>
   <li><a href="<?=$arSection["SECTION_PAGE_URL"]?>"><?=$arSection["NAME"]?><?if($arParams["COUNT_ELEMENTS"]):?> (<?=$arSection["ELEMENT_CNT"]?>)<?endif;?></a></li>
<?endforeach?>
</ul>
</div>
Элементы (разделы) в нем выводятся почему-то очень непонятным неестественным для html образом в принципе:
Код
<ul>
     <li> раздел 1 </li>
           <ul>
                <li>подраздел 1 раздела 1</li>
                <li>подраздел 2 раздела 1</li>
                <li>подраздел 3 раздела 1</li>
           </ul>
     <li>раздел 2</li>
     <li>раздел 3</li>
</ul>
Подскажите пожалуйста как исправить, чтобы "подсписок" выводился именно в ребенке главного списка, т.е. ребенок списка родителя закрывался за дочерним списком, а не перед ним:
Код
<ul>
    <li> раздел 1
         <ul>
             <li>подраздел 1 раздела 1</li>
             <li>подраздел 2 раздела 1</li>
             <li>подраздел 3 раздела 1</li>
         </ul>
     </li>
     <li>раздел 2</li>
     <li>раздел 3</li>
</ul>
спросил 30 Апр, 14 от Traxexx (900 баллов)

2 Ответы

00 голосов
кажись так
Код
<div class="catalog-section-list"> 
<ul> 
<? 
$CURRENT_DEPTH=$arResult["SECTION"]["DEPTH_LEVEL"]+1; 
foreach($arResult["SECTIONS"] as $arSection): 
   if($CURRENT_DEPTH<$arSection["DEPTH_LEVEL"]){ 
      echo "<ul>"; 
   }elseif($CURRENT_DEPTH>$arSection["DEPTH_LEVEL"]){ 
      echo str_repeat("</ul>", $CURRENT_DEPTH - $arSection["DEPTH_LEVEL"]); 
   }else{ 
      echo'</li>';
   }
   $CURRENT_DEPTH = $arSection["DEPTH_LEVEL"]; 
?> 
   <li><a href="<?=$arSection["SECTION_PAGE_URL"]?>"><?=$arSection["NAME"]?><?if($arParams["COUNT_ELEMENTS"]):?> (<?=$arSection["ELEMENT_CNT"]?>)<?endif;?></a>
<?endforeach?> 
</ul> 
</div>
ответил 22 Дек, 14 от Grimmi (2,560 баллов)
00 голосов
Спасибо, Николай, но не работает, вернее работает, но криво, браузер как выяснилось подставляет закрывающие теги </li> там где они не выводятся.

Понял когда добавил перед открывающим и закрывающим li тег div, мне нужно чтобы контент в li еще дивом обрамлялся. Добавил тег и все нафиг поехало :)

Т.е. чтобы протестить правильно ли работает данный код, нужно тестить в какой-нибудь IDE чтобы она выводила "реальный" код, без исправлений его браузерами.

Я IDE не пользуюсь и дабы сэкономить время решил потестить вывод просто добавив перед открывающими и закрывающими тегами слова "start" "end", т.е. слова рядом с тегами у нас отобразятся в браузере там где эти теги вывел наш код шаблона, а без слов - там где нам уже браузер доставил теги.

вот что получилось когда я Ваш код потестил подобным образом:

Шаблон с добавленными словами:
Код
<div class="catalog-section-list">
<ul>
<?
$CURRENT_DEPTH=$arResult["SECTION"]["DEPTH_LEVEL"]+1;
foreach($arResult["SECTIONS"] as $arSection):
   if($CURRENT_DEPTH<$arSection["DEPTH_LEVEL"]){
      echo "<ul>";
   }elseif($CURRENT_DEPTH>$arSection["DEPTH_LEVEL"]){
      echo str_repeat("</ul>", $CURRENT_DEPTH - $arSection["DEPTH_LEVEL"]);
   }else{
      echo'end</li>';
   }
   $CURRENT_DEPTH = $arSection["DEPTH_LEVEL"];
?>
   <li>start<a href="<?=$arSection["SECTION_PAGE_URL"]?>"><?=$arSection["NAME"]?><?if($arParams["COUNT_ELEMENTS"]):?> (<?=$arSection["ELEMENT_CNT"]?>)<?endif;?></a>
<?endforeach?>
</ul>
</div>
То что вывел браузер (Firefox 3.6.3):
Код
<ul>
end<li>start<a href="#">раздел 1</a>
       <ul>
           <li>start<a href="#">подраздел 1 раздела 1</a>end</li>
           <li>start<a href="#">подраздел 2 раздела 1</a>end</li>
           <li>start<a href="#">подраздел 3 раздела 1</a></li>
      </ul>
   </li>
   <li>start<a href="#">раздел 2</a>end</li>
   <li>start<a href="#">раздел 3</a>end</li>
   <li>start<a href="#">раздел 4</a></li>
</ul>
Как видно некоторые закрывающие теги в коде не генерируются и браузер добавляет их сам (отсутствует "end")
Вполне научным методом тыка :) я добавил в некоторые места вывод еще закрывающих тегов li:
Код
<div class="catalog-section-list">
<ul>
<?
$CURRENT_DEPTH=$arResult["SECTION"]["DEPTH_LEVEL"]+1;
foreach($arResult["SECTIONS"] as $arSection):
   if($CURRENT_DEPTH<$arSection["DEPTH_LEVEL"]){
      echo "<ul>";
   }elseif($CURRENT_DEPTH>$arSection["DEPTH_LEVEL"]){
      echo str_repeat("end</li></ul>end</li>", $CURRENT_DEPTH - $arSection["DEPTH_LEVEL"]);
   }
      else {
      echo'end</li>';
   }
   $CURRENT_DEPTH = $arSection["DEPTH_LEVEL"];
?>
   <li>start<a href="<?=$arSection["SECTION_PAGE_URL"]?>"><?=$arSection["NAME"]?><?if($arParams["COUNT_ELEMENTS"]):?> (<?=$arSection["ELEMENT_CNT"]?>)<?endif;?></a>
<?endforeach?>
end</li></ul>
</div>
Получилось почти то, но не совсем,:
Код
<ul>
end <li>start<a href="#">раздел 1</a>
       <ul>
          <li>start<a href="#">подраздел 1 раздела 1</a>end</li>
          <li>start<a href="#">подраздел 2 раздела 1</a>end</li>
          <li>start<a href="#">подраздел 3 раздела 1</a>end</li>
       </ul>end
    </li>
    <li>start<a href="#">раздел 2</a>end</li>
    <li>start<a href="#">раздел 3</a>end</li>
    <li>start<a href="#">раздел 4</a>end</li>
</ul>
вот этот код:
Код
      else {
      echo'end</li>';
   }
выводит нам закрывающий тег в самом начале открытия самого родительского ul, браузер этот закрывающий тег рубит, так как открывающего нет, это видно по проверочному слову "end" :)

Это условие добавляет закрывающий тег и в "подсписки" поэтому я не додумался как запрограммировать чтобы оно не пихало закрывающий тег в самое начало самого родительского ul.

Эх помог бы кто добить программную часть.
ответил 11 Апр, 15 от Traxexx (900 баллов)

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

0 голосов
2 ответов
спросил 17 Дек, 13 от wintik (100 баллов)
0 голосов
5 ответов
спросил 29 Окт, 13 от Aypuka (340 баллов)
0 голосов
7 ответов
спросил 21 Май, 13 от KLORIS (200 баллов)