Súgó - Keresés - Tagok - Naptár
Teljes változat: Feladat
PC WORLD Segélyvonal > WEBSAROK > Webszerkesztés, programozás > PHP
Spányik Balázs
Tegyük fel, hogy van egy webáruházunk, és abban különböző kategóriákba soroljuk be a termékeket. Például:
  • Akciófigurák
  • Babák
  • Járgányok
  • Kártyajáték
  • Kisvasútak
  • Plüssfigurák
  • Puzzle és kirakós
  • Sportjátékok
  • Társasjátékok
  • Távirányítós modellek
Az egyes kategóriák alkategóriákat is tartalmazhatnak, például a Babák kategória alatt lehetnek ilyen alkategóriák, hogy
  • Barbie
  • Én kicsi pónim
  • Polly pocket
A kategóriákat egy külön táblában tároljuk az adatbázisban, amely az alábbi mezőkből áll:

KÓD
category_id      // kategória azonosítója
category_status  // 0 = aktív, 1 = inaktív
category_name    // kategória neve
category_parent  // melyik kategória alkategóriája (id)

A fenti példánál maradva, a Babák kategória, és az "alatta levő" Baribe alkategória így néz ki:

KÓD
category_id      = 12
category_status  = 1
category_name    = "Babák"
category_parent  = 0

category_id      = 45
category_status  = 1
category_name    = "Barbie"
category_parent  = 12

Fontos! Természetesen a kategóriák nincsenek sorban az adatbázisban, tehát a Babák alkategóriái véletlenül sem közvetlenül a Babák után jönnek (ezért is írtam két különböző id-t). Amikor elindult a bolt, nem is voltak alkategóriák, csak amikor már nagyon sok lett a termék, akkor kezdték el alkategóriákba csoportosítani a játékokat.

Szintén fontos: a webáruház lehetővé teszi további alkategória-szintek bevezetését, tehát a Barbie alkategóriát akár tovább is lehetne osztani a különböző Barbie sorozatok alapján ilyen alkategóriákra, hogy:
  • Filmsztár Barbie
  • Kőműves Barbie
  • Száncsán Barbie
A feladat: felépíteni és megjeleníteni a kategórialistát (név szerinti ábécé-sorrendben), úgy, hogy az alkategóriákat a "szintjük" szerint eltolással jelöljük. Valahogy így:

KÓD
Kategórianév
-- Kategórianév
-- Kategórianév
---- Kategórianév
---- Kategórianév
-- Kategórianév
Kategórianév
Kategórianév
Kategórianév
-- Kategórianév
Kategórianév
-- Kategórianév
-- Kategórianév

Na, kicsit hosszú lett, de azért nem olyan bonyolult. Ha valami nem világos, kérdezzetek nyugodtan. Ha az segít, szívesen csinálok egy minta MySQL adatbázist. Nem kell komplett programot írni. Elég az első lekérdezéstől a kiírásig, úgyis a feldolgozás a lényeg. De nem is kell rögtön konkrét megoldással előállni, beszélgethetünk arról, hogy hogy kezdenétek neki, mit csinálnátok. Szerintem nagyon tanulságos beszélgetés alakulhat ki, sokat lehetne belőle tanulni. ani_wink.gif

Annyit azért még érdekességképpen elmesélek, hogy nem légből kapott a példa: az egyik webáruházunkban többek között ez a rutin fektette ki a MySQL szervert. Kiváló open source megoldás volt, újra kellett írnom az egészet.
Pjotr
SQL:
KÓD
SELECT Categories.category_id, Categories.category_name, Categories.category_parent, IF(category_id IN (SELECT DISTINCT category_parent FROM Categories), 1, 0) AS IsParent
FROM Categories
LEFT JOIN Categories AS Parents ON Categories.category_parent = Parents.category_id
WHERE Categories.category_status = 1 AND Parents.category_status = 1
ORDER BY Categories.category_name ASC


PHP:
KÓD
function dcat(&$from, $parent, $indent = " ") {
    $ret = "";
    foreach ($from as $value) {
        if ($value['category_parent'] == $parent) {
            $ret = $indent . $value['category_name'] . "\n";
            if ($value['IsParent']) {
                $ret = $ret . dcat($from, $parent, $value['category_id'], "--" . $indent);
            }
        }
    }
    return $ret;
}

KÓD
// $cats az adatbázisből lekérdezett kategóriákból épített tömb
// NULL a szülője

dcat($cats, NULL);


Talán. smile.gif Ehhez hasonlót használok egy-két helyen, de ebben lehet hiba, mert csak on-the-fly írtam.
Ez a tartalom egy lebutítottváltozata. A teljes változat képekkel kiegészült megtekintéséhez kérünk, kattints ide.