Едно меню

12 отговора 521 прегледа
#1

Едно меню

Трябваше ми разгъващо се меню и взех че си написах, но в последствие установих че съм допуснал някои грешки в него и който си поиска чрез външен адрес може да го промени както си иска. Менюто се генерира от база данни където има 3 колнони |id|podmenu|cat| като подменю е описанието което се показва на подменюто. Моля ви помогнете ми да го направя по-добро

if(!$cat) {$cat="0";}
$top_cat=mysql_query ("select * from kategorii where cat='$cat';");
while ($cat_row=mysql_fetch_array ($top_cat)) {
if($m==$cat_row[podmenu]) {echo "<a href='index.php?m=$cat_row[podmenu]'>$cat_row[podmenu]</a>
" ;
$sub_cat=mysql_query ("select * from kategorii where cat='$c';");
while($sub_cat_row=mysql_fetch_array ($sub_cat)) {
$ssccrr= mysql_result(mysql_query("SELECT COUNT(id) as Num FROM kategorii where cat='$sub_cat_row[id]'"),0);
if($ssccrr){
echo"<a href='index.php?id=$idz&p=$sub_cat_row[id]&m=$m&c=$c' >$sub_cat_row[podmenu]</a></p>";}
else{echo"<a href='index.php?id=$sub_cat_row[id]&p=$sub_cat_row[id]&m=$m&c=$c'>$sub_cat_row[podmenu]</a></p>";}
if($p==$sub_cat_row[id]) {
$subcat=mysql_query ("select * from kategorii where cat='$p';");
while($subcatrow=mysql_fetch_array ($subcat)) {
echo"<a href='index.php?id=$subcatrow[id]&m=$m&c=$c&p=$p' >$subcatrow[podmenu]</a>";} }
;}}
else{
echo "<a href='index.php?m=$cat_row[podmenu]&c=$cat_row[id]' >$cat_row[podmenu]</a>
" ;
};}


Отговор
в отговор на gyx4o #2

Re: Едно меню

Сетих се нещо, но не знам до колко ще е ефективно значи проверявам дали страницата от която идват е моята ако е разгъвам менюто, ако не е не го разгъвам защото може да го объркват.

Отговор
в отговор на gyx4o #3

Re: Едно меню

Ami tai kat gledam koda - ne che sam spec. ama mnogo pisane za nishto rabota...
potarsi primersno v hotscripts ima dobri reshenia na folder tree za php - s po-malko kod etc...

Отговор
в отговор на gyx4o #4

Re: Едно меню

хаос ... използвай рекурсия.

а, и ... пусни ERR_ALL за да си видиш белите.

Moscow, раз-два-три, Moscow, посмотри.
Отговор
в отговор на Bълk #5

Re: Едно меню

Ще ми помогнете ли с пример?

Отговор
в отговор на gyx4o #6

Re: Едно меню

ако очакваш, че някой ще ти дебъгва писаниците - грешиш (още повече при такъв стил дет мозъка ти пламва на втори ред). Ако очакваш, че някой ще ти тръгне да разписва решението - грешиш, най-добре е да ти се посочи посоката към него и сам да се научиш.

аз подобни неща ги правих по друг начин:
table
[id | parentid | name]
при което структура на таблица е като пример:
1 | 0 | Entertainment
2 | 1 | Video
3 | 1 | Games
4 | 2 | DVD
5 | 2 | VHS
6 | 3 | PC
7 | 3 | GамеBoy
8 | 5 | Homemade
9 | 5 | Gеnres

навсякъде в УРЛ подаваш само един параметър "id". След това от това id се връщаш рекурсивно към руут-а на дървото по пътя запаметявайки в един масив нодове през които минаваш. Обърщаш този масив наобратно и започваш рекурсивно да прелистваш дървото с условие, че влизаш по-вътре само и ако ноуд е в масива.

Moscow, раз-два-три, Moscow, посмотри.
Отговор
в отговор на Bълk #7

Re: Едно меню

Туй исках да разбера. Мерси.

Отговор
в отговор на gyx4o #8

Re: Едно меню

Пробвах се да направя нещо по начина който ми каза. Направих го, но пак е толкова заплетено като предишното. Толкова ли съм тъп че едно меню не мога да направя като хората???

Отговор
в отговор на gyx4o #9

Re: Едно меню

В отговор на:

Толкова ли съм тъп че едно меню не мога да направя като хората???




Това риторичен въпрос ли е?

Отговор
в отговор на gyx4o #10

Re: Едно меню

Абе не знам какви менюта поддържате, ама аз бих заложил, че не са от милиони записи .

За по-прости конфигурации, можем директно да си наслагаме всичко в един конфигурационен файл -- menu.php. Декларацията на класа и помощната функция може и да не седят там:


<?php
class MenuItem
{
var $Name;
var $TargetUrl;
var $Children;

function MenuItem($name, $href, $children)
{
$this->Name = $name;
$this->TargetUrl = $href;
$this->Children = $children;
}
}

function item()
{
$args = func_get_args();
$name = array_shift($args);
$href = array_shift($args);
return new MenuItem($name, $href, $args);
}


$menu = item("Main", "[линк]",
item("Sub1", "[линк]"),
item("Sub2", "[линк]",
item("Sub2_Sub1", "[линк]", NULL),
item("Sub2_Sub3", "[линк]", NULL),
item("Sub2_Sub4", "[линк]", NULL)));

var_dump($menu);


Накрая директно си пишем дървовидната структура на менюто и не си играем да я превръщаме в таблична, че и да я пращаме в базата. Е може би тоя подход няма да е много удачен за страшно сложно CMS решение.

Отговор
в отговор на gyx4o #11

Re: Едно меню

Значи аз си пооправих първото меню, но искам само да попитам като отправям няколко заявки към базата данни не я ли натоварвам много???

Отговор
в отговор на gyx4o #12

ЗАВИСИ ...

...от заявките. Има бързи има и бавни.
Случвало ми се е да пускам заявка която вървя 16 (шестнадесет) часа !

root@ro6avia#echo rm -rf * > /bin/seek_and_destroy
root@ro6avia#/bin/seek_and_destroy
Отговор
в отговор на ro6avia #13

Re: ЗАВИСИ ...

Ми като гледаш горните заявки как мислиш ще тормозят ли много базата данни?

Отговор