[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Меню с порядковым номером
skillful
Здравствуйте! Нашел в инете скрипт отображающий многоуровневое меню, делающий всего один запрос к базе.
И не могу проставить номера по порядку т. е. на каждую строчку меню шла неприрывная нумерация (включая подменю) от 1 до 500 получается в этом скрипте. Это реально сделать?

Таблица развертывается файлом make.php



Спустя 1 час, 14 минут, 25 секунд (18.10.2010 - 10:22) sergeiss написал(а):
Покажи код тут, да заодно покажи, что именно тебе непонятно. При вставке кода учти, что тут есть специальные тэги для форматирования разного типа кода, это кнопки справа-сверху от окна редактора.

Спустя 6 минут, 1 секунда (18.10.2010 - 10:28) skillful написал(а):
В коде жирным выделил то место где надо поставить порядковые номера

function buildparent($catid,$table,$partable)
{
if ($catid!=0)
{
$list=$partable[$catid];
$result=each($list);
$output="<a href=index.php?catid=$result[0]>$result[1]</a> / ";
$output=buildparent($result[0],$table,$partable).$output;
}
RETURN $output;
}

function makebranch($parcat,$table,$level,$maxlevel)
{
$list=$table[$parcat];

while(list($key,$val)=each($list))
{

// do the indent
if ($level=="0")
{
$output="<img src=se.gif width=12 height=12>";
}
else
{
$width=($level+1)*24;
$output="<img src=e.gif width=$width height=12>";
}
// the resulting HTML - feel free to change it
// $level is optional

$result.= "$output Вот тут надо в каждой строчке поставить № по порядку <a href=index.php?catid=$key>$val</a> (Уровень: $level)<br>\n";

if ((isset($table[$key])) AND (($maxlevel>$level+1) OR ($maxlevel=="0")))
{
$result.= makebranch($key,$table,$level+1,$maxlevel);
}
}

RETURN $result;
}


// set the default category
if (!isset($catid))
{
$catid=0;
}

// build and print the tree NOTE: $maxlevel is the maximum level,
// set to 0 to show all levels

$rootcatid = $catid;
$maxlevel=0;

$sql = "SELECT id,parent,name FROM menu_jos ORDER BY parent, ordering ASC";


$result=dbquery($sql);
while(list($catid,$parcat,$name)=dbfetch($result))
{
$table[$parcat][$catid]=$name;
$partable[$catid][$parcat]=$name;
}
$result=buildparent($rootcatid,$table,$partable)."<br>";
$result.=makebranch($rootcatid,$table,0,$maxlevel);

echo $result;

?>

Спустя 23 минуты, 45 секунд (18.10.2010 - 10:52) sergeiss написал(а):
Ну дык... Элементарно...

Перед циклом while определи переменную, допустим, $num=1. Затем выводи её в нужном месте и тут же, следующим оператором, делай автоинкремент $num++. И будет то, что тебе надо.

Спустя 3 минуты (18.10.2010 - 10:55) skillful написал(а):
Еслиб было все так элементарно я б наверно сюда не написал. такой способ не работает, т. к. перестает правильно считать когда появляется подменю

Спустя 4 минуты, 28 секунд (18.10.2010 - 10:59) sergeiss написал(а):
А кто (или что) тебе мешает сделать анализ уровня меню и делать вывод и автоинкремент только для меню определенного уровня?
Для этого надо подумать, да... Ну так подумай smile.gif

Спустя 3 минуты, 4 секунды (18.10.2010 - 11:02) skillful написал(а):
sergeiss
я уже несколько дней думал, но не додумал, поэтому создал сдесь тему, чтоб помогли кто знает.

Спустя 7 минут (18.10.2010 - 11:09) Michael написал(а):
тут рекурсия. делай через глобальную переменную.
$result=dbquery($sql);
$iii = 0; // определил

и в функции добавь:
function makebranch($parcat,$table,$level,$maxlevel)
{
global $iii;
$iii ++;
// используй дальше как хочешь.

Спустя 43 минуты, 32 секунды (18.10.2010 - 11:53) skillful написал(а):
Спасибо Michael!
Не догадался использовать глобальную переменную.
Вот так получилось:
function makebranch($parcat,$table,$level,$maxlevel)
{
global $iii;
//$iii ++;
$list=$table[$parcat];

while(list($key,$val)=each($list))
{
$iii ++;


Спустя 3 часа, 20 минут (18.10.2010 - 15:13) skillful написал(а):
Еще одна (последняя) проблема с этим скриптом. Нужно чтобы в каждой строчке меню указывался предыдущий (выше на одну строку) parent [$parcat]. Помогите пожалуйста

function makebranch($parcat,$table,$level,$maxlevel)
{
global $iii;
//$iii ++;
$list=$table[$parcat];

while(list($key,$val)=each($list))
{
$iii ++;
// do the indent
if ($level=="0")
{
$output="<img src=se.gif width=12 height=12>";
}
else
{
$width=($level+1)*24;
$output="<img src=e.gif width=$width height=12>";
}
// the resulting HTML - feel free to change it
// $level is optional

$result.= "$output $iii<a href=index.php?catid=$key>$val</a> (Уровень: $level) Сдесь нужно чтоб отображался parent [$parcat] предыдущей строки <br>\n";

if ((isset($table[$key])) AND (($maxlevel>$level+1) OR ($maxlevel=="0")))
{
$result.= makebranch($key,$table,$level+1,$maxlevel);
}
}

RETURN $result;
}

Спустя 11 минут, 22 секунды (18.10.2010 - 15:24) Michael написал(а):
Может через $table[$parcat-1] .
Без вида самих массивов особо не разгонишся советовать.
Сделай себе print_r($table) и смотри уже что там.

Спустя 18 часов, 34 минуты, 18 секунд (19.10.2010 - 09:59) skillful написал(а):
Michael
массив получается такой
Array
(
[0] => Array
(
[1] => CATEG 1-0
[13] => CATEG 13-0
[14] => CATEG 14-0
[15] => CATEG 15-0
[16] => CATEG 16-0
[17] => CATEG 17-0
[18] => CATEG 18-0
[19] => CATEG 19-0
[20] => CATEG 20-0
[12] => CATEG 12-0
[11] => CATEG 11-0
[10] => CATEG 10-0
[2] => CATEG 2-0
[3] => CATEG 3-0
[4] => CATEG 4-0
[5] => CATEG 5-0
[6] => CATEG 6-0
[7] => CATEG 7-0
[8] => CATEG 8-0
[9] => CATEG 9-0
)

[1] => Array
(
[377] => CATEG 377-1
[310] => CATEG 310-1
[117] => CATEG 117-1
[495] => CATEG 495-1
)

[2] => Array
(
[99] => CATEG 99-2
[245] => CATEG 245-2
[51] => CATEG 51-2
[378] => CATEG 378-2
[337] => CATEG 337-2
)

[3] => Array
(
[415] => CATEG 415-3
[191] => CATEG 191-3
[346] => CATEG 346-3
[103] => CATEG 103-3
[373] => CATEG 373-3
)

[4] => Array

и так до 100
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.