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

Каскад выпадающих списков работает только после авторизации

00 голосов
5
Уважаемы коллеги подскажите. Написана страничка на которой присутствует 2 select. первый select заполняется прямо разделами инфоблока. а второй select на основе выбранного раздела. Всё работает, но только если авторизован в системе. Пробовал выставлять права на страницы не помогло. Скрипты вообще не выполняются, если не авторизоваться. Вот код страниц. Может кому пригодиться.

vybor.php

Код
<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->SetTitle("");

?>
<?
   include_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/iblock/include.php");
   include_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/php_interface/include/public_tools.php");
?>
<style type="text/css">
.border {
  float: left;
  margin: 10px 0 0 5px;
}
label {
  padding-left: 5px;
}
select {
  width: 130px;
  font-family: Georgia, Times, "Times New Roman", serif;
  font-size: 9pt;
  color: #000;
}
</style>
<? $APPLICATION->AddHeadScript('../js/jquery-1.3.1.js')?>
<script type="text/javascript">
(function($){
  // очищаем select
  $.fn.clearSelect = function() {
     return this.each(function(){
        if(this.tagName=='SELECT') {
            this.options.length = 0;
            $(this).attr('disabled','disabled');
        }
     });
  }
  // заполняем select
  $.fn.fillSelect = function(dataArray) {
     return this.clearSelect().each(function(){
        if(this.tagName=='SELECT') {
           var currentSelect = this;
           $.each(dataArray,function(index,data){
              var option = new Option(data.text,data.value);
              if($.support.cssFloat) {
                 currentSelect.add(option,null);
              } else {
                 currentSelect.add(option);
              }
           });
        }
     });
  }
})(jQuery);
</script>
<script type="text/javascript">
$(document).ready(function(){

  // выбор модели
  function adjustModel(){

     var autoValue = $('#auto').val();
        /*  alert('Выбор модели' + autoValue); */
     var tmpSelect = $('#model');
     if(autoValue.length == 0) {
        tmpSelect.attr('disabled','disabled');
        tmpSelect.clearSelect();
     } else {

        $.getJSON('car.php',{auto:autoValue},function(data) { tmpSelect.fillSelect(data).attr('disabled',''); alert('ajax!');
 });
 

     }
  };
   
  $('#auto').change(adjustModel);
  $('#model').change(function(){
     if($(this).val().length != 0) { alert('Выбор сделан!'); }
  });

});
</script>

<?

$rsElements1 = GetIBlockSectionList(14, 0, Array("sort"=>"asc"), 100);

?>     

  <div class="border">
  <label>Марка</label><br />
<select id="auto" name="auto" > 
<option value="">Выбрать марку</option> 
<? foreach ($rsElements1->arResult as $element) {?>
                                         <option value="<?= $element["ID"] ?>"><?= $element["NAME"] ?></option>
                                        <?}?>

</select> 
</div>
  <div class="border">
  <label>Модель</label><br />
<select id="model" name="model" disabled="disabled"></select>
 </select> 
 </div>
<? require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>


car.php

Код
<?
   require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php"); // ?????? ????? ??????

   require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/iblock/include.php"); // ????????????? ??????
   require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/iblock/prolog.php"); // ?????? ??????
   
   
   
/*    $APPLICATION->RestartBuffer(); */
   /* $_GET["autoValue"] */

   $result[] = array ("value"=>"", "text"=>"Выбрать автомобиль");
$arSelect = Array();
   $arFilter = Array("IBLOCK_ID" => "14", "SECTION_ID"=>$_GET["auto"], "ACTIVE_DATE"=>"Y", "ACTIVE"=>"Y");
   $res = CIBlockElement::GetList( Array("sort"=>"asc"), $arFilter, false, false, $arSelect );                           
   while($ob = $res->GetNextElement()){
      $arFields = $ob->GetFields();
     $result[] = array ("value"=>$arFields["ID"], "text"=>$arFields["NAME"]);
     }
   print html_entity_decode(json_encode($result), ENT_QUOTES, 'UTF-8'); 
  /* print json_encode($result); */
/*    echo $result; */
   die();
?> 
 

спросил 15 Авг, 13 от BloOdy (120 баллов)

5 Ответы

00 голосов
А права на инфоблоки стоят на чтение для всех?
ответил 15 Авг, 13 от Almarea (3,760 баллов)
00 голосов
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/iblock/include.php");
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/iblock/prolog.php");

Наверно, лучше писать CModule::IncludeModule("iblock")

Если ничего не происходит, когда не авторизован, то скорей всего кеш. ctrl+f5

Цитата
makshram пишет:
$.getJSON('car.php',{auto:autoValue},function(data) { tmpSelect.fillSelect(data).attr('disabled',''); alert('ajax!');

Смотри, в IE могло случиться так закешировалась страница car.php и все, т.е. терь не изменишь ее, тем более аякс используется. Надо что-то так думать car.php?<?=rand(1, 10000000);?>, ну в общем чтоб URL разный был.
ответил 21 Окт, 13 от Incubus (580 баллов)
00 голосов
спасибо за подсказанное направление. Вопрос решился.
Цитата
А права на инфоблоки стоят на чтение для всех?
- в настройках вообще не нашёл возможность изменение прав доступа. могу предположить что всегда стоит чтение, иначе вообще ничего не будет работать.

Цитата
Код
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/iblock/include.php");
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/iblock/prolog.php");

Наверно, лучше писать
Код
CModule::IncludeModule("iblock")
заменив код на
Код
CModule::IncludeModule("iblock") 
- всё отказалось работать во всех направлениях. А вот код
Код
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/iblock/prolog.php");
не нужен вообще. А для того чтобы заработало для всех понадобилось заменить
Код
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php");
на
Код
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
. Вот так и заработало. А кеш не играл оказываеться никакой роли.
ответил 24 Янв, 14 от BloOdy (120 баллов)
00 голосов
Да, как-то не обратил внимание на prolog_ADMIN_before.php.

Но все равно, CModule::IncludeModule("iblock"); должно работать. Наверно, без точки с запятой вставили код.

По идее должно так быть

require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
CModule::IncludeModule("iblock");
ответил 12 Май, 14 от Incubus (580 баллов)
00 голосов
точку с запятой использовал, уже на автомате. Попробую ещё раз, может был невнимателен. спасибо за подсказку.
ответил 09 Сен, 14 от BloOdy (120 баллов)

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

0 голосов
6 ответов
0 голосов
3 ответов
спросил 27 Март, 14 от kakashka1 (340 баллов)
0 голосов
1 ответ
спросил 03 Март, 14 от WelMax (430 баллов)
0 голосов
5 ответов
0 голосов
1 ответ
спросил 02 Авг, 13 от Repher (140 баллов)