Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Рекурсивное создание выпадающего списка SELECT
 
 автор: skinny   (21.12.2012 в 17:41)   письмо автору
 
 

Задача такая:
собрать выпадающий список на основе таблицы БД
Собираться он будет рекурсивно, так как элементы могут содержать неограниченную вложенность.
Возникла задача, которую никак не могу решить.
я генерирую список SELECT и всё работает, но нужно расставить отступы у дочерних элементов.
Если бы это были вложенные дивы, то ничего сложного, но тут элементы списка и поэтому отступы нужно делать при помощи текстовых символов - пробелы или тире перед дочерним элементом, и каждый раз с увеличением вложенности количество символов должно увеличиваться, а при уменьшении - уменьшаться.
вот этого я как аз и не знаю как сделать.
например нада так:


Пункт 1
-подпункт 1-1
-подпункт 1-2
--подпункт 2-1
--подпункт 2-2
-подпункт 1-3

  Ответить  
 
 автор: psychomc   (21.12.2012 в 18:43)   письмо автору
 
   для: skinny   (21.12.2012 в 17:41)
 

в таблице базы данных должно быть минимум 2 поля:
id и parent_id, id - id записи, parent_id - id родительской записи. вытаскиваете например потом все записи в массив одним запросом, а далее я думаю будет не очень сложно написать рекурсивную функцию, чтобы сгруппировать массив

  Ответить  
 
 автор: skinny   (21.12.2012 в 18:58)   письмо автору
 
   для: psychomc   (21.12.2012 в 18:43)
 

ваш пост абсолютно бесполезен!
я же написал что у меня всё работает
я только незнаю как мне сделать отступы в элементах списка

  Ответить  
 
 автор: Mookapek   (21.12.2012 в 19:10)   письмо автору
 
   для: skinny   (21.12.2012 в 18:58)
 

Может приведете этот код, где всё работает, чтобы было легче вам подсказать где и что надо добавить/подправить?

  Ответить  
 
 автор: skinny   (21.12.2012 в 19:23)   письмо автору
 
   для: Mookapek   (21.12.2012 в 19:10)
 

Да это вопщем то как мне казалось больше теория, врятле мой конкретный случай будет полезен, кроме того я дописываю это к джумле, поэтому там используются элементы её фремворка



function calc_mothers($actitemid,$mother)
     {
         $db =& JFactory::getDBO();
         $q = 'SELECT * FROM `#__k2_calc` WHERE (`deleted` = 0 AND `active`= 1 AND `mother_id` = \''.$db->getEscaped((int)$mother).'\') ORDER BY `order`';
         $db->setQuery($q);
         $i = $db->loadObjectList();
         $unused[]='divider';$unused[]='textarea';$unused[]='hidden';$unused[]='input';
         if(!empty($i))
         {
             if(!$mother)$s .= '
             <select size="1" name="mother_id" class="mothers_droplist">
             <option value=""> --- Материнский элемент --- </option>
             ';
             foreach($i AS $key=>$item)
             {
                 if(!in_array($item->field_type,$unused))
                 {
                     if($actitemid == $item->id) $act = ' SELECTED'; else $act = '';
                     $s .= '<option value="'.$item->id.'"'.$act.'>id:'.$item->id.' - '.$item->caption.' - '.$item->field_caption.' - '.$item->field_value.' - '.$item->prise.' р.</option>'."\n";
                     if($add = calc_mothers($actitemid,$item->id));
                                        $s .= $add;
                     $add = '';
                 }
             }
             if(!$mother)$s .= '
             </select>';
            return($s);
         }
     }

  Ответить  
 
 автор: Sfinks   (21.12.2012 в 19:20)   письмо автору
 
   для: skinny   (21.12.2012 в 17:41)
 

> Если бы это были вложенные дивы, то ничего сложного, но тут элементы списка и
> поэтому отступы нужно делать при помощи текстовых символов

Не очень понятно, как одно вытекает из другого.
Что Вам мешает прописать в css что-то вроде:
ul ul{margin-left:20px;}

При этом код:
<ul>
<li>Пункт 1 
  <ul>
  <li>подпункт 1-1</li>
  <li>-подпункт 1-2
    <ul>
    <li>подпункт 1-2-1</li>
    <li>подпункт 1-2-2</li>
    </ul>
  <li>подпункт 1-3</li>
  </ul>
</li>
</ul>
будет с левым отступом разной ширины.

Либо, если вы хотите делать это символами, то передавайте в рекурсии уровень вложенности:
<?php
  
function recurse$arr$level )
    {
    foreach( 
$arr as $val )
      {
      if( 
is_array($val) ) recurse$val$level+);
      else echo 
str_repeat'&nbsp;'$level );
      }
    }
?>

  Ответить  
 
 автор: Sfinks   (21.12.2012 в 19:22)   письмо автору
 
   для: Sfinks   (21.12.2012 в 19:20)
 

Чет я пропустил момент, что речь про выпадающий список, и подумал про маркированный =)
Ну ладно, пусть первая часть все-равно останется.
А вторая вам должна подойти.

  Ответить  
 
 автор: skinny   (21.12.2012 в 19:44)   письмо автору
 
   для: Sfinks   (21.12.2012 в 19:22)
 

нет
так не получается
оно имеет вложенность на разных уровнях и получается что на последующие элементы накладываются символы которые там ненужны.

  Ответить  
 
 автор: Sfinks   (21.12.2012 в 19:56)   письмо автору
 
   для: skinny   (21.12.2012 в 19:44)
 

А Вы попробуйте.....
По-моему вы чего-то недопоняли.

  Ответить  
 
 автор: skinny   (21.12.2012 в 21:16)   письмо автору
 
   для: Sfinks   (21.12.2012 в 19:56)
 

ну конкретно ваш пример может быть и работает
я из него взял только то что когда функция подставляется внутри себя самой то в level передаётся значение+1,
для списка это не сработало
оно кое где подставляло значения - но не везде правильно
вопщем для списка нада как то подругому.

  Ответить  
 
 автор: Sfinks   (21.12.2012 в 22:47)   письмо автору
 
   для: skinny   (21.12.2012 в 21:16)
 

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

  Ответить  
 
 автор: skinny   (21.12.2012 в 23:13)   письмо автору
 
   для: Sfinks   (21.12.2012 в 22:47)
 

в функцию передаётся только ID выбранного пункта и ID материнского элемента

  Ответить  
 
 автор: Sfinks   (21.12.2012 в 23:43)   письмо автору
 
   для: skinny   (21.12.2012 в 23:13)
 

Только сейчас увидел. Вы весь список строите рекурсивными запросами к БД? Вам сервер не жалко?
При таком устройстве хранения дерева нужно извлекать всю таблицу и работать с результатом на клиенте!
Но это лирика.... Допустим, что так и останется.
Я не могу понять, как мой вариант может не работать!
Покажите исправленную функцию и фрагмент сгенерированного html-кода, который, как вы говорите, не правильный?

  Ответить  
 
 автор: skinny   (22.12.2012 в 14:17)   письмо автору
 
   для: Sfinks   (21.12.2012 в 23:43)
 

честно сказать даже представить не могу как это сделать не рекурсивно
мой код как я уже говорил никак не поможет
ваш пример очень общий он не подходит для меня никак.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования