ASP.NET – Diskusní forum (4)

26. dubna 2002
Google API SDÍLET NA FACEBOOKU TWEETNOUT
Dnes budeme pokračovat ve vývoji komponenty diskusního fora. Dočkáme se první beta-verze, která bude splňovat základní funkcionalitu, jež se od takové komponenty očekává. Projekt byl zařazen do SourceForge.net, což znamená, že také vy můžete podpořit další vývoj.

V některém z předchozích dílů jsem dostal nabídku od jednoho z čtenářů, že by se také rád zapojil do vývoje a přiložil ruku k dílu. Protože každou takovou iniciativu vítám, založil jsem projekt na SourceForge.NET.

Co tedy uvidíme v dnešním povídání. Implementujeme rozbalování a zabalování jednotlivých zpráv a přidáme možnost vytvářet odpovědi. Nejdříve ukázka výsledku:

Otevřít v samostném okně

ForumControlItem

Jak jsem tedy při vytvoření této komponenty postupoval? V minulém dílu jsem popsal vytvoření samostatné třídy pro zobrazení jedné zprávy –ForumControlItem. Tu jsem nyní rozšířil o definice následujících událostí a vlastností:

Události :

Edit – je vyvolána poté, co uživatel zmáčkne tlačítko pro upravení již existujícího příspěvku.

Save – je vyvolána po potvrzení údajů ve formuláři tlačítkem Uložit.

Cancel – pokud uživatel zvolí při editaci tlačítko Zrušit, je vyvolána tato událost.

Delete – uživatel zvolil tlačítko smazání příspěvku.

Reply – bylo stlačeno tlačítko Odpovědět.

Určitě se zeptáte, na co je běžnému uživateli dobré mazání a editování správ. Tato možnost je tam kvůli tomu, aby se komponenta dala jednoduše použít zároveň jako administrační modul pro dané diskusní forum. Osoby s administrátorskými právy můžou upravovat dané forum a jeho příspěvky. Takovouto implementací zabijeme dvě mouchy jednou ranou. Jak ale rozlišit, zda má komponenta aktuálnímu uživateli nabídnout jenom možnost odpovídat, přidávat nové příspěvky, nebo i mazat a upravovat stávající? Kvůli tomu jsem přidal do třídy ForumControlItem následující vlastnosti:

Vlastnosti:

EditAllowed - pokud je nastavena na true, na příspěvku se zobrazí tlačítko Upravit.

DeleteAllowed – umožňuje zmazání daného příspěvku (tlačítko Smazat).

ReplyAllowed – umožňuje přidávání nových příspěvků (tlačítko Odpovědět).

Mode – tato vlastnost může nabývat hodnoty View a nebo Edit a určuje aktuální stav příspěvku z pohledu daného uživatele.

V závislosti na vlastnosti mode komponenta generuje buď formulář pro editaci jednotlivých políček (Mode = Edit), nebo klasické zobrazení příspěvku. Nyní malá ukázka kódu pro použití třídy ForumControlItem :

      private void Page_Load(object sender, System.EventArgs e)
      {
        ForumMessage m = new ForumMessage();
        m.Author="Tomáš Tichý";
        m.AuthorEmail="ttichy@seznam.cz";
        m.Subject="První pokus";
        m.Body="Text prvního příspěvku";
        m.PostDate=DateTime.Now;

              ForumControlItem1.Message=m;
        ForumControlItem1.Expanded=true;
        ForumControlItem1.EditAllowed=true;
        ForumControlItem1.DeleteAllowed=true;
        ForumControlItem1.ReplyAllowed=true;
      }

V tomto případě jsou data zadávána manuálně. Chceme-li využít úložiště dat, není nic jednoduššího – stačí naplnit data z datového zdroje pomocí příslušného datového adaptéru. Například pro použití ve spolupráci s databází Access můžeme použít OleDbForumDataAdapter – třídu, kterou jsme vytvořili v jednom z předchozích dílů seriálu:

private void Page_Load(object sender, System.EventArgs e)
      {
        OleDbForumDataAdapter data = new OleDbForumDataAdapter(1);

        data.Load();

        foreach(ForumMessage m in data.CurrentForum.Messages)
        {
            ForumControlItem i = new ForumControlItem();
            i.Message=m;
            i.Expanded=true;
            this.FindControl("WebForm2").Controls.Add(i);
        }
      }

To by byl úvod do třídy ForumControlItem, která umožňuje zobrazit jeden samostatný příspěvek. Pokud bychom chtěli zobrazit celý strom příspěvků, použijeme komponentu ForumControl.

ForumControl

ForumControl při vytváření HTML kódu vychází z třídy Forum. Jenom pro osvěžení paměti krátce charakterizuji tuto třídu. Třída obsahuje vlastnost Messages, která je kolekcí všech příspěvků na nejvyšší úrovni (kořenové příspěvky). Takže například

Forum.Messages[1]

Nám vrátí druhý příspěvek – objekt typu ForumMessage. Druhý proto, že v .NET jsou pole číslována od nuly. Každý příspěvek pak obsahuje mimo jiné kolekci Replies, ve které jsou odpovědi – opět objekty typu ForumMessage. Výsledkem je stromová struktura, ve které můžeme velice jednoduše procházet mezi jednotlivými správami. Kupříkladu

Forum.Messages[1].Replies[5].Replies[0].Subject

vrátí subjekt příspěvku na 3 úrovni, odpovídající na 6 odpověď druhého příspěvku.

Této stromové struktury využívá ForumControl, který pro každou správu zavolá rekurzivně metodu RecurseControlHierarchy. Ta je poměrně složitá, proto zde její výpis nebudu uvádět. Co ale provádí, je, že vytvoří objekt ForumControlItem jako samotný příspěvek. Přiřadí k němu také „obalující HTML“ kód, který způsobí formátování do přehledného stromečku. Přidává také obrázky + / - , pomocí nichž můžeme rozbalovat danou větev příspěvků. Zdrojový kód celé aplikace si můžete stáhnout zde a prostudovat jej. Komponenta je zatím ve vývoji, a proto není úplně správná, co se samotného kódu a architektury týče. Dá vám ale základní přehled o funkcích a realizaci stromové struktury.

Jak tedy můžeme samotnou komponentu použít na naší stránce? Stačí ji velice jednoduše napojit na datový adaptér, příklad opět využívá databáze Access a příslušného adaptéru OleDbForumDataAdapter:

public class WebForm1 : System.Web.UI.Page
{
protected NetAr.WebControls.ForumControl ForumControl1;
       
private void Page_Load(object sender, System.EventArgs e)
{   
ForumControl1.DataAdapter=new OleDbForumDataAdapter(1);
}

}

Výsledkem bude příklad uvedený na začátku dnešního dílu.

Závěr:

Zdrojový kód ke dnešnímu dílu si můžete stáhnout ze SourceForge, nebo přímo z našeho serveru. V příštím dílu se podíváme na cachování komponenty a na označování přečtených/nepřečtených zpráv.

Váš názor Další článek: Google API

Témata článku: , , , , , , , , , , ,