Autor Zpráva
Neas
Profil
ahoj,
udělal jsem si v php třídu na zobrazování komentářů, ale chtěl bych, aby bylo možné odpovídat na komentáře tím stylem, aby to vytvořilo efekt, jaký můžete vidět například tady na této stránce (či na spoustě dalších, jednoucích na drupalu): http://147.32.8.168/?q=node/37266
mám na mysli ten efekt, že nové komentáře se zobrazují nahoře, ale odpovědi na komentáře se zobrazují pod nimi s malým odsazením od levého kraje. Této maličkosti se mi při zobrazování nedaří docílit. Přikládám zdrojový kód, čeho se mi zatím podařilo docílit:
class Komentare // funguje zatím pouze tak, že zobrazuje komentáře za sebou, nic víc, nic míň
{
  private $komentare = array();
  public function __construct($comments)
  {
    $text = "";
    $datum = new Datum();  // moje třída pro formátování datumů, to neřešte
    foreach($comments as $comment)
    {
      $text .= "<div class='comment_head'>".$comment['autor']."<br><small>".$datum->dlouhy_format($comment['cas'])."</small></div>\n";
      $text .= "<div class='comment_body'>".$comment['text']."</div>\n";
    }
    $this->komentare[$comment['id']] = $text;
  }
  public function vypis()
  {
    foreach($this->komentare as $comment)
      echo $comment;
  }
}


přičemž $comments je pole generované z mysql a které po svém vygenerování vypadá například takto:
$comments = array( array('id' => 1, 'parent_id' => null, 'autor' => "adkjgds", 'cas' => 1296845832, 'text' => "Číslo jedna"),
                   array('id' => 2, 'parent_id' => 1,    'autor' => "sdag",    'cas' => 1296845832, 'text' => "Odpověď na číslo jedna"),
                   array('id' => 3, 'parent_id' => 1,    'autor' => "Pepa",    'cas' => 1296845832, 'text' => "Druhá odpověď na číslo jedna (xx)"),
                   array('id' => 4, 'parent_id' => 2,    'autor' => "Pepa",    'cas' => 1296845832, 'text' => "Odpověď na první odpověď na číslo jedna"),
                   array('id' => 5, 'parent_id' => null, 'autor' => "Pepa",    'cas' => 1296845832, 'text' => "Samostatný"),
                   array('id' => 6, 'parent_id' => 3,    'autor' => "Pepa",    'cas' => 1296845832, 'text' => "odpově%d na číslo 3, což je druhá odpověď na číslo 1 (xx)"),
                   array('id' => 7, 'parent_id' => null, 'autor' => "Pepa",    'cas' => 1296845832, 'text' => "Poslední samostatný") );

již v tomto poli zaznamenávám 'parent_id', což, jak jste si jistě domysleli, je id příspěvku, na který tento odpovídá (komentář s id 3 odpovídá na komentář s id 1 atp.)
avšak dále již nevím, jak toto zaznamenané parent_id využít k docílení svého cíle.
Děkuji za rady
Alphard
Profil
Systém id - parentId se řeší rekurzí (nebo přepsanou do cyklu, prašť jako uhoď…).
Na začátku si vyberte všechny prvky s parent_id = null (dal bych tam 0, ať zachováte datový typ) a seřaďte je sestupně. Pak původní pole seřaďte vzestupně.
Na konec stačí procházet pole hlavních rodičů a dohledávat k nim děti. V tomto kroku inkrementací proměnné zajistíte odsazení.

Já bych si databázi navrhl jinak, abych se tomuto vyhnul. Když budete pracovat s upraveným polem array(1 => 0, 2 => 1, 3 => 1, 4 => 2, 5 => 0, …), bude to jednodušší a snad i rychlejší, jen musíte nějak spárovat původní data.
Neas
Profil
pořádně nechápu to tvé řešení. v čem je rychlejší?
Neas
Profil
tak jsem se v tom trošku ztratil. Je mi to trošku trapné, ale ani s tvým návodem jsem se moc nepohnul z místa.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: