[Помогите] Динамический вывод дочерних категорий

Тема в разделе "OpenCart", создана пользователем Zalom, 29 дек 2017.

  1. Zalom

    Zalom

    Регистрация:
    18 мар 2017
    Сообщения:
    37
    Симпатии:
    1
    Здравствуйте, при выборе из select какой-нибудь категории пробую вывести ее подкатегории с помощью $.ajax.
    tpl-файл
    Код:
    <div class="form-group">
                    <label class="col-sm-2 control-label" for="input-category"><?php echo $entry_main_category; ?></label>
                    <div class="col-sm-10">
                      <select id="maincategoryid" name="main_category_id" class="form-control">
                        <option value="*" selected="selected"><?php echo $text_none; ?></option>
                        <?php foreach($categories0 as $category0) { ?>
                        <option value="<?php echo $category0['category_id']; ?>"><?php echo $category0['name']; ?></option>
                        <?php } ?>
                      </select>
                    </div>
                  </div>
                    <div class="col-sm-12">
                      <div class="well well-sm" id='caeg' style="min-height: 150px;max-height: 500px;overflow: auto;">
     
                      </div> 
                    </div> 
    <script type="text/javascript">
        $(document).ready(function(){
        $('#maincategoryid').on('change',function(){
            var dataId = this.options[this.selectedIndex].value;
           $.ajax({
                  url: 'index.php?route=catalog/course/coursetocategory&token=<?php echo $token; ?>&course_id=' + this.value,
                  dataType: 'json',
                   success: function(json) {
                   $('#caeg').html(json);
              }
      });
        });
    });
    </script>
    
    модель
    Код:
        public function getCourseToCategory($parent_id){
            $query = $this->db->query("SELECT c.category_id, cd.name FROM " . DB_PREFIX . "category_description cd LEFT JOIN " . DB_PREFIX . "category c ON cd.category_id=c.category_id  WHERE c.parent_id = '" . (int)$parent_id . "'");
            return $query->rows;
        }
    
    контроллер
    Код:
        public function coursetocategory() {
            $json = array();
          if (isset($this->request->get['course_id'])) {
            $course_id = (int) $this->request->get['course_id'];
          }
          if ($course_id > 0) {
              $this->load->model('catalog/course');
              $catcourse = $this->model_catalog_course->getCourseToCategory($course_id);
              foreach($catcourse as $catc){
                 $json[]=array(
                     'cat_id'=>$catc['category_id'],
                     'cat_name'=>$catc['name']
                     );
                 
              }
            $this->response->addHeader('Content-Type: application/json');
            $this->response->setOutput(json_encode($json));
          }
         
    }
    
    Вывести ничего не получается, ошибок не дает. Но на каждое изменение селекта получаю такое предупреждение: [Violation] Added non-passive event listener to a scroll-blocking 'mousewheel' event. Consider marking event handler as 'passive' to make the page more responsive. See https://www.chromestatus.com/feature/5745543795965952. Посоветуйте пожалуйста как сделать правильно?
     
  2. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Код:
    $('#caeg').html(json);
    Так не получится. У вас же с сервера приходит json, его нельзя просто воткнуть на страницу.

    Для начала убедитесь, что с отправкой запроса и получением ответа от сервера проблем нет и приходит именно то, что должно. И если всё в порядке. то нужно просто распарсить json, обернуть в html и затем уже втыкать на страницу. Либо можно прямо с сервера отправлять html.
     
    Zalom и Master2KAZ нравится это.
  3. Master2KAZ

    Master2KAZ

    Регистрация:
    25 окт 2014
    Сообщения:
    183
    Симпатии:
    72
    А у вас в Опенкарте установлен только 1 язык? Ибо эта функция по идее должна вернуть строк = кол-во подкатегорий * кол-во языков
    PHP:
     public function getCourseToCategory($parent_id){
           
    $query $this->db->query("SELECT c.category_id, cd.name FROM " DB_PREFIX "category_description cd LEFT JOIN " DB_PREFIX "category c ON cd.category_id=c.category_id  WHERE c.parent_id = '" . (int)$parent_id "'");
           return 
    $query->rows;
       }
    по идее надо бы добавить
    PHP:
    ... AND cd.language_id $this->config->get('config_language_id');
    Ну и как уже сказал Dotrox, json возвращается у вас в виде объекта-массива, а не html.
    Вам нужно сначала собрать html, а потом добавлять куда надо.
    Код:
    html = '';
    for(var category of json) {
        html += '<div data-id="' + category['category_id'] + '">' + category['name'] + '</div>';
    }
    $('#caeg').html(html);
    
    Ну или по аяксу принимать уже готовый html. Если вы изучите js-скрипты в файле checkout.tpl я думаю вы разберетесь как это сделать.

    Что-то типа того!
     
    Zalom нравится это.
  4. Zalom

    Zalom

    Регистрация:
    18 мар 2017
    Сообщения:
    37
    Симпатии:
    1
    Спасибо за помощь! Я попробовал сделать так.
    Код:
    <script type="text/javascript">
    $(document).ready(function(){
        $('#maincategoryid').on('change',function(){
            var dataId = this.options[this.selectedIndex].value;
           $.ajax({
                  url: 'index.php?route=catalog/course/coursetocategory&token=<?php echo $token; ?>&course_id=' + this.value,
                  dataType: 'json',
                   success: function(json) {
                    var cat=[];
                     for(var i=0; i<json.length; i++){
                      cat.push('<p>'+json[i]['cat_name']+'</p>');
                }
                $('#caeg').html(cat);
              }
      });
        });
    });
    </script>
    
    Получается json как массив надо перебрать и вывести значения.
     
  5. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Да, вот только вы вместо этого сделали ещё один массив. У вас после обработки json должна получится строка содержащая html (либо чистый текст), но не массив. Посмотрите пример выше от Master2KAZ, там частично псевдокод, но как строку в цикле сформировать прописано точно.