Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Nielimitowana Ilosc Kategorii.
Forum PHP.pl > Forum > PHP
telepawel
Witam,

Od 2 godzin siedze na rozwiazaniem dla systemu katalogow php + mysql.

Mam zapisane kategorie w bazie mysql w postaci
1_2_3 (np zupy w proszku grzybowe)
1 (zupy wszystkie)
1_4 (zupy o smaku owocow lesnych)
2_3 (warzywa zielone)
2 (warzywa wszystkie)
jako ID.

Kazdy znak _ to przejscie do podkategorii.
I teraz jak to zrobic aby skrypt wyslwietlal dane kategorie wg. glebokosci ?
Prawidlowo powinno byc:
1 (zupy wszystkie)
-> 1_2_3 (np zupy w proszku grzybowe)
-> 1_4 (zupy o smaku owocow lesnych)
2 (warzywa wszystkie)
2_3 (warzywa zielone)
itd.

Prosze o pomoc poniewaz jestem w martwym punkcie.

Pozdrawiam
invx
z tego co zrozumialem po prostu zastosuj do kategori
Kod
WHERE id='$zmienna'
hwao
Moze sie przyda:
http://amnesty.scene.pl/~szacool/hwao/php/Tree/
telepawel
hwao...DZIEKUJE BARDZO!!

Teraz wyglada to zupelnie inaczej smile.gif

Pozdrawiam
Pawel
orson
witam ...

mozesz tez zastosowac system ktory jest opisany w arcie na php.pl ... jestem jego wielkim zwolennikiem ... w skrocie:
jako id kategorii stosujesz liczbe typu decimal z 10 miejscami po przecinku [przykladowo] i kazda kategoria ma tak:
4.1201230201 a znaczy to:
4 - zupy
12 - winiary
01 - instant
23 - zurek
02 - 200g
01 - pakowany po 100 sztuk
ten sposob jest bardzo prosty w implementacji i wykozystaniu ... i praktycznie jest nie ograniczony bo: przy liczbie typy decimal o 10 miejscach po przeciunku masz 12 liczb przed kropka ... to duzo ... pozatym masz 99*99*99*99*99 podkategorii dla kazdej z kategorii .... 10 minut i mozna zmienic to na 9999*9999*9999*9999*9999 a to jest juz praktycznie nie ograniczona liczba ... pozatym zapytania sa banalnie proste .... chcesz wsyztkie zupy questionmark.gif dajesz selekta where id > 4 and id < 5 i masz all zupki ... chcesz same winiary questionmark.gif id > 4.12 and id < 4.13 .... i wresze koluma id jest kolumna w ktorej sa liczby ... wiec pobieranie i przetwoazanie [sortowanie porownywanie] jest zoptymalizowane ... a funkcjia pobierajaca wszystkie produkty nalezace do danej kategorii wlacznie ze zliczeniem ile ich jest jest realizowana przez 1 zapytanie do bazy ...

pozdrawiam ...
Pianandrill
Z drzewkami się aktualnie ścieram. Podoa mi się art na stronie Depesha, ale nie jest to dokładnie to co potrzebuje.

Przy tworzeniu drzewek sama forma drzewka i wyciąganie wyników to jedno, ale trzeba tez rozwiązać problem dodawania nowej podkategorii, usuwania podkategorii (co z jej podkategoriami), i przeniesienia kategorii. Jeżeli nagle zdecydujesz że dana podkategoria powinna znaleźć się w innej... czy niema zbyt duzo komplikacji z tym...

Wogóle czy w systemach drzewek zakładać rozwiązanie które pozwala na zmianę położenia podkategorii? to jest akurat dosyć sklomplikowane.
Poza tym najlepiej chyba jeżeli osobna tabela opisuje strukturę drzewa.

Prosze o dopowiedź i orson jak możesz to przedstaw rozwiązanie usuwania kategorii (co się dzieje z podkategoriami) i modyfikacji.
orson
witam ...

[pod]kategorie usuwaja sie same:
  1. DELETE FROM `catTable` WHERE `catID` > 5.2 AND `catID` < 5.3

wywala kategorie z wszystkimi pod kategoriami ... przesuniecie kategorii moze byc bardziej problematyczne ale trzeba pamietac ze to sa liczby ... czyli mozna na nich robic operacje matematyczne [przesuniecie o 1 to przeciez +1, o 0.001 to +0.001] nawet w poleceniu UPDATE sql ...
  1. UPDATE `catTable` SET `catID` = 'catID'+1 WHERE `catID` > 4

przesuwa all .... kwestia przemyslanych zapytan do bazy ...

ps. to samo co robi sie na kategoriach trzeba zrobic na produktach exclamation.gif ale ze tam sa liczby skladnia moze byc ta sama .... czyli w 1 przypadku:
  1. DELETE FROM `prodTable` WHERE `catID` > 5.2 AND `catID` < 5.3

lub jezeli nie usuwasz a zmieniasz status:
  1. UPDATE `prodTable` SET `deleted` = 'true' WHERE `catID` > 5.2 AND `catID` < 5.3

a w 2:
  1. UPDATE `catTable`,`prodTable` SET `catID` = 'catID'+1 WHERE `catID` > 4

zalatwiasz all 1 zapytaniem biggrin.gif

w ramach ciekawostki podam ze wyciagniece all kategori z podliczeniem ile produktow jest w kazdej oraz wyswietleniem glownej i 3 podkategori w dol to 1 zapytanie biggrin.gif

pozdrawiam
a79rtur
pozwólcie ze sie wtrące smile.gif w skrypcie z ksiazki mam nastepujacą sytuacje:
Są kategorie Dostawcy , kazdy dostawca ma kategorie towarów powiedzmy KatTowarow a w tych kategoriach Produkty. Skrypt przy dodawaniu nowej kategorii do KatTowarow znajduje najwyzsze ID dla KatTowarów ale dla danego Dostawcy i dodaje do niego 1, w ten sposob tworzone jest nowe ID dla KatTowarow. Tak że w bazie mogą być KatTowarów o identycznych ID. czy to sensowne rozwiazanie ? bo mi sie wydaje ze powinny byc rozne ID dla KatTowarow nawet jesli dostawca jest inny.
Vengeance
no ok spoko sposob orson tylko po co ta liczba przed przecinkiem (kropka) questionmark.gif

Aby odroznic rozne drzewka gdy sa trzymane w jednej tabeli ?
pewnie tak smile.gif

pozatym mozes pokazac to zapytanie
Cytat
w ramach ciekawostki podam ze wyciagniece all kategori z podliczeniem ile produktow jest w kazdej oraz wyswietleniem glownej i 3 podkategori w dol to 1 zapytanie

Tak o ;]
orson
witam ...

to jest copy and paste z php ...
  1. SELECT DISTINCTROW t1. *, t2.pr_verify_date, COUNT( t2.pr_name ) AS num
  2. FROM categories AS t1 LEFT JOIN products AS t2 USING ( cat_id )
  3. WHERE t1.cat_idl > '.round($_GET['id'],10)*.' AND t1.cat_id < '.($_GET['id']+(10/pow(100,$_GET['level'])))**.'
  4. GROUP BY t1.cat_id

dla takich tabel:
  1. #
  2. # Struktura tabeli dla `categories`
  3. #
  4.  
  5. CREATE TABLE `categories` (
  6. `cat_id` decimal(11,10) NOT NULL DEFAULT '0.0000000000',
  7. `group_id` smallint(5) UNSIGNED NOT NULL DEFAULT '0',
  8. `cat_name` char(20) NOT NULL DEFAULT '',
  9. PRIMARY KEY (`cat_id`)
  10. ) TYPE=MyISAM AUTO_INCREMENT=129 ;
  11.  
  12. # --------------------------------------------------------
  13.  
  14. #
  15. # Struktura tabeli dla `products`
  16. #
  17.  
  18. CREATE TABLE `products` (
  19. `pr_id` smallint(5) UNSIGNED NOT NULL AUTO_INCREMENT,
  20. `group_id` smallint(5) UNSIGNED NOT NULL DEFAULT '0',
  21. `cat_id` decimal(11,10) NOT NULL DEFAULT '0.0000000000',
  22. `pr_name` char(50) NOT NULL DEFAULT '',
  23. `pr_prize` decimal(10,2) NOT NULL DEFAULT '0.00',
  24. `pr_add_by` smallint(5) UNSIGNED NOT NULL DEFAULT '0',
  25. `pr_verify_by` smallint(5) UNSIGNED DEFAULT NULL,
  26. `pr_add_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  27. `pr_verify_date` datetime DEFAULT NULL,
  28. `pr_amount` smallint(5) UNSIGNED NOT NULL DEFAULT '1',
  29. PRIMARY KEY (`pr_id`)
  30. ) TYPE=MyISAM AUTO_INCREMENT=1425 ;

i teraz male wyjasnienia:
* - id przesylany po url pozwala na wyswietlanie tylko podrzednych kategorii .. czyli jak klikniemy to strona sie odswieza i tym samym zapytaniem wyciagamy tylko kategorie podrzedne
** - level jest przesylany po url i pomaga [mozna to wyliczac przez sql - chyba - ale tak jest szybciej ... sluzy do tego co wyzej ... ograniczania wyswietlanych kategorii ...
wyliczany jest przez:
  1. <?php
  2. $level = strpos($array['cat_id'],'00')/2; //glebokosc danej kategorii
  3. ?>

wyswietlanie zrobione jest w 1 przebiegu petli przez taki wiersz:
  1. <?php
  2. $return .= '<h'.$level***.'><a href='core.php?mode=offer&action=list_prod&id='.$array['cat_level'].'&level='.$level.''> '.$array['cat_name'].' </a> ['.$array['num'].'] </h'.$level.><br>
  3. ?>

*** - dzieki level'owi nie trzeba dawac zadnych ifow/switchow ... zamiast h mozna dac class, id, array [indeks odpowiada nazwie - mainCat, 1stSubCat i inne] kolejna oszczednosc ... biggrin.gif
Cytat
no ok spoko sposob orson tylko po co ta liczba przed przecinkiem (kropka) questionmark.gif

bo jakby nie bylo to to musialby byc string ... a tak jest liczba biggrin.gif

jak sa jeszcze jakies pytania/problemy to piszcie ...

ps. to jest z projektu testowego ... nie chce mi sie szukac finala [ mam gdzies na cd wypalone] wiec kod moze nie dzialac i nie jestem pewien czy w finalu czegos nie zmienilem ale ten kod po wzgledem ogolnym jest dobry ... w finalu pewnie tylko kosmetyka ...

pozdrawiam
Vengeance
to czy final czy nie to akurat dla mnie malo wazne ;]
poszukuje po necie roznych sposobow na drzewka i staram sie wyciagac z nich to co najbardziej mi potrzebne i co mnie sie podoba ;]

chce napisac zwykla uniwersalna klase do takich rzeczy. bo ostatnio jak cos pisalem to na 1000 rekordow robilo 2000 cos zapytan. zrobilem to nie przemyslanie i o efekt jest ;]

thx za kody.
Pianandrill
Wydaje mi się, że mimo wszystko jest to zbyt skomplikowany kod i podatny na błedy.

Podałeś zapytania wykonujące cośtam... ale jak to wyglada w praktyce? Jeżeli chcem przenieść jedną gałąź (fragment innej) w inną lokację to już nie jest to takie proste... zmienia się spora część idCat:
chcę przenieść instant (podkategorię winiary) do podkategorii powiedmy zielone (podkategorii Knorr winksmiley.jpg, która jest kategorią główną). Zmienia się lvl i format identyfikatora, poza tym coś już może używać tego fragmentu w gałęzi Knorr'a

Chcę mieć wyświetlone wszystkie bezpośrednie podkategorie kategorii wybranej, ale znać identyfikatory wszystkich podkategorii (żeby wyświetlić wszystkie produkty wybranej kategorii ale tylko kategorie bezpośrednie).

Akcja może mieć jedynie atrybut wybranej kategorii (powiedzmy akcja PokazKategorie) idCat=3.1234. W przedstawionym rozwiązaniu sporo obliczeń i pilnowania jest w samym php.

Jak wygląda generowanie ścieżki kategorii Zupy > Winiary > Instant ?

Z tego co widzę to samo konstruowanie zapytań jest niebanalne więc mam wrażenie, że jest to dość skomplikowane w implementacji...

Do tej pory najlepszym, najbardziej przejżystym i wygodnym wydaje mi się być patent ze stronki Depesza. Popróbuje jeszcze powalczyć z nim i zaimplementować go w takiej postaci jak mi jest potrzebny. Tam naprawde zapytania mogą być proste co zmniejsza ryzyko wystąpeniea błędów.
Największy problem mam z przenoszeniem kategorii. Samo wyciąganie odpowiednich wartości jest naprawde proste, dodawanie i usuwanie też. Najgorzej jest z modyfikacją. Oczywiście jest to najmniej wykorzystywany element, ale jeżeli robić to wszystko.

Zastanawiam się jeszcze jak rozwiązujecie problem z produktami kategorii usuniętych. Nie do końca odpowiada mi usuwanie produktów wraz z kategorią. W moim rozwiązaniu produkt ot tak sobie nie może być usunięty więc usunięcie kategorii, w której znajdują się produkty jest w zasadzie niedozwolone.

...ale to już jest raczej problem logiki aplikacji i przyjętego rozwiązania.
orson
witam ...

hmm ... nie wiem jaki masz problem z przenoszeniem ... jezeli bedziesz przenosil to bedziesz [juz w aplikacji finalnej] zaznaczal kategorie do przeniesienia [czyli znasz jej catID] i przeciagal/zaznaczal kategorie pod/za/obok/ponad/itp. ma sie znalesc [czyli rowniez znasz jej catID] ... wiec nie wiem w czym problem ... poprostu dodajesz do znanego ci catID jakas wartosc ... np. .01 albo .0001 i masz podkategorie ... potem szybki update tabeli z produktami i po problemie ... jezeli chcesz przenies wiecej naraz, np. kategorie i wszystkie podkategorie to przeciez w id podkategorii zmieniasz dokladnie to damo co w id kategori: [dodalem spacje zeby lepiej bylo widac]
Kod
2.01 00 00 + 0.01 = 2.02 00 00
2.01 01 01 + 0.01 = 2.02 01 01
2.01 01 02 + 0.01 = 2.02 01 02
2.01 01 03 + 0.01 = 2.02 01 03
2.01 02 01 + 0.01 = 2.02 02 01
2.01 02 02 + 0.01 = 2.02 02 02
2.01 02 03 + 0.01 = 2.02 02 03

i po problemie ... wszystko mozna zalatwic zapytaniem ... w update wielu kategorii tez mozesz dodawac i zmienia sie cala struktura drzewa ... to dziala

co do usunietych kategorii to mozna im przydzielic im catID = null a w zapytaniu wyswietlajacym dac ograniczenie where catID not null

Cytat
Chcę mieć wyświetlone wszystkie bezpośrednie podkategorie kategorii wybranej, ale znać identyfikatory wszystkich podkategorii (żeby wyświetlić wszystkie produkty wybranej kategorii ale tylko kategorie bezpośrednie).

przeciez to robi zapytanie z mojego poprzedniego posta ... wlacznie z ograniczaniem widoku tylko do kliknietej kategorii i wszystkich podkategorii ...

Cytat
Akcja może mieć jedynie atrybut wybranej kategorii (powiedzmy akcja PokazKategorie) idCat=3.1234. W przedstawionym rozwiązaniu sporo obliczeń i pilnowania jest w samym php.


ale moze tez byc akcja pokazOdDo(0.1,0.2); ... a co do pilnowania sie ... zawsze trzeba sie pilnowac ... opracujesz cos raz i masz spokoj ...

pozdrawiam
Vengeance
hmm no cos tam naskrobalem. Poniewaz jest to moje pierwsze chyba spotkanie z drzewkami to podejrzewam ze duzo tam bledow bedzie.

http://vengeance.strefaphp.net/Trees.class.php

Moje uwagi:
: czy oplaca sie dla przejrzystosci kodu dublowac dzialanie funkcji create_tree() i create_node()
: wartosci drzewka w przykladzie sa calkowicie przypadkowe ;]
: nie przerazajcie sie tym load() i parametrami. jako ze klasa ma sluzyc reszcie projektu to tak tam jest ;] jest to zwykle uzyskanie instancji obiektu.

no i oceniajcie. i na prawde prosze napisac co mam tam zienic czy tez usunac cale snitch.gif w koncu trzeba sie uczyc a bez praktyki sie nie da snitch.gif
orson
witam ...

jestem aktualnie zupelnie bez czasu wiec jeszcze nie zaglebialem sie w kod zabardzo ale juz widze ze musisz udostepnic klase bazy ... inaczej trzeba przepisac zeby dzialalo na czystym mysql ... przydalby sie jeszcze jakis setup ... cos do zakladania struktury bazy ...

pozdrawiam
Vengeance
no więc:
klasa Trees:
+ działanie: http://vengeance.strefaphp.net/drzewka/Trees.class.php5
+ kod: http://vengeance.strefaphp.net/drzewka/source.php
+ sql: http://vengeance.strefaphp.net/drzewka/drzewko.sql

klasa Modules:
+ kod: http://vengeance.strefaphp.net/drzewka/lib...ules/source.php

klasa DbDriver:
+ kod: http://vengeance.strefaphp.net/drzewka/lib...iver/source.php


Wszystko działa jak powinno ale pod php5 :/ ze względu na to, że mam właśnie tę wersje, ale pisze pod php4 wynikneły różne błędy z przekazywaniem referencji obiektów.

--edit--
a zapomniałem wspomnieć, że jesli ktoś wie co i jak musze zmienić w modules.class.php aby działało pod php4 (przekazywanie referencji obiektu) to prosze o podpowiedź. Bo na razie gdy zrobie
  1. <?php
  2.  
  3. $db = load('DbDriver', false, true);
  4. $db->select_db('jakastambaza');
  5. $sql = load('DbDriver', false, true);
  6. echo $sql->dbname;
  7.  
  8. ?>


to nie otrzymam poprawnego wyniku ;]
nediam
no dobra a jak w takim razie dodac jakis elment do drzewka bez podawania jego id znajac tylko samego rodzica bo przeciez nie zawsze wiem jakie jest poprzednie id w drzewku
bendi
Mielismy taka dyskusje na WebHelpie, http://forum.webhelp.pl/viewtopic.php?t=49636&highlight=tree
orson
witam ...

nie mialem za duzo czasu zeby sie jej przyjzec dokladnie ale widac ze dziala ... jest mala, szybka i w miare uniwersalna ... kilka uwag tak na szybko:
w bazie kategori mozna dodac kolumne addBy i dodac do sortowania [przydatne - nie wiem czy akurat tobie sie przyda ale jezeli klasa ma byc uniwersalna to powinno sie znalesc ...]
mozliwosc sortowania po nazwie [przy kazdym sortowaniu najpierw po id exclamation.gif zawsze bo inaczej traci sie strukture ... ale potem mozna dodac inne rodzaje]
po dodaniu w configu nazwy tableli i jakis parametrow powinna zliczac produkty/itemy w powiazanej bazie ... mozesz wykozystac moj kod do pobierania i liczenia ...

po swietach bede mial troche czasu [deadlines :| ] to sie rozwiaze problem z php4 ... powinno przeciez dzialac ...

pozdrawiam
nediam
Cytat(orson @ 2004-10-28 20:40:12)
po swietach bede mial troche czasu [deadlines :| ] to sie rozwiaze problem z php4 ... powinno przeciez dzialac ...

a kto powiedzial ze nie dziala questionmark.gif ja mam php 4 zmienilem to co podal Vengeance i do tego jeszcze $row->id na $row['id'] oraz $row->name na $row['name'] i dziala biggrin.gif
ale tak jak powieedzialem nie wiem jak rozwiazac problem tego zebym nie musial podawac id pod ktorym chce podpiac nastepny przedmiot
Vengeance
Jeśli chodzi o to, aby do testowego drzewka które jest tam u mnie wykorzystane np. dodać pozycje 'PHP3' do rodzica 'php' podając ID rodzica czyli w tym przypadku :
1.020200

a nie zeby trzeba było podawać:
1.020203

to jak to rozwiązać już wiem tylko nie mam czasu dopisać smile.gif
a o to jak mniej więcej przelać na kod mój pomysł (niezbyt oryginalny) możesz poczytać tu choć mało kto coś napisał:
http://forum.php.pl/index.php?showtopic=21997

orson: dzięki za opinie. rozumiem brak czasu i tak THX ;]

co do php4 to jeszcze kurde sprawdze. nie wiem ale na tamtym serwerze gubił instancję klasy DbDriver więc i ID połączenia z mySQL.
Jutro to jeszcze raz przetestuje ;]
orson
Cytat(nediam @ 2004-10-28 21:15:09)
a kto powiedzial ze nie dziala questionmark.gif

witam ...

hmm ... Vengeance questionmark.gif

pozdrawiam
Vengeance
tak jak mówiłem sama obłsuga drzewek działa wszędzie ale moje połączenia z klasami DbDriver i Modules nie działają pod php4. Już wiem gdzie jest problem i czekam na czyjąś pomoc w tym topicu:

http://forum.php.pl/index.php?showtopic=22376
pozdro ;]
herbatniczek
ccześć, jestem w trakcie tworzenia sklpeu komputerowego. rózne kategorie i podkategorie. chciałęm to zrobić drzewkiem, ale podoba mi się również podejście z liczbą decimal, w którym podajesz na forum za przykład zupy. mam pytanie, co jęsli masz np karty graficzne, już konkretnego szegolnego typu, ale nie masz jakiejś danej, która jest wyzej w hierarchii, nie ma jej napisanej na pudełku. np karty A to liczba 1. Zaś A.A.D.A to jakiś id produktu, który jest kartą. mamy jednak karte, która jest A.A.questionmark.gif?.F - nie wiemy co jest na tym miejscu. Jak ją przypisać ? może 00? i przyporządkować, do jakiejś kategorii A.A.inne?
Drugie pytanie to jak sobie radzić, na z książką zaliczaną jednocześnie do dwóch kategorii? nstworzyc trzecią kategorie, czy dodać ją do dwóch naraz?
orson
witam ...
Cytat
karty A to liczba 1. Zaś A.A.D.A to jakiś id produktu, który jest kartą. mamy jednak karte, która jest A.A.questionmark.gif?.F - nie wiemy co jest na tym miejscu. Jak ją przypisać ? może 00? i przyporządkować, do jakiejś kategorii A.A.

mozesz zrobic tak: 1.17 02 99 ... gdzie indeks 99 jest ostatnim mozliwym i jest przypisany na inne ... w nazwie ma inne i wszystko co niewiesz gdzie dajesz tam ...

Cytat
jednocześnie do dwóch kategorii

musisz stworzyc 2 przedmioty ... ale: mysle nad innym rozwiazaniem 2 kategorii i podam je wieczorem na forum do tego watka ...

pozdrawiam
Thaal
witam...

własnie niedawno bawiłem się czymś podobnym i spłodziłem takie coś

założenie: nie jest określona głębokość podkategorii

  1. <?
  2.  
  3. class menu
  4. {
  5. private $link;
  6. private $stos = array();
  7.  
  8. function __construct()
  9. {
  10. global $_GET;
  11. $this -> link = mysql_connect('127.0.0.1', 'user', 'pssw') or die ('nie mozna polaczyz z baza danych');
  12. mysql_select_db('menu');
  13. if(!isset($_GET['id']))
  14. {
  15.  $this -> stos1(0);
  16. } else {
  17.  $this -> stos1($_GET['id']);
  18. }
  19. }
  20.  
  21. function make_menu()
  22. {
  23. $c = count($this -> stos);
  24. $arr = array();
  25. if($c == 1)
  26. {
  27.  $arr = $this -> pomocnicza($this -> stos[$c - 1], $c - 1);
  28. } else {
  29. for($i = 0; $i < $c; $i++)
  30. {
  31. if($i == 0)
  32. {
  33. $a = $this -> pomocnicza($this -> stos[$i], $i);
  34. } else {
  35. $b = $this -> pomocnicza($this -> stos[$i], $i);
  36. $a = $this -> tablice($b, $a, $this -> stos[$i - 1]);
  37. }
  38. }
  39. $arr = $a;
  40. }
  41. $c = count($arr);
  42. for($i = 0; $i < $c; $i++)
  43. {
  44. echo &#092;"<a href=\"index.php?id=\".$arr[$i][0].\"\">\".$arr[$i][0].\"</a> poziom:\".$arr[$i][5].\"<br>\";
  45. }
  46.  
  47. }
  48.  
  49. function pomocnicza($var, $i)
  50. {
  51. $zap = &#092;"SELECT * FROM menu WHERE id_parent = '\".$var.\"' AND visible = '1';\";
  52. $wyn = mysql_query($zap);
  53. while($line = mysql_fetch_array($wyn))
  54. {
  55. $line[] = $i;
  56. $a[] = $line;
  57. }
  58. return $a;
  59. }
  60.  
  61. function tablice($var1, $var2, $var3)
  62. {
  63. $a = array();
  64. for($i = 0; $i < count($var1); $i++)
  65. {
  66. $a[] = $var1[$i];
  67. if($var1[$i][0] == $var3)
  68. {
  69. for($j = 0; $j < count($var2); $j++)
  70. {
  71. $a[] = $var2[$j];
  72. }
  73. }
  74. }
  75. return $a;
  76. }
  77.  
  78. function stos1($var)
  79. {
  80. if($var == '0')
  81. {
  82. $this -> stos[] = $var;
  83. $this -> make_menu();
  84. } else {
  85. $this -> stos[] = $var;
  86. $this -> get_parent($var);
  87. }
  88. }
  89.  
  90. function get_parent($var)
  91. {
  92. $zap = &#092;"SELECT id_parent FROM menu WHERE id = '\".$var.\"';\";
  93. $l = mysql_query($zap);
  94. $line = mysql_fetch_array($l);
  95. $this -> stos1($line[id_parent]);
  96. }
  97. }
  98. ?>


i struktura bazy:

  1. CREATE TABLE `menu` (
  2. `id` int(4) NOT NULL AUTO_INCREMENT,
  3. `id_parent` int(4) NOT NULL DEFAULT '0',
  4. `visible` enum('0','1') NOT NULL DEFAULT '0',
  5. `text` varchar(100) NOT NULL DEFAULT '',
  6. `val` varchar(100) NOT NULL DEFAULT '',
  7. PRIMARY KEY (`id`)
  8. )



nie testowalem tego za bardzo więc nie wiem czy na 100 % jest to poprawne (a raczej na 100 % wiem że się wysypie w kilku przypadkach) tak więc jak znajdę czas to to jeszcze przerobię, popoprawiam itede itepe... sugestie mile widziane
Vengeance
a ja mam pytanie czy wiesz ile to zapytan generuje snitch.gif
Thaal
Cytat(Vengeance @ 2004-11-04 16:57:11)
a ja mam pytanie czy wiesz ile to zapytan generuje snitch.gif

może się mylę ale liczba tworzonych zapytań = (2 x aktualna 'głębokość') - 1

i na wszelki wypadek jakbym się mylił: błądzić jest rzeczą ludzką biggrin.gif
orson
witam ...

po przemysleniu dzis problemu z produktem w 2 kategoriach doszedlem do 2 rozwiazan:
1) [latwiejsze] dodanie do produktow dodatkowej kolumny/kolumn ... malo eleganckie ale dosc szybkie i latwe w implementacji
2) [trudniejsze - wieksze mozliwosci] dodanie do tabeli produktow 2 nowych kolumny: itemType i itemParent[or smth] ... z roznymi wartosciami ... w tym na przyklad wartosc shadow ... i bedzie to dzialac tak: jezeli produkt jest w 3 kategoriach, np: 1.11 12 33, 12.07 12 09 i 17.12 03 01 to:
tworzymy 3 itemy z czego w 2 ustawiamy type na shadow i itemParent na id tego ktory ma itemType na normal ... teraz wystarczy lekko rozbudowac zapytania i powinno dzialac ... wszystkie dane typy ilosc cena i inne przechowywane sa w glownym itemie a w kopiach sa tylko nulle ... poza typem shadow mozna ustawic inne ... np. typ promocyjny ktory wplywa na pozycje na liscie itp.

aha ... odpadaja wszelkiego typy laczenia id ... typu: 1.111233;12.071209;17.120301 dlatego ze to juz string i nie da sie operowac na nim jak na liczbach ...

1 sposob jest banalny i w miare sprawny ale jestesmy ograniczeni iloscia powtorzonych itemow ... nad 2 trzeba popracowac ale jest duzo bardziej elastyczny ...

pozdrawiam
nediam
Vengeance: twoj sposob nie dziala chyba tak jak powinien tzn chodzi mi dokladniej o show_tree ($id)

mamy takie dzrzewko (etap 3) :
Languages
Local Side
Java Script
Visual Basic
v1.0
Server Side
ASP
ASP.NET
php
PHP4
PHP5

jezeli podasz np. zeby wyswietlilo Local Side to powinno wyswietlic
Local Side
Java Script
Visual Basic
v1.0

a wyswietla:

Local Side
Java Script
Visual Basic
v1.0
Server Side
ASP
ASP.NET
php
PHP4
PHP5

czyli wszysctko co jest po Local Side
Vengeance
o dzieki za cynk. jak znajde chwile checi to to sprawdze smile.gif
orson
witam ...

Vengeance poszedl na latwizne i uzyl prostszego zapytania ... jak popatrzysz na moje zapytanie ze zliczaniem:
  1. SELECT DISTINCTROW t1. *, t2.pr_verify_date, COUNT( t2.pr_name ) AS num
  2. FROM categories AS t1 LEFT JOIN products AS t2 USING ( cat_id )
  3. WHERE t1.cat_id > '.round($_GET['id'],10).' AND t1.cat_id < .($_GET['id']+(10/pow(100,$_GET['level']))).'
  4. GROUP BY t1.cat_id

to zobaczysz:
  1. <?php
  2. 'WHERE t1.cat_id > '.round($_GET['id'],10).' AND t1.cat_id < '.($_GET['id']+(10/pow(100,$_GET['level']))).
  3. ?>

ten kod bierze id i level i generuje ograniczenie dla < ... mimo ze nie wyglada to dziala biggrin.gif ... jezeli przeslesz id 1.01 02 03 to wyswietli menu od 1.010203 do 1.010204 ... czyli ostatnia cyfre zwiekszy o jednostke ... pobierze tez wszystkie podkategorie ... czyli zamiast 1.010203 mozna dac 1.01 ... i pokaze all od 1.01 do 1.02 ... biggrin.gif

mozna wywalic zliczanie ... wystarczy dodac where ......
tam jest znak mniejszosci czyli nastepnej kategorii nie pobiera ... mozna zrobic zeby pobieral ... wystarczy zmienic na <= .... i bedzie ....

pozdrawiam
nediam
orson: o to wlasnie chodzilo thx ale mam taki maly problem czy nie powinno byc :

  1. <?php
  2.  
  3. ( $_GET['id'] + ( 100 / pow (100, $_GET['level'] ) ) )
  4.  
  5. ?>

zamiast
  1. <?php
  2.  
  3. ( $_GET['id'] + ( 10 / pow (100, $_GET['level'] ) ) )
  4.  
  5. ?>

aby dzialalo tak jak mowisz?


a i jeszcze jedno Vengeance i Orson a propos wyciagania level'u
  1. <?php
  2.  
  3. $level = strpos($row['id'], '00')/2;
  4.  
  5. ?>

to co jezel ibedzie np. id = 1.0202000000 wtedy level bedzie rowny 2.5 wiec chyba powinno byc:
  1. <?php
  2.  
  3. $level = round(strpos($_GET['id'], '00')/2);
  4.  
  5. ?>
zeby pokazalo 3
orson
witam ...

Cytat
czy nie powinno byc :

a dziala questionmark.gif ja juz nie pamietam nawet czy to jest z wersji finalnej ... wkleilem to poprostu bez sprawdzania ... jezeli sprawdziles i nie dziala to widocznie powinno byc 100 zamiast 10 ...

Cytat
a propos wyciagania level'u to co jezel ibedzie np. id = 1.0202000000 wtedy level bedzie rowny 2.5 wiec chyba powinno byc:


nie mozesz tego zaograglac ... z levelem to chodzi o to ze jak jest id to ono jest podzielone na bloki ... albo 1 albo 2 albo 3 elementy w bloku:
Kod
bloki: 0    1  2  3  4  5
    id: 1 . 02 02 00 00 00

0 to główna kategoria ... 1 to 1 level, 2 to 2 level i tak dalej ... chodzi o znalezienie ostatniego pelnego wystapienia 00 ... czyli tu jest to 2 level ... 00 jest w 3 bloku ... teraz jak to zaokraglisz to tracisz zera ... to wyliczanie levelu jest zle ... brakuje wiersza wczesniej gdzie bylo explode z kropka ... i 2 element z arraya sie sprawdza na wystepowanie 00 a jezeli jest false [00 nie wystepuje] to wtedy jest to ostatni level ...
trzeba lekko poprawic

pozdrawiam
nediam
orson nie wiem o co ci chodzi bo to co napisalem jest dobre tzn dobrze dziala wiec niewiem dlaczego niby nie mozna tak zrobic... blink.gif

Vengeance:

niewiem czy wszystko bedzie tu dzialalo dobrze ale raczej tak,
troszke poprawiona i moim zdaniem lepsza funkcja show_tree tylko wez sobie zmien to tak zeby dzialalo z tymi twoimi modulami
  1. <?php
  2. function show_tree($id=null)
  3. {
  4.  $id = empty($id) ? $this->treeid : $id;
  5.  
  6.  $level = strlen ( round( $id, 10 ) )/2;
  7.  
  8.  $result = mysql_query(&#092;"SELECT * FROM \".$this->dbtable.\" WHERE `id` >= \" .round ($id, 10). \" AND `id` < \" .($id + (100 / pow (100, $level))). \" ORDER BY `id`\");
  9.  
  10.  while($row = mysql_fetch_array($result))
  11.  {
  12. $row['id'] = round( $row['id'], 10 );
  13. $level = strlen( $row['id'] )/2;
  14. $res[] = array ('id' => $row['id'], 'level' => $level, 'name' => $row['name']);
  15.  }
  16.  return $res;
  17. }
  18. ?>


a i jeszce jedno macie jakis pomysl na to zeby nie ograniczac glebokosci do 6 ? tylko np. do 100 albo tak jak jest w temacie nielimitowana ilosc ? chyba zeby zmienic id na DECIMAL(32,30)?
orson
witam ...

pamietam ze mialem z tym problem ... wydawalo sie ze dziala ale nie dzialalo ...
aha ... musisz robic explode na liczbie i brac tylko czesc po kropce dlatego ze jak z przodu bedzie liczba n cyfrowa [np 232.03040104] to masz na innej pozycji niz cyfra 1 ... liczac od poczatku stringu czyli od lewej ...

hmm ... dziwne ale napisales 2 wersje:
Cytat
  1. <?php
  2. $level = strlen ( round( $id, 10 ) )/2;
  3. ?>

i
Cytat
  1. <?php
  2. $level = strpos($row['id'], '00')/2;
  3. ?>

wiec nie wiem o ktore chodzi ...

Cytat
a i jeszce jedno macie jakis pomysl na to zeby nie ograniczac glebokosci do 6 ? tylko np. do 100 albo tak jak jest w temacie nielimitowana ilosc ? chyba zeby zmienic id na DECIMAL(32,30)?

jak masz 11 cyfr z przodu to to jest bardzo duza liczba .... 99 999 999 999 moim zdaniem jak na liczbe kategorii a nie produktow to to jest sporo ... tym bardziej ze kazda ma 99 pod leveli z ktorych kazdy ma 99 podleveli z ktorych kazdy ma 99 i tak dalej ....

pozdrawiam
Vengeance
ok poprawiłem. "dobra" ( bo rozwojowa :] ) wersja dostępna pod tym samym adresem co była. Rozwiązałem to troche inaczej smile.gif tzn. tak jak w innych metodach klasy. Przy show_tree() zapomniałem dodać tego dodawania +1 dla miejsc dziesiętnych a nie części całkowitej jak to było wcześniej. Jak ktoś ma jeszcze jakieś uwagi etc. z chęcią wysłucham smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.