Komentáře a odpovědi na ně

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Ecrazit
Člen | 16
+
0
-

Ahoj,

programuju si komponentu pro vkládání komentářů. Má se jednat o klasické, pod sebou vypsané komentáře, totožné jako například na https://phpfashion.com/

Komentáře jsou tedy očíslované a já se rozhodnu že odpovím například na komentář č. 5 (uvedu [5] před titulkem komentáře), tento komentář má v databázi id 108 a já tedy potřebuju, aby se 108 zapsalo jako parent_id u dalšího komentáře do db. Jak mám docílit toho, aby script zjistil, že právě onen komentář č. 5 je v db uložený pod id 108?

Felix
Nette Core | 1189
+
0
-

Napada me pouzit stejneho dotazu jako pri vypisu a pouzit limit + offset neco jako offset 5 limit 1. Ale urcite se najde cistci reseni.

duke
Člen | 650
+
0
-

Pokud se toto pořadí může průběžně měnit (např. když moderátor smaže nějaký komentář zatímco čteme), bude nejspíš nutné přidat do formuláře informaci o mapování pořadí na konkrétní komentáře (např. do hidden inputu). V daném případě by tedy část hodnoty tohoto inputu mohla vypadat takto:
4:107,5:108,6:125

Taktéž odkazovaný příklad (phpfashion) obsahuje hidden input ‚comment_rel‘, kterýžto bude nejspíš obsahovat nějakým způsobem zakódované toto mapování (ale to opravdu jen hádám).

MartinitCZ
Člen | 580
+
0
-

Když prozkoumáš zdrojové kody Nucleus CMS/BlogCMS (CMS phpfashion), tak bys mohl dostat odpověd. ;)

Ecrazit
Člen | 16
+
0
-

No vlastně se mi to chvíli po odeslání dotazu podařilo určitým způsobem vyřešit, ale nevím jak moc správné řešení to je.

V podstatě si v poli udržuju vazby mezi ID každého komentáře na stránce se skutečným ID v databázi.

$this->comments = $this->model->getComments($this->id, $this->type); //Vrátí seřazené komentáře patřící k zobrazenému článku

public function getRelField() {
        $ids = array();

        foreach ($this->comments AS $comment) {
            $ids[] = $comment->id;
        }
        return $ids;
    }

Při odesílání komentáře, který má na nějaký navazovat pomocí tohoto pole vyhledám související ID, které je v databázi. Zároveň si pole posílám do šablony a můžu pomocí něj vazby vizuálně zobrazovat.

@duke: Zároveň jsem tam ještě udělal to, co píšeš. Pole v šabloně konvertuju do zašifrovaného stringu a uchovávám v hidden inputu. Po odeslání odpovědi na komentář kontroluji, zda-li je vazba stále platná.

Editoval Ecrazit (11. 9. 2012 16:42)

duke
Člen | 650
+
0
-

Toto řešení je dostačující pouze za předpokladu, že pořadová čísla komentářů jsou konstantní. Tzn. není pak možné mazat komentáře (např. moderátorem).

Ecrazit
Člen | 16
+
0
-

@duke: Ještě jsem můj předchozí příspěvek editoval, asi jsi to nečetl. Začlenil jsem tam i kontrolu, zda-li se při odesílání odpovědi nějak nezměnily vazby. Například v případě že někdo smaže komentář, zatímco na něj píšu odpověď. Takhle už to stačí?

duke
Člen | 650
+
0
-

Když si tam zakóduješ tu tabulku, tak tě zas až tak moc nezajímá, jak se změnila, protože pro uložení potřebuješ pouze informace z původní tabulky. Jediné, co musíš zkontrolovat je, zda někdo mezi tím nesmazal příspěvek, na který se dotyčný odkazuje. Tzn. ze zakódované tabulky jen zjistíš ID odkazovaného příspěvku a ověříš, zda je platné.

Takže pokud jsi to myslel takto (a pokud jsem něco nepřehlédl), mělo by to stačit.