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;
      }

Klepněte pro větší obrázek

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);
        }
      }

Klepněte pro větší obrázek

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: Software, Programování, Příspěvek, Private, Samostatný příspěvek, Code, Jednotlivý díl, Cancel, ASP, Dnešní povídání


Určitě si přečtěte

Šmírování kamerami Googlu: Koukněte, co se objevilo na Street View

Šmírování kamerami Googlu: Koukněte, co se objevilo na Street View

Google stále fotí celý svět do své služby Street View. A novodobou zábavou je hledat v mapách Googlu vtipné záběry. Podívejte se na výběr nejlepších!

redakce | 4

redakce
Mapy GoogleStreet View
Chytré hodinky Honor a Huawei se zbavily největší brzdy. Naučily se instalovat aplikace
Filip Kůžel
HonorHodinkyMobilní aplikace
Archivovat data do cloudu, na HDD, SSD, DVD, nebo Blu-ray? Co je nejvýhodnější?

Archivovat data do cloudu, na HDD, SSD, DVD, nebo Blu-ray? Co je nejvýhodnější?

** Kam doma natrvalo uložit data? Vyplatí se ještě optická média? ** Jaké kapacity disků a médií má smysl koupit? ** Cenovou výhodnost si ukážeme na příkladech s 2TB úložištěm

Lukáš Václavík | 122

Lukáš Václavík
ZálohováníÚložištěPevné disky
Avast Omni: Krabička, která vám hackne síť a promění se v unikátní antivirus

Avast Omni: Krabička, která vám hackne síť a promění se v unikátní antivirus

** Počítač dnes ochrání kdejaký antivirus ** Drobná krabička Omni se postará rovnou o celou domácí síť ** Bude ji odposlouchávat, analyzovat a blokovat útoky

Jakub Čížek | 119

Jakub Čížek
AntivirusIoT
Lépe bylo bez Googlu, přiznal s odstupem bývalý šéf Waze
Markéta Mikešová
WazeGoogle
Nejlepší notebooky do 10 000 korun: Co má ještě smysl kupovat. A co ne?

Nejlepší notebooky do 10 000 korun: Co má ještě smysl kupovat. A co ne?

** Notebooky s cenou do deseti tisíc korun jsou plné kompromisů ** Existuje několik modelů dobře použitelných pro nenáročné použití ** Vhodnou alternativou jsou tablety nebo repasované počítače

David Polesný | 94

David Polesný
Jak vybrat notebookNotebooky

Aktuální číslo časopisu Computer

Megatest rychlých Wi-Fi 6 routerů

Jak ztišit počítač

Velký test mATX skříní