IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

PHP: Prezentácia stromovej štruktúry z databázy

Nedávno som sa v diskusnom fóre zmienil o tom, že som vyriešil prezentácia stromovej štruktúry z databázy. Nemožno to robiť priamo v databáze, pretože relačnej databázy na taký typ dát nie sú stavané. Je však možné skombinovať to najlepšie z databázy i PHP.

Najprv si založím databázu a naplním ju nejakými dátami

> sqlite3 tree.sqlite

BEGIN TRANSACTION;
CREATE TABLE strom(id integer primary key autoincrement, gid int, pid int, nazev text);
INSERT INTO "strom" VALUES(1,1,NULL,'prvni vlakno');
INSERT INTO "strom" VALUES(2,1,NULL,'prvni vlakno 2');
INSERT INTO "strom" VALUES(3,1,1,'prvni vlakno 3');
INSERT INTO "strom" VALUES(4,2,NULL,'druhe vlakno 1');
INSERT INTO "strom" VALUES(5,2,NULL,'druhe vlakno 2');
INSERT INTO "strom" VALUES(6,2,4,'druhe vlakno 13');
INSERT INTO "strom" VALUES(7,2,4,'druhe vlakno 14');
INSERT INTO "strom" VALUES(8,2,1,'druhe vlakno 15');
INSERT INTO "strom" VALUES(9,2,7,'druhe vlakno 141');
INSERT INTO "strom" VALUES(10,2,7,'druhe vlakno 142');
INSERT INTO "strom" VALUES(11,2,9,'Příšerně žluťoučký kůň úpěl ďábelské ódy');
INSERT INTO "strom" VALUES(12,2,5,'Přidaný text');
DELETE FROM sqlite_sequence;
INSERT INTO "sqlite_sequence" VALUES('strom',12);
COMMIT;

Význam stĺpcov:

  • id - jednoznačná identifikácia záznamu
  • gid - identifikácia stromu. V jednej tabuľke môže byť viac stromov
  • pid - označenie rodičia aktuálneho záznamu
  • nazov - akýkoľvek text

Ako primárny kľúč ponechám id, pre väčšie fórum je vhodné urobiť ďalší index podľa gid.

Dáta už máme, zostáva nám ich výpis.

<?php
$db=new PDO('sqlite:tree.sqlite');
$prep=$db->prepare('SELECT id, pid, nazev FROM strom WHERE gid=? ORDER BY id;');
$prep->execute(array(2));
$xml=new DOMdocument();
$pole=array();
$pole[0]=$xml->appendChild(new DOMElement('forum'));
while($row=$prep->fetch(PDO::FETCH_ASSOC)){
        $id=$row['id'];
        $pid=isset($row['pid'])?$row['pid']:0;
        $pid=isset($pole[$pid])?$pid:0;
        $pole[$id]=$pole[$pid]->appendChild(new DOMElement('item',$row['nazev']));
}
$xsl=new DOMdocument();
$xsl->load('strom.xsl');
$xslt = new XSLTProcessor();
$xslt->importStylesheet($xsl);
echo $xslt->transformToXML($xml);

Ako je vidieť, v priebehu načítanie dát z neho vytváram stromovú štruktúru v pamäti. Túto štruktúru už priamo odovzdám šablonovacímu systému.

Výstupné šablóna strom.xsl:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" encoding="UTF-8" />

<xsl:template match="/">
<xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;
</xsl:text>
<html>
<xsl:apply-templates />
</html>
</xsl:template>

<xsl:template match="/forum">
    <head>
    <title>Diskuzní fórum</title>
    <link rel="stylesheet" type="text/css" href="style.css" />
    </head>
    <body>
    <xsl:apply-templates />
    </body>
</xsl:template>

<xsl:template match="item">
    <div class="vetvicka">
    <xsl:apply-templates />
    </div>
</xsl:template>

</xsl:stylesheet>

A nakoniec ešte odkazovaný kaskádový štýl style.css. Ten pre náš účel nemusí byť dlhý.

.vetvicka {
        margin-left:4%;
}

A to je všetko. Aby z toho vzniklo ozajstné diskusné fórum, musel by som pridať vstupný formulár, jeho spracovanie a uloženie dát do databázy. K tomu by sa hodila nejaká antispamová ochrana a administračné rozhranie pre moderátora. Pre náročnejších ešte registrácie užívateľov, prístupové práva, ... Chýba toho ešte veľa.

Uvedený príklad vôbec nerieši behové chyby ani formátovanie príspevku. Je to len ukážka jednoduché prezentácie stromového diskusného fóra.


 

Všetky články v sekcii
Ostatné tutoriály v PHP
Článok pre vás napísal Kit
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Jsem spokojeným uživatelem operačních systémů založených na linuxovém jádře. Zejména openSUSE a Ubuntu. Pro psaní veškerých textů a programů používám vynikající textový editor Vim. Aplikace se snažím psát vždy v tom nejvhodnějším programovacím jazyk...
Aktivity