Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Problem z kategoriami i subkategoriami...
Yashin
post
Post #1





Grupa: Zarejestrowani
Postów: 33
Pomógł: 0
Dołączył: 2.09.2005

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


Mam sobie tabelkę w bazie danych:

  1. CREATE TABLE `cms_gallery_cats` (
  2. `gallerycat_id` int(16) NOT NULL AUTO_INCREMENT,
  3. `gallerycat_title` varchar(255) NOT NULL DEFAULT '',
  4. `gallerycat_higherid` varchar(16) NOT NULL DEFAULT '0',
  5. PRIMARY KEY (`gallerycat_id`)
  6. ) TYPE=MyISAM AUTO_INCREMENT=1 ;


gallerycat_id = wiadomo
gallerycat_title = chyba
gallerycat_higherid -> id "nadkategorii", jeżeli ma wartość 0 jest najwyższą kategorią

I chce zrobić tak, żeby user mógł wysłać swój obrazek do galerii (dostępny po akceptacji przez admina)... No i doszedłem do pola, w którym można wybrać kategorię wysyłanego obrazka tongue.gif I mam problem winksmiley.jpg

Chce żeby to był select, i wyglądał mniej więcej tak:

KATEGORIA 1
..... subkat 1
..... subkat 2
.......... subsubkat 1
..... subkat 3
KATEGORIA 2
..... subkat 1
.......... subsubkat 1
............... subsubsubkat 1
.......... subsubkat 2
..... subkat 2

Na kropki nie patrzeć - w <option> w ich miejsce miałobybyć &nbps;
Nie mam pojęcia jak to zrobić dry.gif

ktoś pomoże? rolleyes.gif
Z góry dzięki za wszelaką pomoc Rkingsmiley.png
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 11)
ActivePlayer
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 224
Pomógł: 40
Dołączył: 6.07.2004
Skąd: Wuppertal

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


policz ile rodziców ma dana kategoria... (tzn jak głębokko jest) a potem w selekcie wstaw tyle razy tego &nbsp;
Go to the top of the page
+Quote Post
Yashin
post
Post #3





Grupa: Zarejestrowani
Postów: 33
Pomógł: 0
Dołączył: 2.09.2005

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


Hm... Sorki, ale...
Powiedzmy, że w bazie danych mam:

ID | TITLE | HIGHERID
1 | Main Cat no. 1 | 0
2 | Main Cat no. 2 | 0
3 | SubCat1 no. 1 | 1
4 | SubCat2 no. 1 | 2
5 | Subsubcat no. 1 | 3

No i chce żeby to mi się wyświetliło tak

ID1) Main Cat no. 1
ID3) ..... Subcat1 no. 1
ID5) .......... Subsubcat no. 1
ID2) Main Cat no. 2
ID4) ..... Subcat2 no. 1


Jak je policze, to mi je wyświetli bez ładu i składu...
1 * rodzic = 3 * &nbps; , w nawiasach jest liczba niełamliwych spacji, podane wszystko w kolejności, w jakiej mi to wyświetli

(0) Main Cat no. 1
(0) Main Cat no. 2
(3) SubCat1 no. 1
(3) SubCat2 no. 1
(6) Subsubcat no. 1
Go to the top of the page
+Quote Post
Alchemy_A.R.T.
post
Post #4





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 3.09.2005

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


no to nie takie hopaj-siup 'policz i masz'
ja do tej pory nie wiem jak to ugryzc :|
Go to the top of the page
+Quote Post
nospor
post
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




OT:

Informacja do wszystkich czytajcych ten topic, którzy chcą napisać, że nie wiedzą jak zrobic:
Jak czegoś nie wiecie jak zrobić, nie piszcie że nie wiecie.

@Alchemy_A.R.T. Jak czegoś nie wiesz jak zrobić, nie pisz, że nie wiesz. Jeszcze jeden taki topic, a dostaniesz ostrzeżenie


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
ActivePlayer
post
Post #6





Grupa: Przyjaciele php.pl
Postów: 1 224
Pomógł: 40
Dołączył: 6.07.2004
Skąd: Wuppertal

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


masz policzyć ile ma rodzicow... a nie pobrać id rodzica smile.gif
Go to the top of the page
+Quote Post
batman
post
Post #7





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




Robisz to w taki sposób:

  1. <?php
  2. $q1=mysql_query("select gallerycat_id, gallerycat_title from cms_gallery_cats where gallerycat_higherid=
    0"
    );
  3. echo '<select name="nazwa">';
  4. while ($row1=mysql_fetch_row[$q1])
  5. {
  6. echo '<option value="'.$row1[0].'">'.$row1[1].'</option>';
  7. $q2=mysql_query("select gallerycat_id, gallerycat_title from cms_gallery_cats where gallerycat_higherid=".$row1[0]);
  8. while($row2=mysql_fetch_row($q2))
  9. {
  10. echo '<option value="'.$row2[0].'">'.$row2[1].'</option>';
  11. }
  12. }
  13. echo '</select>';
  14. ?>


Nie testowałem, więc nie wiem czy zadziała, ale wydaje się być ok winksmiley.jpg

Ten post edytował batman 18.09.2005, 07:52:13


--------------------
I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features.
Go to the top of the page
+Quote Post
Yashin
post
Post #8





Grupa: Zarejestrowani
Postów: 33
Pomógł: 0
Dołączył: 2.09.2005

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


Robisz to w taki sposób:

  1. <?php
  2. $q1=mysql_query("select  gallerycat_id, gallerycat_title from cms_gallery_cats where gallery
    cat_higherid=0"
    );
  3. echo '<select name="nazwa">';
  4. while ($row1=mysql_fetch_row[$q1])
  5. {
  6.     echo '<option value="'.$row1[0].'">'.$row1[1].'</option>';
  7.     $q2=mysql_query("select  gallerycat_id, gallerycat_title from cms_gallery_cats where gallery
    cat_higherid="
    .$row1[0]);
  8.     while($row2=mysql_fetch_row($q2))
  9.     {
  10.         echo '<option value="'.$row2[0].'">'.$row2[1].% 
  11. ?>

Po poprawce pierwszego mysql_fetch_row (nawiasy kwadratowe na zwykłe smile.gif ) Działa, ale tylko do pierwszej subkategorii tzn.

GLOWNA 1 (ID 1 | HIGHIER ID 0)
Sub 1 (ID 2 | HIGHERID 1)
//Subsub1 (ID 3 | HIGHERID 2) <== tego nie ma
GLOWNA 1 (ID 4 | HIGHIER ID 0)
etc...
etc...

Może to da się zrobić jakąś pętlą, ale boje się wsadzać w pętlę mysql_query tongue.gif

Jakieś inne idee? worriedsmiley.gif

Jak widzisz że Twoj post jest rozwalony totalnie to go popraw. Tobie sie nie spieszylo wiec ja to zrobilem
---
nospor
Go to the top of the page
+Quote Post
Alchemy_A.R.T.
post
Post #9





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 3.09.2005

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


nospor - ok, ale swoim postem chcialem dac do zrozumienia ze nie jest to takie proste i ze przylaczam sie do pytania
ja to rozwiazalem w dosc niechlujny sposob:
  1. <?php
  2. function wypiszMenu($id)
  3. {
  4.     global $A_matka;
  5.     global $A_nazwa;
  6.     
  7.     echo "<ul>n";
  8.     
  9.     $ile = 0;
  10.     
  11.     foreach($A_matka as $index => $wartosc)
  12.         if ($index > $ile)
  13.             $ile = $index;
  14.     
  15.     for ($i=$ile; $i>=1; $i--)
  16.     {
  17.         if ($A_matka[$i] == $id && strlen($A_matka[$i]) > 0)
  18.         {
  19.             echo '<li><b>&middot;</b> <a href="shop.php?scriptMode=showCategory&categoryRange=';
  20.             $string = $i;
  21.             settype($string, "string");
  22.             echo str_repeat("0", 4 - strlen($string)).$i;
  23.             potomne($i);
  24.             echo '" class="menu">';
  25.             echo $A_nazwa[$i];
  26.             echo '</a></li>';
  27.             echo "n";
  28.             wypiszMenu($i);
  29.         }
  30.     }
  31.     
  32.     echo "</ul>n";
  33. }
  34.  
  35. function potomne($id)
  36. {
  37. global $A_matka;
  38.  
  39. for ($i=count($A_matka); $i>=1; $i--)
  40. {
  41. if ($A_matka[$i] == $id)
  42. {
  43. $string = $i;
  44. settype($string, "string");
  45. echo str_repeat("0", 4 - strlen($string)).$i;
  46. potomne($i);
  47. }
  48. }
  49. }
  50.  
  51. $A_matka = Array();
  52. $A_nazwa = Array();
  53.  
  54. $q = "SELECT id, matka, nazwa FROM menu WHERE stan=1";
  55. $q = mysql_query($q);
  56.  
  57. while ($r = @mysql_fetch_array($q))
  58. {
  59.     $A_matka[$r[0]] = $r[1];
  60.     $A_nazwa[$r[0]] = $r[2];
  61.  
  62. }
  63.  
  64. wypiszMenu(0);
  65.  
  66. ?>

Jest tu tez funkcja potomne ale ona jest zbyteczna wiec mozna ja na razie usunac (ona pobiera id wszystkich potomnym elementow)

Ten post edytował Alchemy_A.R.T. 18.09.2005, 08:55:03
Go to the top of the page
+Quote Post
Kicok
post
Post #10





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

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


  1. <?php
  2.  
  3. function nazwa($str)
  4. {
  5. $dane = explode('<->', $str);
  6. return(str_repeat('&nbsp;', $dane[1]*2).$dane[0]);
  7. }
  8.  
  9. $kategorie1 = array();
  10. $kategorie2 = array();
  11. $nazwy = array();
  12. $wyzsze = array();
  13.  
  14. $result = mysql_query('SELECT * FROM `cms_gallery_cats` ORDER BY gallerycat_id ASC', $conn_id);
  15. while($row = mysql_fetch_array($result))
  16. //pobieranie danych i ładowanie do 3 tabel
  17. {
  18. array_push($kategorie1, $row['gallerycat_id']);
  19. $nazwy[$row['gallerycat_id']] = $row['gallerycat_title'].'<->'.$row['gallerycat_level'];
  20. $wyzsze[$row['gallerycat_id']] = $row['gallerycat_higherid'];
  21. }
  22. foreach($kategorie1 AS $kategoria)
  23. {
  24. if(!in_array(nazwa($nazwy[$kategoria]), $kategorie2))
  25. //jeżeli nie ma jeszcze tej kategorii...
  26. {
  27. $kategorie2[$kategoria] = nazwa($nazwy[$kategoria]);
  28. //...to ja dodaj...
  29. foreach($wyzsze AS $num => $wyzszy)
  30. {  
  31. if($wyzszy == $kategoria)
  32. //...a jesli ma podkategorie...
  33. $kategorie2[$num] = nazwa($nazwy[$num]);
  34. //...to tez je dodaj, zaraz po kategorii
  35. }
  36. }
  37. }
  38.  
  39.  
  40. // wyswietlanie //
  41. echo('<select name="nazwa">');
  42. foreach($kategorie2 AS $num => $kategoria)
  43. echo('<option value="'.$num.'">'.$kategoria.'</option>');
  44. echo('</select>');
  45.  
  46. ?>


Moja propozycja, ale nie jestem z niej zbytnio zadowolony (gdzież to w takim małym kawałku kodu 4 tablice deklarować biggrin.gif). Pobiera dane jednym zapytaniem, do pierwszej tablicy ładuje wszystkie kategorie, do drugiej kategorię nadrzędną bierzącej kategorii, do trzeciej nazwę, a czwarta to tablica wynikowa, która jest składana i na końcu wyświetlana.
Najpierw to chciałem zrobić przy pomocy prev() i next() na jednej tablicy, ale nie mogłem znaleść funkcji, która wstawia jakiś element do środka tablicy (tam gdzie obecnie znajduje się kursor), chociaż wydaje mi się że istnieje ;]
Jeśli chcesz mieć odstępy ze spacji to dodaj do tabeli w bazie danych kolumnę gallerycat_level w której będzie przechowywana `głębokość` danej kategorii



PS. Mój pierwszy post na tym forum więc chciałem się przywitać. W php bawię się od dopiero 3 miechów, ale mam nadzieję, że mnie tu wyszkolicie ;]

Ten post edytował Kicok 18.09.2005, 09:21:18


--------------------
"Sumienie mam czyste, bo nieużywane."
Go to the top of the page
+Quote Post
Yashin
post
Post #11





Grupa: Zarejestrowani
Postów: 33
Pomógł: 0
Dołączył: 2.09.2005

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


Niestety jest ciągle problem... Bo czyta mi kategorie pokolei, jak są dodane do bazy... A ja chce w formie DZIADEK -> TATUS -> DZIDZIUS (ale wymyslilem biggrin.gif ), nawet jak w bazie jest to dodane w kolejności DZDIUS -> TATUS -> DZIADEK... (ale w polu gallerycat_higherid dobrze posortowane)...

W jakim cmsie/systemie portalowym są też subkategorie? Może coś podejrzę...

Wpadło mi do głowy, że można użyć javascripta (np. jak wystawiasz przedmiot na allegro masz coś takiego...)

Co wy na to? :]
Go to the top of the page
+Quote Post
__mK
post
Post #12





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 5.07.2007
Skąd: Poznań

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


Napisałem mała klase na moje potrzeby (listuje mapę strony z dowolna liczbą podkategorii)

  1. <?php
  2. class mapa_strony {
  3.  
  4. public $ile=0;
  5.  
  6. function pobierzKategorie() {
  7.  
  8. }
  9.  
  10. function pobierzMenu($id) {
  11. $_pobierzKategoria = mysql_query("SELECT * FROM `menu` WHERE `IdMenu`='".$id."';");
  12. $_pokazKategorie = mysql_fetch_array($_pobierzKategoria);
  13.  
  14. if ($id!=-1) {
  15. $this->ile=$this->ile+1;
  16. return $this->pobierzMenu($_pokazKategorie['Podmenu']);
  17. }
  18. }
  19.  
  20. function pokazMenu() {
  21. $_pobierzKategorie = mysql_query("SELECT * FROM `menu`;");
  22. while ($_pokazKategorie = mysql_fetch_array($_pobierzKategorie)) {
  23. $efekt="";
  24. $this->pobierzMenu($_pokazKategorie['IdMenu']);
  25. for ($i=0;$i<=$this->ile;$i++) {
  26. $efekt .= ">>";
  27. }
  28. echo $efekt." ".$_pokazKategorie['NazwaM'].$_pokazKategorie['IdMenu']."<br />";
  29. $this->ile=0;
  30. }
  31. }
  32. }
  33.  
  34. $cos = new mapa_strony;
  35. $cos->pokazMenu();
  36. ?>


Ten post edytował __mK 5.07.2007, 12:16:14


--------------------
agencja interaktywna poznań
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 20.08.2025 - 19:48