uXo-weBlog

JA blogujem, TY bloguješ, MY blogujeme... ... na aspnet.sk
Začíname programovať WebParty pre SharePoint

Po dlhšom čase som si konečne našiel čas aj na blog. Každý kto už aspoň trochu pričuchol k programovaniu pre SharePoint mi dá zapravdu, že s vývojárskou dokumentáciou to v tomto smere nie je práve ružové.

WebParty pre SharePoint sú podobné s tými v ASP.NET, tvoríme všsk iba samotné WebParty, Zóny nam predkladá priamo SharePoint.Pred tým, než začneme je dôležité mať nainštalovaný SharePoint (bohužiaľ funguje iba na Win Server), Visual Studio 2005/2008 a Visual Studio extensions for Windows SharePoint Services (link).

Vo Visual Studio nám medzi projektmi pribudla položka "SharePoint", z ktorej vyberieme projekt typu "Web Part". V sekcií "usingov" resp. vo VB.NET "importov" si môžme všimnúť naimportované nové Namespaces SharePoint, ktoré nám umožňujú pripojenie k Listom Sharepointu a jeho ďalším súčastiam. Nadeklarujeme si objekty, s ktorými budeme pracovať (textbox tb_meno, label lbl_pozdrav, button btn_pozdravit) následovne:

namespace WP_Hello_World
{
    [Guid("7b42fda9-d28e-4a40-9651-ca8b0cd677b4")]
    public class WebPart1 : System.Web.UI.WebControls.WebParts.WebPart
    {
        TextBox tb_meno;
        Label lbl_pozdrav;
        Button btn_pozdravit;

V následujúcom kroku musíme prepísat metódu CreateChildControls(), v ktorej vytvoríme instancie komponent a priradíme im properties a handlery. Každý ovládací prvok musíme pridať aj do kolekcie prvkov:

protected override void CreateChildControls()
        {
            base.CreateChildControls();

            tb_meno = new TextBox();
            tb_meno.Width = 150;
            Controls.Add(tb_meno);
            lbl_pozdrav = new Label();
            Controls.Add(lbl_pozdrav);
            btn_pozdravit = new Button();
            btn_pozdravit.Text = "Pozdrav !";
            btn_pozdravit.Click += new EventHandler(btn_pozdravit_Click);
            Controls.Add(btn_pozdravit);
        }

Tlačítku sme pridali handler na spracovanie kliknutia, ktorý môže vyzerať napríklad takto:

void btn_pozdravit_Click(object sender, EventArgs e)
        {
            lbl_pozdrav.Text = "Ahoj " + tb_meno.Text + " !";
        }

Už nám chýbajú posledné riadky kódu. Predpokladáte správne, musíme naše ovládacie prvky vykresliť. Prepíšeme teda metódu Render(), v ktorej za pomoci HtmlTextWriteru vygenerujeme ovládacie prvky na správnych miestach:

protected override void Render(HtmlTextWriter writer)
        {
            writer.Write("Meno: ");
            tb_meno.RenderControl(writer);
            writer.Write("<br />");
            btn_pozdravit.RenderControl(writer);
            writer.Write("<br />");
            lbl_pozdrav.RenderControl(writer);
        }

Prvý WebPart máme napísaný a pripravený. Teraz ho musíme umiestniť na Sharepoint. Tento proces sa nazýva Deploy a pri prvom deploy stačí vo Visual Studio vybrať Deploy z ponuky Build. Spustíme SharePoint a prepneme Site do módu editácie.

WP1

Vyberieme si kontajner vloženia WebPartu a dáme pridať nový. Z ponuky vyberieme náš nový WebPart. Keďže sme ho v Solution nepremenovali, nájdeme ho pod názvom WebPart1. Opustíme mód editovania a môžme používať náš nový WebPart.

WP2

Zájdime trochu ďalej a vylepšime si náš WebPart o DropDownList so všetkými používateľmi na SharePointe. Predsa len vytvárať WebParty, ktoré nevyúživajú SharePoint, jeho listy a najmä údaje v ňom uložené je asi zbytočné. Nahraďme teda textbox tb_meno za ddl_pouzivatelia. V metóde CreateChildControls() sa pripojíme k SharePointu a naplníme DropDownList loginom ako zobrazovacím textom a ID používateľa použijeme ako unikátne value. Všetky triedy z Namespace SharePoint začínaju na SP, čím ich ľahko identifikujeme a rozlíšime v kóde. Pomocou triedy SPSite sa pripojime k SharePointu ako takému a k “sajte”, s ktorou chceme ďalej pracovať. SPWeb slúži na otvorenie už samotného webu, ktorý obsahuje požadované Listy a údaje. Pokiaľ je site a web totožný, pri vytváraní instancie triedy SPWeb nepoužívame žiadne parametre. Následne prejdeme kolekciu SiteUsers, ktorá obsahuje všetkých používateľov na konkrétnej “sajte”.

ddl_pouzivatelia = new DropDownList();
SPSite site = new SPSite("http://win-9bvdun022kr/");
SPWeb web = site.OpenWeb();
foreach (SPUser u in web.SiteUsers)
{
    ListItem pouzivatel = new ListItem();
    pouzivatel.Text = u.LoginName;
    pouzivatel.Value = u.ID.ToString();
    ddl_pouzivatelia.Items.Add(pouzivatel);
}
web.Close();
site.Close();
Controls.Add(ddl_pouzivatelia);

Na záver ukončíme spojenie so SharePointom. Upravíme aj udalosť kliknutia následovne:

void btn_pozdravit_Click(object sender, EventArgs e)
        {
            SPSite site = new SPSite("http://win-9bvdun022kr/");
            SPWeb web = site.OpenWeb();
            SPUser u = web.SiteUsers.GetByID(Convert.ToInt32(ddl_pouzivatelia.SelectedValue));

            lbl_pozdrav.Text = "Ahoj " + u.Name + " !";

            web.Close();
            site.Close();
        }

 

Opäť sa pripojíme na SharePoint a tentokrát do instancie triedy SPUser nájdeme konkrétneho používateľa na základe jeho unikátneho ID vybraného z DropDownListu. Do pozdravu vypíšeme tentokrát meno používateľa. V poslednom kroku nezabudnite vyrenderovať novýovládací prvok v metóde Render().

Pokiaľ sa pokúsite urobiť publish webpartu, Visual Studio vygeneruje nezmyselnú chybu. Rieši sa to tak, že sa dá Rebuild Solution a následne sa nová DLL knižnica skopíruje do priečinka Windows/Assembly, čím sa nahradí pôvodný webpart. Teraz je potrebné zavolať z príkazového riadku iisreset, aby sa SharePoint naštartoval nanovo už s novou verziou WebPartu. Žiaľ publish funguje iba prvýkrát.

Prajem Vám veľa funkčného kódu ;)

Pridelovanie a odstranovanie prav na urovni SPListItem

Tak dnes som riesil zaujimavy problem, ako nastavit prava konkretnym polozkam SPListu bez ohladu na dedenie prav samotneho SPListu.

Ako teda na to... Najprv sa pripojime na pozadovany site a list:

SPSite site = new SPSite(http://moss/);

SPWeb web = site.OpenWeb();

SPList list = web.Lists["nazov_listu"];

vytiahneme pozadovany prvok z listu:

SPListItem i = list.Items[GUID];

vyberieme uzivatela, ktoremu chceme pridelit prava:

SPUser u = web.SiteUsers.GetByID(ID);

nadefinujeme typ prav a pridelime ich uzivatelovi:

SPRoleDefinition rd = web.RoleDefinitions.GetByType(SPRoleType.Contributor);

SPRoleAssignment ra = new SPRoleAssignment(u.LoginName, u.Email, u.Name, u.Notes);

ra.RoleDefinitionBindings.Add(rd);

Typ Contributor ma prava na citanie,zapisovanie a editaciu, pozor nie su to admin prava! Tento user napr. nebude moct pridelovat dalsie prava k polozke. V dalsom kroku zastavime dedenie prav z listu a povolime tzv. nie bezpecne upravy, to vsak neznamena,ze su nebezpecne ;)

i.BreakRoleInheritance(true);

web.AllowUnsafeUpdates = true;

site.AllowUnsafeUpdates = true;

Dalsi krok nie je nevyhnutny. Pokial ale chceme zmazat vsetky predchadzajuce prava, ci uz rucne, programovo pridane alebo zdedene, napiseme tuto cast kodu:

SPRoleAssignmentCollection rac = i.RoleAssignments;
for (int x = (i.RoleAssignments.Count - 1); x >= 0; x--)

{

i.RoleAssignments.Remove(i.RoleAssignments[x].Member);

}

Poslednou castou je pridelenie uzivatela s pravami k danej polozke, update polozky na server a opatovny zakaz "nie bezpecnych uprav":

i.RoleAssignments.Add(ra);

i.Update();

web.AllowUnsafeUpdates =
false;

site.AllowUnsafeUpdates = false;

 

Vela stastia v badani uskali v MOSSe ;)

Veľké listy v Microsoft Office SharePoint Server 2007 (MOSS)

 

Konecne sa urcite zalezitosti utriasli a nasiel sa nejaky ten cas aj na blogovanie. V najblizsej dobe sa budem asi viac venovat SharePointu a aj preto, ze je to cierna diera MS, skratka dokumentacie pre developerov je viac ako malo.

 

Podla MS by root list nemal mat viac ako 2000 poloziek. Viac poloziek je mozne zadat vnorenim priecinkov/listov, teda napr. root by mal 1990 poloziek a zvysnych 10 by boli dalsie listy opat po 2000 poloziek. Maximalny pocet poloziek aj s vnorenymi je stanovevny na 5 000 000. Mozu sa vytvarat aj vacsie listy avsak treba mat na ne vlastny interface na manazovanie dat, teda nepouzivat defaultne MOSS zobrazovania listov,ale napisat si vlastne ci uz aspx alebo webparty.

 

MS urobil niekolko testov s pracou s velkymi listmi a ja som niektore tiez odskusal.

 

Rozhodne nepouzivajte na citanie listov tieto metody:

  • - Nacitavanie do default List viewerov MOSS
  • - SPList + foreach
  • - SPList + DataTable

Tieto 3 sposoby su niekolko desiatok nasobne pomalsie ako vsetky ostatne.

Pozrime sa teda na ostatne moznosti:

  • - SPList + SPQuery
  • - SPListItem + DataTable
  • - Lists Web Service
  • - Search
  • - PortalSiteMapProvider

 

Pomerne dolezite je aj indexovat alebo neindexovat stlpce, podla ktorych sa urcuju kriteria vo "WHERE".

 

Hodnotenie:

  • - SEARCH

Tato metoda bola jedna z najrychlejsich, ma vsak jeden problem. Nedokaze vratit data, kym neboli vsetky zindexovane. Zvlastne, ale tato metoda je rychlejsia, ak v klauzule WHERE je defaultne ID a nie indexovany stlpec.

  • - SPList, SPListItem

Osobne sa mi tieto moznosti zdaju najlepsie aj ked opat maju jednu chybicku. Pri prezerani vstekych dat,teda aj vnorenych listov je do atributu ViewAttributes SPQuery potrebne zakomponovat Scope="Recursive" a mozu byt pouzite iba na pc, na ktorom moss bezi s vynimkou WebService, ktore tu tiez spadaju, ale su o nieco pomalsie, no pouzitelne. Tieto metody su rychlejsie, ak sa do klauzuly WHERE vlozi indexovany stlpec.

  • - PortalSiteMapProvider

Bezkonkurencne najrychlejsia metoda pristupu k datam. Das a pouzit iba cez browser v desktop aplikaciach nie, pretoze pracuje na principe cashovania dat. Prve nacitanie je vzdy o nieco dlhsie,ale ostatne su v niekolkych milisekundach. PSMP si vie odkontrolovat,ci sa data v liste zmenili a musi ich nanovo cashovat,alebo nie. Defaultne nastaveny site collection object na cash je 100MB. Opat tak ako pri Search je lepsie pouzit vo WHERE defaultne ID ako indexovany stlpec. Osobny nazor: Je to sice velmi rychla metoda,ale dost nepouzitelna ak sa data casto menia a nie k dispozicii stroj s velkou RAM na ulozenie cashov.

 

Na zaver este jeden link, kde je problematika specifikacie serveru na rychlost mossu: http://technet.microsoft.com/en-us/library/cc262787.aspx

Pár viet na úvod...

Pozdravujem všetkých,

samozrejme na úvod musím zablahoželať Spigimu k úspešnému dotiahnutiu nového portálu a taktiež mu poďakovať za pridelenie weblogu. Pasujem sa s rovnakým problémom ako ostatní kolegovia, teda nedostatok času, preto dúfam, že si nájdem čas, čo najčastejšie prispieť niečím zaujímavým z IT, respektíve niečím na odreagovanie. Stick out tongue

Nemožem sa pochváliť ako moji "kolegovia" Embarrassed nejakými vysokými znalosťami v tomto obore, momentálne som ešte stále študentom nemecko-slovenského bilingválneho gymnázia v Poprade s výhliadkou na štúdium v Nemecku. (Uvidíme, čo na to matura Zip it! ) Problematike .NET Frameworku a hlavne ASP.NET sa venujem asi tak 2-3 roky, počas ktorých sa mi podarilo nazbierať nejaké tie skúsenosti, ktoré sa vám budem snažiť sprostredkovať ďalej.

Teším sa na vaše ohlasy, pripomienky a názory Wink

Posted: Jun 07 2007, 10:22 PM uXo | s 4 comment(s)
Zaradené do:
Viac príspevkov