Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z kategoriami i subkategoriami...
Forum PHP.pl > Forum > PHP
Yashin
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
ActivePlayer
policz ile rodziców ma dana kategoria... (tzn jak głębokko jest) a potem w selekcie wstaw tyle razy tego &nbsp;
Yashin
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
Alchemy_A.R.T.
no to nie takie hopaj-siup 'policz i masz'
ja do tej pory nie wiem jak to ugryzc :|
nospor
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
ActivePlayer
masz policzyć ile ma rodzicow... a nie pobrać id rodzica smile.gif
batman
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
Yashin
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
Alchemy_A.R.T.
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)
Kicok
  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 ;]
Yashin
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? :]
__mK
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. ?>
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.