Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Menu sortowanie
Forum PHP.pl > Forum > PHP
sebian
Witam.

Problem polega na tym iz nie wiem jak zrobić Menu drzewko. Nie mam problemu z wyświetleniem wynikow z bazy tylko z sortowaniem tak aby wygladało to tak:

Grupa 1
- Produkt 1
- Produkt 2
- Produkt 3
Grupa 2
- Produkt 1
- Produkt 2
- Produkt 3
itd...

Ilość pozycji i grup zależna jest od tego ile sie tego wprowadzi przez panel admina.
Także chodzi mi głownie jak to wyświetlić w takiej strukturze jak wyżej podałem.
Oto co posiadam:

Index.php
  1. <?php
  2.  
  3. include('baza.php');
  4.  
  5. echo '<h2>Kategorie artykułów</h2>';
  6.  
  7.  
  8. $result = mysql_query("SELECT * FROM articles_categories ORDER BY id ASC");
  9. while($row = mysql_fetch_array($result))
  10. {
  11. echo '<a href="cat.php?id='.$row['id'].'"><b>'.stripslashes($row['tytul']).'</b></a><br />';
  12. echo stripslashes($row['opis']).'<br /><br />';
  13. }
  14.  
  15.  
  16.  
  17. ?>


cat.php
  1. <?php
  2.  
  3.  
  4. include('baza.php');
  5.  
  6. $id = (int)$_GET['id'];
  7.  
  8. $result = mysql_query("SELECT * FROM articles_categories WHERE id='$id'");
  9. $row = mysql_fetch_array($result);
  10.  
  11. echo '<h2>'.stripslashes($row['tytul']).'</h2>';
  12.  
  13. $result = mysql_query("SELECT * FROM articles WHERE id_cat='$id' ORDER BY tytul ASC");
  14. while($row = mysql_fetch_array($result))
  15. {
  16. echo '<a href="art.php?id='.$row['id'].'"><b>'.stripslashes($row['tytul']).'</b></a> <!--('.date("d.m.Y, H:i", $row['data']).') --> <br />';
  17. echo stripslashes($row['opis']).'<br /><br />';
  18. }
  19.  
  20.  
  21.  
  22. ?>


art.php
  1. <?php
  2.  
  3.  
  4. include('baza.php');
  5.  
  6. $id = (int)$_GET['id'];
  7.  
  8. if(isset($_POST['ok']))
  9. {
  10. $data = time();
  11.  
  12. if(empty($nick) || empty($tresc)) $komunikat = 'Wpisz wszystkie pola!';
  13. else
  14. {
  15. $query = "INSERT INTO `articles_comments` (`id_art`, `nick`, `tresc`, `data`) VALUES ('$id', '$nick', '$tresc', '$data')";
  16.  
  17. if(mysql_query($query)) $komunikat = 'Pomyslnie dodano komentarz!';
  18. }
  19. }
  20.  
  21. $result = mysql_query("SELECT * FROM articles WHERE id='$id'");
  22. $row = mysql_fetch_array($result);
  23.  
  24. echo '<h2>'.stripslashes($row['tytul']).'</h2>';
  25. echo '<p>'.stripslashes($row['tresc']).'</p>';
  26.  
  27. echo $komunikat;
  28.  
  29.  
  30.  
  31. ?>


I struktura bazy:
  1. CREATE TABLE `articles` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `id_cat` int(11) NOT NULL,
  4. `tytul` text NOT NULL,
  5. `tresc` text NOT NULL,
  6. `opis` text NOT NULL,
  7. `data` int(11) NOT NULL,
  8. `suma` int(11) NOT NULL,
  9. `ocen` int(11) NOT NULL,
  10. PRIMARY KEY (`id`)
  11. ) ENGINE=MyISAM ;
  12.  
  13.  
  14. CREATE TABLE `articles_categories` (
  15. `id` int(11) NOT NULL AUTO_INCREMENT,
  16. `tytul` text NOT NULL,
  17. `opis` text NOT NULL,
  18. PRIMARY KEY (`id`)
  19. ) ENGINE=MyISAM ;
  20.  
  21.  
  22. CREATE TABLE `articles_comments` (
  23. `id` int(11) NOT NULL AUTO_INCREMENT,
  24. `id_art` int(11) NOT NULL,
  25. `nick` text NOT NULL,
  26. `tresc` text NOT NULL,
  27. `data` int(11) NOT NULL,
  28. PRIMARY KEY (`id`)
  29. ) ENGINE=MyISAM ;
Ges
Generalnie logika mogłaby być taka:


  1. $categories = getAllCategories(); // getAllCategories pobiera SELECT * FROM tabeli kategorii
  2.  
  3. foreach($categories as $categoryId => $category)
  4. {
  5. print $category->name;
  6.  
  7. $subcategories = getSubcategories($categoryId);
  8. //getSubcategories($categoryId) - pobiera wszystkie akrykuły, które należa do tej kategorii, czyli SELECT * FROM ... WHERE id_cat = $categoryId
  9.  
  10. foreach($subcategories as $subcategory)
  11. {
  12. print "-" . $subcategory;
  13. }
  14. }


Oczywiście kod powyżej się nie kompiluje, ale powinnien Cię naprowadzić na sposób w jaki to napisać.
sebian
  1. <?php
  2.  
  3. include('baza.php');
  4.  
  5. $categories = mysql_query("SELECT * FROM articles_categories ORDER BY id ASC"); // getAllCategories pobiera SELECT * FROM tabeli kategorii
  6.  
  7. foreach ($categories as $categoryId => $category)
  8. {
  9. print $category->name;
  10.  
  11. $subcategories = mysql_query("SELECT * FROM articles WHERE id_cat='$categoryId' ORDER BY tytul ASC");
  12. //getSubcategories($categoryId) - pobiera wszystkie akrykuły, które należa do tej kategorii, czyli SELECT * FROM ... WHERE id_cat = $categoryId
  13.  
  14. foreach ($subcategories as $subcategory)
  15. {
  16. print "-" . $subcategory;
  17. }
  18. }
  19. ?>


przy foreach wywala bład... :/ Warning: Invalid argument supplied for foreach() in C:\Program Files (x86)\WebServ\httpd-users\arty\index.php on line 8

Nie wiem dlaczego.

Jeszcze tak probowałem:
  1. <?php
  2.  
  3. include('baza.php');
  4.  
  5. echo '<h2>Kategorie artykułów</h2>';
  6.  
  7.  
  8. $result = mysql_query("SELECT * FROM articles_categories ORDER BY id ASC");
  9. while($row = mysql_fetch_array($result))
  10. foreach($row as $id => $category)
  11. {
  12. print $category->name;
  13.  
  14. $result = mysql_query("SELECT * FROM articles WHERE id_cat='$id' ORDER BY tytul ASC");
  15. while($row = mysql_fetch_array($result))
  16.  
  17. foreach($row as $subcategory)
  18. {
  19. print "-" . $subcategory;
  20. }
  21. }
  22.  
  23.  
  24.  
  25. ?>

ale wtedy wyswietla tylko nagłowek h2 i nic pozatym...
luck
Można spróbować przy użyciu jednego zapytania, coby nie zadżumiać bazy winksmiley.jpg
  1. $articles = mysql_query("SELECT a.*, ac.tytul tytul_kat FROM articles a
  2. LEFT JOIN articles_categories ac ON ac.id = a.id_cat
  3. ORDER BY a.id_cat, a.tytul");
  4.  
  5. $currentCat = -1;
  6.  
  7. while($art = mysql_fetch_array($articles)) {
  8. if($art['id_cat'] != $currentCat) {
  9. echo '<h2>'. $art['tytul_kat'] .'</h2>';
  10. $currentCat = $art['id_cat'];
  11. }
  12.  
  13. echo $art['tytul'];
  14. }
sebian
biggrin.gif PIerwszy raz widze tak skomplikowane zapytanie do bazy biggrin.gif
Wiem ze jest tam zapytanie do articles_categories i articles... ale gdzies jest w zapytaniu bład i nie moge sie połapac... bład wywala w lini:
  1. while($art = mysql_fetch_array($articles)) {
mysql_fetch_array(): supplied argument is not a valid MySQL result resource
czyli zapytanie jest skopan, tylko gdzie biggrin.gif
luck
Racja, sorki. Niepotrzebne WHERE gdzieś się zaplątało.
  1. SELECT a.*, ac.tytul tytul_kat FROM articles a
  2. LEFT JOIN articles_categories ac ON ac.id = a.id_cat
  3. ORDER BY a.id_cat, a.tytul
sebian
dziwny wynik wyszedł.. tongue.gif

Mysłałem ze wypluje mi tak jak to w bazie jest zrobione czyli:

Kategoria 1
- Artykul 1
- Artykul 3
Kategoria 2
- Artykul 2

ale zapodał całkiem inny wynik mianowicie smile.gif

Artykul 1
- Artykul 1
- Artykul 3
- Artykul 2

Nie jestem debesciakiem w php ciagle sie ucze, ale z tym nie wiem co zrobic tongue.gif
luck
Skopiuj jeszcze raz mój kod, bo porawiłem kilka literówek. Powinno być ok.
sebian
Wyszło bajecznie, dzieki wielkie smile.gif smile.gif
teraz sobie menu podepne z tym już chyba dam rade smile.gif
Masz brwara smile.gif
luck
No to całe szczęście, bo bym się zeźlił, że na próżno pisałem winksmiley.jpg
Pozdrawiam.
sebian
ha tongue.gif Jeszcze jeden szkopuł tongue.gif biggrin.gif Jak dorobiłem do tego link tongue.gif:P:P

http://78.9.89.146/~arty/ (lnku do mojego PC)


tam gdzie pisze "Kupa" pod linkiem powinien być art tongue.gif
A jest w kategori 2 w artykule nr 2 tongue.gif
Potrzebuje z tabeli articles jeszcze ID wyciagnać i podpiac pod link aby prawidłowo wyswietlało tylko nie wiem jak dołozyć zapytanie do tego co zrobiłeś... jesli byś mogł mi tez wytłumaczyc lub masz jakies linkacze gdzie opisana jest budowa takich długich zapytan to bede dzwieczny smile.gif
luck
Bo pewnie do linka wstawiasz id kategorii, zamiast artykułu. Mam rację? Taki prosty debug:
  1. echo $art['tytul'] .', id artykułu='. $art['id'] .', id kategorii='. $art['id_cat']
sebian
No własnie dla tego sie tak stało dlatego tez potrzeba dołożyc zapytanie do articles w celu pobrania id tongue.gif
Tylko wiem jak sie pisze takie wieksze zapytania smile.gif
Teroretycznie wiem co zroić ale nie potrafie tego wykonac tongue.gif

edit.

Dałem zamiazt id_cat samo id i jest git... ale wytłumacz mi gdzie jest fragment zapytania ktory wyciaga id z articles... bo jakos nie dowidze....
luck
Cytat(sebian @ 11.03.2010, 19:38:45 ) *
Dałem zamiazt id_cat samo id i jest git... ale wytłumacz mi gdzie jest fragment zapytania ktory wyciaga id z articles... bo jakos nie dowidze....

No właśnie o to mi chodziło smile.gif A id jest stąd:
  1. SELECT a.*

Pobierasz wszystkie kolumny z tabeli articles.
sebian
Cholerna gwiazdka tongue.gif:P
A moge sie dowiedzieć tak na przyszłość o co chodzi z "a" i z "ac" w zapytaniu smile.gif
luck
Aliasy tabel. Lepiej to widać z użyciem "AS" (które normalnie można je pominąć, a zapytanie i tak będzie poprawne)
  1. SELECT a.* FROM articles AS a

Jeśli masz bardziej rozbudowane zapytanie, to do konkretnych tabel odwołujesz się przez alias. Czyli a.* = articles.*.
sebian
Juz kumam.. smile.gif telar jeszcze problemik z małym znacznikiem tongue.gif
  1. <span class="styletext0"><center>Nasze artukuły</center></span>
  2. <div id="menu_boczne" class="arrowlistmenu">
  3. <?php
  4. include('admin/baza.php');
  5. $articles = mysql_query("SELECT a.*, ac.tytul tytul_kat FROM articles a
  6. LEFT JOIN articles_categories ac ON ac.id = a.id_cat
  7. ORDER BY a.id_cat, a.tytul");
  8.  
  9. $currentCat = -1;
  10.  
  11. while($art = mysql_fetch_array($articles)) {
  12. if($art['id_cat'] != $currentCat) {
  13. echo '<h3 class="menuheader expandable">'. $art['tytul_kat'] .'</h3>';
  14. $currentCat = $art['id_cat'];
  15. }
  16.  
  17. echo '<li><a href="art.php?id='.$art['id'].'"><b>'.$art['tytul'].'</a></li>';
  18.  
  19. }
  20.  
  21. ?>
  22. <!-- <h3 class="menuheader expandable">: GRUPA 1</h3>
  23. <ul class="categoryitems">
  24. <li><a href="#">Pozycja 1</a></li>
  25. <li id="tab2"><a href="#">Pozycja 2</a></li>
  26. <li id="tab3"><a href="#">Pozycja 3</a></li>
  27. <li id="tab4"><a href="#">Pozycja 4</a></li>
  28. <li id="tab5"><a href="#">Pozycja 5</a></li>
  29. </ul>
  30. <h3 class="menuheader expandable">: GRUPA 2</h3>
  31. <ul class="categoryitems">
  32. <li id="tab1"><a href="#">Pozycja 1</a></li>
  33. <li id="tab2"><a href="#">Pozycja 2</a></li>
  34. <li id="tab3"><a href="#">Pozycja 3</a></li>
  35. <li id="tab4"><a href="#">Pozycja 4</a></li>
  36. <li id="tab5"><a href="#">Pozycja 5</a></li>
  37. </ul>
  38. <h3 class="menuheader expandable">: GRUPA 3</h3>
  39. <ul class="categoryitems">
  40. <li id="tab1"><a href="#">Pozycja 1</a></li>
  41. <li id="tab2"><a href="#">Pozycja 2</a></li>
  42. <li id="tab3"><a href="#">Pozycja 3</a></li>
  43. <li id="tab4"><a href="#">Pozycja 4</a></li>
  44. <li id="tab5"><a href="#">Pozycja 5</a></li> -->
  45. </ul>
  46. </div>

Kazda ta pentla
  1. echo '<li><a href="art.php?id='.$art['id'].'"><b>'.$art['tytul'].'</a></li>';
musi siedzieć w
  1. <ul class="categoryitems"> </ul>
bo inaczej js zle interpretuje całe menu isie nie rozwija.. smile.gif tylko z tym ze ul nie moze być petla.
Czyli to musiało by byc takie cos
  1. <ul class="categoryitems">
  2. I TU PETLA
  3. </ul>
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.