Как я могу сделать, чтобы раскрывающееся меню из моей категории mysql отображало таблицу, только если parent_id не равен 0 - PullRequest
0 голосов
/ 20 января 2020

Так что, как говорится в заголовке, я ищу прочь, чтобы сделать мои категории с подкатегориями. Я искал в stackoverflow то, что мне нужно, но ни один из них не помог мне с примерами ..

Вот как выглядит моя таблица enter image description here Так что я знаю, чего я хочу и что я нужно, но я понятия не имею, как я могу это сделать

  1. Мне нужно SELECT * FROM categories ORDER by position ASC
  2. Я должен проверить, больше ли parent_id, чем 0.
  3. Я должен удалить parent_id из моей панели навигации и показывать их только под названием категории, где оно должно быть dropdown menu.

Но я понятия не имею, как я могу сделать все что ..

Вот как я выбираю только свои категории и отображаю их

                  $catsq = mysqli_query($con,"SELECT * FROM categories ORDER by position ASC");
                    while($catinfo=mysqli_fetch_assoc($catsq)) {
                      echo '
                         <li class="nav-item'.(isset($_GET["cat"]) && $_GET["cat"]==$catinfo["id"] ? " active" : "").'">
                           <a class="nav-link" href="./index.php?cat='.$catinfo["id"].'">'.$catinfo["name"].'</a>
                         </li>
                      ';
                    }

, и это выглядит так

<ul class="nav navbar-nav">
    <li class="nav-item">
    <a class="nav-link" href="cat=1">TestCat</a>
    </li>
    <li class="nav-item">
    <a class="nav-link" href="cat=2">TestCat2</a>
    </li>
    <li class="nav-item">
     <a class="nav-link" href="cat=3">TestSub</a>
    </li>
</ul>

но я хочу, чтобы это выглядело вот так

<ul class="nav navbar-nav">
    <li class=""><a href="cat=1">TestCat</a></li>
    <li class="dropdown ">
        //TestCat2 have to doing nothing always.
        <a href="#" class="dropdown-toggle" data-toggle="dropdown">TestCat2</i></a>
        <ul class="dropdown-menu">
            <li><a class="nav-link" href="cat=3">TestSub</a></li>
        </ul>
    </li>
</ul>

когда parent_id больше 0 ..

Если кто-нибудь может мне помочь с этим, было бы здорово ..

Спасибо всем.

1 Ответ

1 голос
/ 21 января 2020

Существует несколько подходов:

  1. Создание массива
  2. Вложенные запросы
  3. Рекурсия

Массив

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

<?php
// get db connection...

// create categories array
$stmt = mysqli_query($con, "SELECT * FROM categories ORDER BY position ASC");
while( $row = mysqli_fetch_assoc($stmt)) {
    // $category[ $row['parent_id] ][ $row['id'] ] = $row; // use if you need to access other fields in addition to name
    $category[ $row['parent_id] ][ $row['id'] ] = $row['name'];
}

// other php stuff...

?>
<html>

... snip ...

<ul class="nav navbar-nav">
    <?php foreach($category[0] as $id => $name): ?>
        <?php if( isset( $category[$id]) ): ?>

          <li class="dropdown ">
                <a href="#" class="dropdown-toggle" data-toggle="dropdown"><?= $name ?></a>
                <ul class="dropdown-menu">
                <?php foreach($category[$id] as $sub_id => $sub_name): ?>

                    <li><a class="nav-link" href="?cat=<?= $sub_id ?>" ><?= $sub_name ?></a></li>
                <?php endforeach; ?>
                </ul>
          </li>

        <?php else: ?>  

            <li class="">
                <a href="?cat=<?= $id ?>"><?= $name ?></a>
            </li>

        <?php endif; ?>
    <?php endforeach; ?>

</ul>

Вложенные запросы

Этот метод проще всего отобразить с использованием воображаемого класса, который выполняет все действия sql за кадром. Для аргумента предположим, что класс Category имеет метод с именем listByParent($parent_id), который возвращает список строк, имеющих назначенный parent_id.

<?php
$cat = new Category();

$topLevel = $cat->listByParent(0);
?>
<html>

... snip ...

<ul class="nav navbar-nav">
    <?php foreach( $topLevel as $topRow ): ?>

        <!-- note, this method is run on every iteration of top level categories -->
        <?php $subRows = $cat->listByParent($topRow['id']) ?>

        <?php if( count($subRows)): ?>
        <li class="dropdown ">
            <a href="#" class="dropdown-toggle" data-toggle="dropdown"><?= $topRow['name'] ?></a>
                <ul class="dropdown-menu">
                <?php foreach($subRows as $row): ?>

                    <li><a class="nav-link" href="?cat=<?= $row['id'] ?>" ><?= $row['name'] ?></a></li>
                <?php endforeach; ?>

                </ul>
          </li>

        <?php else: ?>  

            <li class="">
                <a href="?cat=<?= $topRow['id'] ?>"><?= $topRow['name'] ?></a>
            </li>
        <?php endif; ?>
    <?php endforeach; ?>

</ul>

Рекурсия

Использование рекурсия позволит вам иметь «неограниченные» уровни подкатегорий. Тем не менее, это уровень сложности, который не кажется оправданным в этом случае. Но если вы хотите продолжить, обратите внимание, что лучший способ приблизиться к этому - создать шаблон для html, к которому можно получить программный доступ, с ключевым параметром $cat->findByParent() ...

...