Как сделать компоновку в Treeview с помощью PHP и SQL? - PullRequest
0 голосов
/ 31 октября 2019

Я строю свое дерево. Я сталкиваюсь с проблемой организации данных из базы данных браузера SQL-запросов для вставки данных в Treeview с помощью PHP. Когда я собираю данные из базы данных в свое древовидное представление, оно показывает много дублирующих данных в моем древовидном представлении. Еще одна проблема - как изменить стиль в дереве? Надеюсь, кто-нибудь может помочь мне проверить, в какой части я ошибаюсь. Спасибо.

Ниже моя кодировка:

<div class="row-fluid">              
<!-- block -->
<div class="block">

    <div class="block-content collapse in">
        <div class="span6"> 
            <?php
                $sql="select * from level_tree lt JOIN users u ON lt.user_id = u.id where lt.referal_id =". $user_id;
                $query=mysql_query($sql);
                if(mysql_num_rows($query)>0){
                    $select_name = 'SELECT * FROM users WHERE id = ' . $user_id;
                    $query_select = db_conn_select($select_name);
    foreach($query_select as $rs_select) {
   $name = $rs_select['name'];
   $email = $rs_select['email'];

     }
                ?>          
             <div id="jstree">
                <ul>
                    <li><?php echo $name. '('.$email.')' ?></li>

                <ul>
                <?php 

                while($rs=mysql_fetch_array($query)){
                    echo "<li>".$rs['name']."&nbsp;(".$rs['email'].")";
                    downline_list($rs['id']);
                    echo "</li>";
                }

            ?>
              </div>
             <?php 
                }else{
                    echo "No downline";
                }
                function downline_list($id){
                    $sql="select * from level_tree lt JOIN users u ON lt.user_id = u.id where lt.referal_id =".$id;
                    $query=mysql_query($sql);
                    if(mysql_num_rows($query)){
                        echo "<ul>";
                        while($rs=mysql_fetch_array($query)){               
                            echo "<li>".$rs['name']."&nbsp;(".$rs['email'].")";
                            downline_list($rs['id']);
                            echo "</li>";
                        }
                        echo "</ul>";
                    }
                }

            ?>               
        </ul></div>
        </div>
    </div>
    <!-- /block -->
  </div>

  <script src="plugins/jstree/dist/jquery-1.10.2.min.js"></script>
 <link rel="stylesheet" href="plugins/jstree/dist/themes/default/style.min.css" />
<script src="plugins/jstree/dist/jstree.min.js"></script>
<script>
$(function () {
// 6 create an instance when the DOM is ready
$('#jstree').bind("ready.jstree", function () {
    $('#jstree').jstree('open_all');
  }).jstree();

}); 
</script>
<style type="text/css">
  .jstree li > a > .jstree-icon {  display:none !important; } 
 </style>

Я хочу получить данные из базы данных, у меня есть 2 таблицы ("users" и "level_tree") в моей базе данных ниже моя база данныхинформация:

Таблица «пользователи» (В этой таблице я использую имя «account2», поэтому в верхней части имени дерева выбрано «developer2», и в этой таблице я хочу получить столбец «name» иданные "email" отображаются в моем дереве. Номер таблицы "referal_id" означает, под каким лицом "имя". Например: в этом примере таблицы, если имя "tong" "referal_id" равно "8", то есть имя "tong"вверх по линии - "Ooi Thong Bee", потому что имя "Ooi Thong Bee" "id" - это "8". "referal_id" - это получение от "id"): enter image description here

Таблица"level_tree" (В этой таблице "referal_id" = 3 означает, что под моей учетной записью "developer2", потому что в таблице "users" имя "developer2" равно "id = 3". Столбец "level" означает, что см. «user_id» обозначает уровень):

enter image description here

Вывод показывает мне, как на картинке ниже:

enter image description here

На самом деле я хочу, чтобы расположение выходных данных и стиль просмотра дерева в виде дерева были такими же, как на картинке ниже:

enter image description here

1 Ответ

0 голосов
/ 31 октября 2019

По логике, ваша таблица level_tree не нужна. Вы можете вывести все это непосредственно из таблицы пользователей.

Пример.

  • Направление Терри - Ooi Thong Bee.
  • Реферал Ooi Thong Bee - developper2.

Так что нет необходимости в другом столе.

В ваших таблицах есть несоответствия. В таблице пользователей у вас нет Hu La La, на который никто не ссылался, в level_tree он установлен на 3. Какой из них хороший?

Что вы должны сделать:

1) поставить всеЗначения referal_id в таблице пользователей.
2) избавиться от таблицы level_tree.
3) построить отображение в виде дерева следующим образом:

  • Определите, какой пользователь является верхнимдерева. Как и вы, скажем, developper2.
  • Найдите всех пользователей, на которых ссылается developper2

    select id from users where referal_id = (select id from users where name = 'developper2').

Вы получитеOoi Thong Bee и Hong Tian Fa. Когда вы отобразите эти два, добавьте 1 уровень отступа.

  • Затем получите упомянутых пользователей Ooi Thong Bee, затем упомянутых пользователей Hong Tian Fa, и так далее, и так далее. Идея состоит в том, что вы получаете привлеченных пользователей всех пользователей, когда вы «спускаетесь» в дерево.

  • Это можно сделать с помощью рекурсивной функции. Каждый раз, когда вы находите ребенка, снова вызывайте рекурсивную функцию и увеличивайте отступ на количество вызовов этой функции. Это называется обходом дерева (когда ваши данные на самом деле упорядочены в виде дерева. Вот в таблице базы данных, но отношения между пользователями определяют таблицу).

Все это говоритчто вам нужно сначала исправить данные, а затем построить алгоритм вокруг этой структуры данных.

Насколько ваш код:

  • $userid используется в вашем первом запросе, нооно никогда не устанавливается (в коде, который вы показываете в любом случае).
  • ваша downline_list функция является правильной идеей. Просто укажите уровень, на котором вы находитесь. Таким образом, вы знаете, какой отступ применять (уровень * 4 пробела). Перед повторным вызовом downline_list увеличьте отступ.
  • Выясните, что делает код, и почему это довольно просто. Добавьте операторы печати вокруг и посмотрите, что он делает в каждой итерации. Ex. пользователи 111, 222 и 333 не должны быть найдены как указано тонг. Только по ффф. Поэтому напечатайте параметры запроса и результаты, чтобы увидеть, что происходит.

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...