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

Как все же передать константу??????

00 голосов
5
Я сейчас взорвусь... почему я не могу передать константу в цикл, вне цикла она видна, а внем превращается в "0"
Код
$sect = $SECTION_ID;

  // выводит рекурсивно дерево разделов
  function ShowSectionsTree($IBLOCK_ID, $SECTION_ID, $deep, $max_deep, $sect)
  {
    global $ID, $APPLICATION;
    static $HTML;
    static $sect;
    $deep++;
    $s_style ="style=\"padding-left:3px\"";
    $rsS = GetIBlockSectionListWithCnt($IBLOCK_ID, $SECTION_ID, Array( "sort"=>"asc"));
    while($arS = $rsS->GetNext())
    {
      $s_url = "/catalog/prod2/section.php?SECTION_ID=".$arS["ID"]; 
      $str ="<tr valign=middle>";     
      for ($i=1;$i<$deep;$i++) 
      {
        $str .= ($i<$deep-1) ? "<td><font class=smallBlueBold>&nbsp;</font></td>" : "<td valign=top><img height=13 src=/bitrix/templates/demo/images/right_down_arrow.gif width=17 border=0></td>";
      }
      $colspan = $max_deep - $deep;


if ($arS["ID"] == $sect):
  $s_class = "class = smallOrangeBold";
else:
  $s_class = "class = smallBlueBold";
endif;

        $str.= sprintf("<td width=100%% colspan=%d><div class=\"smallBlueBold\" %s><a %s href=\"%s\">%s</a>&nbsp;(%d)</div></td></tr>",$colspan, $s_style, $s_class, $s_url, $arS["NAME"],$arS["ELEMENT_CNT"]);    
      $HTML .= $str;
      ShowSectionsTree($IBLOCK_ID, $arS["ID"], $deep, $max_deep, $sect);
    }
    return $HTML;
  }

константа (переменная - кому как удобно) $sect вне цикла на экран выводится, проверял, а внутри обнуляется, и потому не могу ее применить на условие
спросил 08 Дек, 13 от Hellix (320 баллов)

5 Ответы

00 голосов
$sect - это все таки переменная, а не константа. На мой взгляд у вас в коде основательно напутано с использованием статических переменных. Вот цитата из хелпа по PHP:
Цитата
A static variable exists only in a local function scope, but it does not lose its value when program execution leaves this scope.
ответил 10 Фев, 14 от Orkus (240 баллов)
00 голосов
Извините, но суть не в названии передаваемого, будь то константа или переменная, а в том, что она не передается внутрь цикла (условия).
И спасибо за цитату из хелпа РНР, но я в английском, так же как в РНР, ни бум-бум.
Вопрос остается открытым
Условие

if ($arS["ID"] == $sect):
$s_class = "class = smallOrangeBold";
else:
$s_class = "class = smallBlueBold";
endif;

внутри функции: function ShowSectionsTree($IBLOCK_ID, $SECTION_ID, $deep, $max_deep, $sect)
не работает, из-за того, что $sect = $SECTION_ID; вне этой функции в норме, а внутри $sect=0.
Вопрос: КАК СДЕЛАТЬ ТАК, ЧТОБЫ ВСЕ ЗАРАБОТАЛО????
ответил 30 Май, 14 от Hellix (320 баллов)
00 голосов
Цитата
Игорь Лобарев пишет:
Извините, но суть не в названии передаваемого, будь то константа или переменная

Название очень важно. Это разные вещи, они по разному работают и используются для разных целей.

Цитата
Игорь Лобарев пишет:
И спасибо за цитату из хелпа РНР, но я в английском, так же как в РНР, ни бум-бум.

Можно найти хелп по PHP на русском...
Суть цитаты в том, что статическая переменная существует только в локальной области видимости функции. Отличием от обычной локальной переменной является то, что статическая переменная не теряет своего значения между разными вызовами этой функции.
А значит вы используете ее не правильно. Это легко заметно, если упростить код
Код
$sect = 5;
function ShowSectionsTree($sect)
{
   static $sect;
   echo "sect=$sect;";
}
ShowSectionsTree(7);

Результатом будет строка
sect=;
Может быть вам не нужна статическая переменная (я не вникал в суть кода и поэтому не могу сказать,что вам надо)?
ответил 26 Сен, 14 от Orkus (240 баллов)
00 голосов
Все... разобрался, прописал эту переменную в global и заработало
ответил 30 Янв, 15 от Hellix (320 баллов)
00 голосов
Возможно, в вашем случае правильно вообще никак не определять эту переменную внутри функции, т.к. она является у вас параметром функции.
ответил 13 Май, 15 от IMXOM (140 баллов)