|
|
|
| Задача такая:
собрать выпадающий список на основе таблицы БД
Собираться он будет рекурсивно, так как элементы могут содержать неограниченную вложенность.
Возникла задача, которую никак не могу решить.
я генерирую список SELECT и всё работает, но нужно расставить отступы у дочерних элементов.
Если бы это были вложенные дивы, то ничего сложного, но тут элементы списка и поэтому отступы нужно делать при помощи текстовых символов - пробелы или тире перед дочерним элементом, и каждый раз с увеличением вложенности количество символов должно увеличиваться, а при уменьшении - уменьшаться.
вот этого я как аз и не знаю как сделать.
например нада так:
Пункт 1
-подпункт 1-1
-подпункт 1-2
--подпункт 2-1
--подпункт 2-2
-подпункт 1-3
|
| |
|
|
|
|
|
|
|
для: skinny
(21.12.2012 в 17:41)
| | в таблице базы данных должно быть минимум 2 поля:
id и parent_id, id - id записи, parent_id - id родительской записи. вытаскиваете например потом все записи в массив одним запросом, а далее я думаю будет не очень сложно написать рекурсивную функцию, чтобы сгруппировать массив | |
|
|
|
|
|
|
|
для: psychomc
(21.12.2012 в 18:43)
| | ваш пост абсолютно бесполезен!
я же написал что у меня всё работает
я только незнаю как мне сделать отступы в элементах списка | |
|
|
|
|
|
|
|
для: skinny
(21.12.2012 в 18:58)
| | Может приведете этот код, где всё работает, чтобы было легче вам подсказать где и что надо добавить/подправить? | |
|
|
|
|
|
|
|
для: 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);
}
}
|
| |
|
|
|
|
|
|
|
для: skinny
(21.12.2012 в 17:41)
| | > Если бы это были вложенные дивы, то ничего сложного, но тут элементы списка и
> поэтому отступы нужно делать при помощи текстовых символов
Не очень понятно, как одно вытекает из другого.
Что Вам мешает прописать в css что-то вроде:
При этом код:
<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+1 );
else echo str_repeat( ' ', $level );
}
}
?>
|
| |
|
|
|
|
|
|
|
для: Sfinks
(21.12.2012 в 19:20)
| | Чет я пропустил момент, что речь про выпадающий список, и подумал про маркированный =)
Ну ладно, пусть первая часть все-равно останется.
А вторая вам должна подойти. | |
|
|
|
|
|
|
|
для: Sfinks
(21.12.2012 в 19:22)
| | нет
так не получается
оно имеет вложенность на разных уровнях и получается что на последующие элементы накладываются символы которые там ненужны. | |
|
|
|
|
|
|
|
для: skinny
(21.12.2012 в 19:44)
| | А Вы попробуйте.....
По-моему вы чего-то недопоняли. | |
|
|
|
|
|
|
|
для: Sfinks
(21.12.2012 в 19:56)
| | ну конкретно ваш пример может быть и работает
я из него взял только то что когда функция подставляется внутри себя самой то в level передаётся значение+1,
для списка это не сработало
оно кое где подставляло значения - но не везде правильно
вопщем для списка нада как то подругому. | |
|
|
|
|
|
|
|
для: skinny
(21.12.2012 в 21:16)
| | Наверно тут не в списке дело, а в исходных данных.
Не могли бы вы показать, что изначально отправляется в функцию? | |
|
|
|
|
|
|
|
для: Sfinks
(21.12.2012 в 22:47)
| | в функцию передаётся только ID выбранного пункта и ID материнского элемента | |
|
|
|
|
|
|
|
для: skinny
(21.12.2012 в 23:13)
| | Только сейчас увидел. Вы весь список строите рекурсивными запросами к БД? Вам сервер не жалко?
При таком устройстве хранения дерева нужно извлекать всю таблицу и работать с результатом на клиенте!
Но это лирика.... Допустим, что так и останется.
Я не могу понять, как мой вариант может не работать!
Покажите исправленную функцию и фрагмент сгенерированного html-кода, который, как вы говорите, не правильный? | |
|
|
|
|
|
|
|
для: Sfinks
(21.12.2012 в 23:43)
| | честно сказать даже представить не могу как это сделать не рекурсивно
мой код как я уже говорил никак не поможет
ваш пример очень общий он не подходит для меня никак. | |
|
|
|