Отступ с отступом HTML <select>с иерархической моделью смежности MySql и PHP - PullRequest
0 голосов
/ 17 апреля 2019

Мне нужен очень распространенный выпадающий список, который отображает иерархические элементы, в которых все дочерние элементы имеют отступ, добавляя &nbsp; Я получил возможность заполнить выпадающий список в php с правильным иерархическим порядком, но не могу получить его в отступ , Как правильно сделать отступ в выпадающем меню, используя трюк с пробелом, когда элементы отображаются в правильном порядке (дети под нужными родителями), а не с отступом?

В Mysql у меня есть таблица со столбцами Category_ID Item_Name и Parent_ID.

В php, используя запрос, я получаю таблицу со ссылками на нее, в которой есть столбцы Category и Parent

В php, используя выбранную таблицу категорий и непосредственную родительскую категорию, я вызываю функцию parseTree (); который принимает массив результатов sql и возвращает массив полной древовидной структуры.

В php я вызываю функцию printTree (); между тегами <select>, которые рекурсивно перебирают массив дерева и отображают каждый узел тегами <option>.

Внутри printTree () есть функция printChildren (), целью которой является добавление отступов ко всем дочерним массивам, если они найдены. Это не работает.

Желаемый результат:

<select>
 <option>Root</option>
 <option>Root</option>
  <option>&nbsp;Child Level 1</option>
   <option>&nbsp;&nbsp;Child Level 2</option>
     <option>&nbsp;&nbsp;&nbsp;Child Level 3</option>
 </select>

и т.д ....

PHP

<?php

$sql = "SELECT 
        e.cat_Name AS 'Category',
        m.cat_Name AS 'Parent Category'
        FROM
        categories_tbl e
            lEFT JOIN
        categories_tbl m ON m.cat_ID = e.parent_ID";
$result = mysqli_query($db, $sql);


function parseTree($tree, $root = "")
{
    $return = array();
    # Traverse the tree and search for direct children of the root
    foreach($tree as $child => $parent) {
        # A direct child is found
        if($parent == $root) {
            # Remove item from tree (we don't need to traverse this again)
            unset($tree[$child]);
            # Append the child into result array and parse its children
            $return[] = array(
                'name'     => $child,
                'children' => parseTree($tree, $child)
            );
        }
    }
    return empty($return) ? NULL : $return;
}

function printTree($tree)
{
    $indent = "";
    function printChildren($childrenarray)
    {
        $indent .= "&nbsp;&nbsp;";
        if(!is_null($childrenarray) && count($childrenarray) > 0) {

            foreach($childrenarray as $node) {

                echo '<option>' . $indent . $node['name'] . '</option>';
                printChildren($node['children']);

            }
        }
    }

    if(!is_null($tree) && count($tree) > 0) {

        foreach($tree as $node) {

            echo '<option>' . $indentpaddingval . $node['name'] . '</option>';


            if(!is_null($node['children']) && count($node['children']) > 0) {

                printChildren($node['children']);
            }

        }

    }

}

?>

HTML / PHP ДЛЯ ВЫПОЛНЕНИЯ ФУНКЦИЙ И ВЫБОРА НАСЕЛЕНИЯ

<select class="form-control">
    <?php
    $cat_tree_arr = array();

    while ($row = mysqli_fetch_assoc($result)) {



        $cat_tree_arr[$row['Category']] = $row['Parent Category'];


    }
    $result = parseTree($cat_tree_arr);

    printTree($result);

    ?>

</select>

Я добавляю проанализированный массив, содержащий все дерево категорий, в массивы Parent / Children:

Array
(
    [0] => Array
        (
            [name] => All Raw Materials
            [children] => Array
                (
                    [0] => Array
                        (
                            [name] => Bag Raw Materials
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [name] => LDPE Materials
                                            [children] => 
                                        )

                                )

                        )

                )

        )

    [1] => Array
        (
            [name] => All Finished Goods
            [children] => Array
                (
                    [0] => Array
                        (
                            [name] => Local Finished Goods
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [name] => Local Bags
                                            [children] => 
                                        )

                                )

                        )

                    [1] => Array
                        (
                            [name] => Export Finished Goods
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [name] => Export Bags
                                            [children] => 
                                        )

                                )

                        )

                )

        )

)

Ответы [ 2 ]

0 голосов
/ 19 апреля 2019

Код, который работал для меня, и мой вопрос, приведенный выше, закончились следующим образом.Мне просто нужно было подсчитать, сколько раз была вызвана моя рекурсивная функция для заполнения выбора, и каждый раз, когда функция выходила на новый уровень категорий, я мог использовать значение счетчика для повторения строки «» по мере необходимости, добавляя больше для каждогоуровень, который был повторен.

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

Я использовал для этого статическую переменную, но намереваюсь заменить ее на лучший метод.

Я публикую часть своего кода, который создает раскрывающийся список выбора, на случай, если кто-нибудь найдетэто полезно.


             function printTree($tree) {


                        function printChildren($childrenarray) {
                               static $level = 1;
                            if(!is_null($childrenarray) && count($childrenarray) > 0){
                               $level++; 
                                        foreach($childrenarray as $node) {

                                            echo '<option>'.str_repeat('&nbsp;', $level).$node['name'].'</option>';

                                                printChildren($node['children']);


                                        }

                                --$level;

                            }
                        }

                    if(!is_null($tree) && count($tree) > 0){

                        foreach($tree as $node) {
                            echo '<option bg-danger>'.$node['name'].'</option>';

                                if (!is_null($node['children']) && count($node['children']) > 0 ) {

                                    printChildren($node['children']);
                                }

                        }
                    }

             }


0 голосов
/ 18 апреля 2019

Насколько я понимаю, если categoryid будет дифференцировать все продукты, тогда мой ответ будет работать для вас.

Нет необходимости снова присоединяться к одной и той же таблице.

$sql = 'select cat_ID from categories_tbl';
$result = mysqli_query($db, $sql);
echo '<select class="form-control">';
while ($row = mysqli_fetch_assoc($result)){
    $sqlcat_name  = "select cat_Name from categories_tbl where parent_ID="."'".$row['cat_ID']."'"; 
    // echo this query to check that properly formed
    $Secondresult = mysqli_query($db, $sqlcat_name);
    $num_rows     = mysql_num_rows($Secondresult);
    $Secondrow    = mysqli_fetch_assoc($Secondresult)
    for($a=0;$a<$num_rows;$a++){
        echo'<option>';
        for($b=0;$b<$a;$b++){
            echo"   ";
        }
        echo "$Secondrow[$a]"."</option>";
    }
}
echo '</select>';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...