Логически выберите категории и подкатегории (php, joomla, javascript, ajax)

Здравствуйте, я установил компонент jbusinessdirectory для joomla, и у меня есть модуль с именем mod_jbusinessdirectory (это модуль поиска для ведения бизнеса) в файле tmpl/default.php. Я выбрал код: (см. ниже)

<?php if($params->get('showCategories')){ ?>
    <div class="select">
        <div class="categoryic"></div>
        <select name="categorySearch" class="select-styled" id="categories">
    <option value="0">category</option>
    <?php foreach($categories as $category){?>
    <option value="<?php echo $category->id?>" <?php echo $session->get('categorySearch')==$category->id && $preserve?" selected ":"" ?> ><?php echo $category->name?></option>
    <?php if(!empty($category->subcategories)){?>
    <?php foreach($category->subcategories as $subCat){?>
    <option value="<?php echo $subCat->id?>" <?php  echo $session->get('categorySearch')==$subCat->id && $preserve?" selected ":"" ?> >-- <?php echo $subCat->name?></option>
    <?php }?>
      <?php }?>
      <?php }?>
    </select>
    </div>
 <?php }?>

Из этого кода я получаю категории и подкатегории, подобные этому:

  • Основная категория 1
  • подкатегория 1 подкатегория 2 подкатегория 3

  • Основная категория 2

  • подкатегория 1 подкатегория 2 подкатегория 3

снимок экрана здесь: категории и подкатегории скриншот

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

static function getMainCategories(){
    $db = JFactory::getDBO();
    $query = ' SELECT * FROM #__jbusinessdirectory_categories where parent_id=1 and published=1  order by name';
    $db->setQuery($query);
    return $db->loadObjectList();
}

static function getSubCategories(){
    $db = JFactory::getDBO();
    $query = ' SELECT c.* FROM #__jbusinessdirectory_categories c
               inner join  #__jbusinessdirectory_categories  cc  on c.parent_id = cc.id  where c.parent_id!=1  and cc.parent_id = 1 and c.published=1
               order by c.name';
    $db->setQuery($query,0,1000);
    $result = $db->loadObjectList();

    return $result;
}

И, наконец, в файле modjbusinesdirectory.php у меня есть PHP следующим образом:

if($params->get('showCategories')){
    $categories =  modJBusinessDirectoryHelper::getMainCategories();
    if($params->get('showSubCategories')){
        $subCategories = modJBusinessDirectoryHelper::getSubCategories();
        foreach($categories as $category){
            foreach($subCategories as $subCat){
                if($category->id == $subCat->parent_id){
                    if(!isset($category->subcategories)){
                        $category->subcategories = array();
                    }
                    $category->subcategories[] = $subCat;
                }
            }
        }
    }
}

категории и подкатегории скриншот структуры таблицы здесь

Мой вопрос: как мне сделать два запроса, а не один. Где в первом запросе я получаю основные категории, а во втором запросе получаю подкатегории (например: если я выбираю из первого запроса книги основной категории, а во втором запросе выбираю детей, он должен показывать только книги с подкатегорией детские книги).

Ответ 1

Похоже, что код уже делает то, что вы хотите. Вы хотите 2 запроса, а их 2. Но я думаю, что результат этих двух запросов объединяется в 1 результат, и вы хотите, чтобы он плюнул на 2 результата.

Вам нужно будет добавить новые функции категории, которые принимают параметры идентификатора категории.

<?php

static function getCategoryById($id){
  $id = intval( $id ); 
  $db = JFactory::getDBO();
  $query = '
       SELECT * 
       FROM #__jbusinessdirectory_categories
       WHERE 
             published=1
         AND id= '.$id;
  $db->setQuery($query);
  return $db->loadObject();
}

static function getChildCategoryList($id){
  $id = intval($id);
  $db = JFactory::getDBO();
  $query = '
       SELECT c.*
       FROM #__jbusinessdirectory_categories c
       INNER JOIN  #__jbusinessdirectory_categories  cc
         ON c.parent_id = cc.id
       WHERE c.parent_id!=1
       AND cc.id = '.$id.'
       AND c.published=1
       ORDER BY c.name';
     $db->setQuery($query,0,1000);
     $result = $db->loadObjectList();

     return $result;
}

Я не знаком с кодом Joomla, который извлекает параметры, но вы можете найти идентификатор, если вы его отправляете, когда кто-то выбирает основную категорию.

<?php
if($params->get('showCategories')){
    $categoryId = (int) $params->get('mainCategory');
    $category   =  modJBusinessDirectoryHelper::getCategoriesById($categoryId);

    $subCategories = modJBusinessDirectoryHelper::getChildCategoryList($categoryId);
    }
}