Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V  < 1 2  
Reply to this topicStart new topic
> Nielimitowana Ilosc Kategorii.
Vengeance
post
Post #21





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

Ostrzeżenie: (0%)
-----


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ć (IMG:http://forum.php.pl/style_emoticons/default/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 ;]
Go to the top of the page
+Quote Post
orson
post
Post #22





Grupa: Zarejestrowani
Postów: 548
Pomógł: 2
Dołączył: 19.07.2003

Ostrzeżenie: (0%)
-----


Cytat(nediam @ 2004-10-28 21:15:09)

witam ...

hmm ... Vengeance (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)

pozdrawiam
Go to the top of the page
+Quote Post
Vengeance
post
Post #23





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

Ostrzeżenie: (0%)
-----


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 ;]
Go to the top of the page
+Quote Post
herbatniczek
post
Post #24





Grupa: Zarejestrowani
Postów: 84
Pomógł: 0
Dołączył: 12.10.2004

Ostrzeżenie: (0%)
-----


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.(IMG:http://forum.php.pl/style_emoticons/default/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?
Go to the top of the page
+Quote Post
orson
post
Post #25





Grupa: Zarejestrowani
Postów: 548
Pomógł: 2
Dołączył: 19.07.2003

Ostrzeżenie: (0%)
-----


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.(IMG:http://forum.php.pl/style_emoticons/default/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
Go to the top of the page
+Quote Post
Thaal
post
Post #26





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 1.06.2003

Ostrzeżenie: (0%)
-----


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

Ten post edytował Thaal 4.11.2004, 16:21:16
Go to the top of the page
+Quote Post
Vengeance
post
Post #27





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

Ostrzeżenie: (0%)
-----


a ja mam pytanie czy wiesz ile to zapytan generuje (IMG:http://forum.php.pl/style_emoticons/default/snitch.gif)
Go to the top of the page
+Quote Post
Thaal
post
Post #28





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 1.06.2003

Ostrzeżenie: (0%)
-----


Cytat(Vengeance @ 2004-11-04 16:57:11)
a ja mam pytanie czy wiesz ile to zapytan generuje (IMG:http://forum.php.pl/style_emoticons/default/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ą (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
orson
post
Post #29





Grupa: Zarejestrowani
Postów: 548
Pomógł: 2
Dołączył: 19.07.2003

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
nediam
post
Post #30





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 30.01.2004

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Vengeance
post
Post #31





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

Ostrzeżenie: (0%)
-----


o dzieki za cynk. jak znajde chwile checi to to sprawdze (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
orson
post
Post #32





Grupa: Zarejestrowani
Postów: 548
Pomógł: 2
Dołączył: 19.07.2003

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/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 ... (IMG:http://forum.php.pl/style_emoticons/default/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
Go to the top of the page
+Quote Post
nediam
post
Post #33





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 30.01.2004

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
orson
post
Post #34





Grupa: Zarejestrowani
Postów: 548
Pomógł: 2
Dołączył: 19.07.2003

Ostrzeżenie: (0%)
-----


witam ...

Cytat
czy nie powinno byc :

a dziala (IMG:http://forum.php.pl/style_emoticons/default/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
Go to the top of the page
+Quote Post
nediam
post
Post #35





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 30.01.2004

Ostrzeżenie: (0%)
-----


orson nie wiem o co ci chodzi bo to co napisalem jest dobre tzn dobrze dziala wiec niewiem dlaczego niby nie mozna tak zrobic... (IMG:http://forum.php.pl/style_emoticons/default/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)?
Go to the top of the page
+Quote Post
orson
post
Post #36





Grupa: Zarejestrowani
Postów: 548
Pomógł: 2
Dołączył: 19.07.2003

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Vengeance
post
Post #37





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

Ostrzeżenie: (0%)
-----


ok poprawiłem. "dobra" ( bo rozwojowa :] ) wersja dostępna pod tym samym adresem co była. Rozwiązałem to troche inaczej (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

2 Stron V  < 1 2
Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 17.10.2025 - 03:16