Arhive de categorii: Dezvoltarea SharePoint

Feriţi-vă de rupere modificările la ItemStyle.xsl

Am fost de lucru cu ItemStyle.xsl pentru a particulariza aspectul de un conţinut partea Web de interogare şi chiar despre masa de prânz timp, Am făcut o rupere modifi xsl. Nu am dat seama, dar acest lucru a avut de departe ajungând la efecte în întreaga colecție de site-ul. Am plecat la masa de prânz şi la întoarcerea mea, observat acest mesaj care apare într-o grămadă de locuri:

Imposibil de afişat această parte Web. Pentru a depana problema, Deschideți această pagină Web într-un editor HTML compatibil cu Windows SharePoint Services, cum ar fi Microsoft Office SharePoint Designer. Dacă problema persistă, Contactați administratorul de server Web.

Am dat vina pe client (încă, realizând că a fost vina mea în acest moment) dar în cele din urmă a observat că intellisense visual student a fost avertizare-mi că am avut malformat XSL. Am corectat-o şi totul a început să lucreze.

Fi darned atent atunci când se lucrează cu ItemStyle.xsl (şi orice fișier XSL globale) — rupere-le afectează multe artefacte din colecția de site-ul.

<final />

Afişare conţinut interogare Web parte rezultatele într-o grilă / Tabel

Privire de ansamblu şi obiectivul

Afară de la cutie, MOSS’ Conţinut parte de interogare Web (CQWP) afişează rezultatele sale într-un format listă, similar cu rezultatele căutării. De asemenea, este posibil să afişaţi rezultatele în format grilă (adică. Format de tabel HTML). Grila formate sunt mai bine în anumite circumstanţe. Descrie modul de a realiza acest efect în acest articol.

Scenariu de afaceri

Am lucrat cu un client pe un rollout de muşchi de nivel de întreprindere. Ne-am proiectat taxonomie lor, astfel încât proiectele sunt cetăţeni de clasa întâi în ierarhia şi au propriile lor site-ul de nivel superior. Managerilor de proiect să menţină o listă de singleton de proiect informaţii rezumative, ca titlu, buget, data preconizată de finalizare, restul bugetul şi alte domenii de tip de rezumare. De "singleton" Adica o personalizate lista SharePoint garantat să conțină doar un singur articol. Simplist, se pare ca asta:

imagine

Abordare tehnică este la fel de mult după cum este descris aici (http://paulgalvin.spaces.live.com/blog/cns!1CC1EDB3DAA9B8AA!447.entry). CQWP foloseşte o transformare XSL să emită HTML pentru browser-ul sa redea.

Am envision întotdeauna rezultatul înainte de scufundare în XSL pentru XSL este un coşmar. Aici este meu rezultatul dorit:

imagine

HTML ca aceasta generează acest rezultat:

<HTML>
 <corpul>
 <Centrul>
 <tabel frontieră= 1>

<!-- Etichete-->
 <TR bgcolor= albastru>
 <TD><font culoare= alb><b>Numele proiectului</b></font></TD>
 <TD Aliniaţi= dreapta><font culoare= alb><b>Data completă</b></font></TD>
 <TD Aliniaţi= dreapta><font culoare= alb><b>Buget</b></font></TD>
 <TD Aliniaţi= dreapta><font culoare= alb><b>Cheltuieli actuale</b></font></TD>
 <TD><font culoare= alb><b>Starea generală</b></font></TD>
 </TR>

<TR>
 <TD>Re-sârmă sala de calculatoare.</TD>
 <TD Aliniaţi= dreapta>02/01/08</TD>
 <TD Aliniaţi= dreapta>22,500.00</TD>
 <TD Aliniaţi= dreapta>19,000.00</TD>
 <TD>În curs de desfăşurare</TD>
 </TR>

<TR>
 <TD>Furnizarea de servere pentru SQL Upgrade</TD>
 <TD Aliniaţi= dreapta>04/01/08</TD>
 <TD Aliniaţi= dreapta>7,500.00</TD>
 <TD Aliniaţi= dreapta>0.00</TD>
 <TD>Planificate</TD>
 </TR>

</tabel>
 </Centrul>
 </corpul>
</HTML>

Abordare

Urmaţi aceşti paşi pentru a crea grila:

  1. Identifica componentele de reţea (rânduri/coloane).
  2. Defini şi de a crea coloane de site-ul necesar.
  3. Creaţi site-uri sub pentru proiecte şi liste de singleton.
  4. Adauga CQWP la o pagină web şi configuraţi-l pentru a căuta listele tale.
  5. Modifica CQWP XML să adune coloane suplimentare.
  6. Modifica XSL pentru a genera un tabel.

Am de gând să se concentreze asupra numărului şase. Numere unul prin patru sunt drept-înainte, şi ceva care orice utilizator CQWP deja a făcut. Numărul cinci a fost bine documentate de alţii, inclusiv acest articol exhaustivă de ecran-shot încărcat la MSDN aici (http://msdn2.microsoft.com/en-us/library/bb897399.aspx) şi Heather Solomon blog aici (http://www.heathersolomon.com/blog/articles/CustomItemStyle.aspx).

Nuci şi bolţuri

Începe şi implementa paşi unul prin cinci după documentaţia MSDN şi Heather Solomon articolul.

La acest punct, aţi adăugat ta CQWP la pagina şi aveţi dumneavoastră <CommonViewFields> configurate după cum este necesar.

Urmând paşii de obicei, I a lua aceste rezultate intermediare:

1. Crea un tip de conținut, un șablon particularizat lista pentru acel tip de conținut și două site-uri. Aici este tipul de conținut:

imagine

Aici este structura site-ului:

imagine

2. Adauga CQWP după crearea meu proiect subsite-uri și singleton liste rezumatul proiectului:

imagine

3. Adauga toate informaţiile suplimentare vreau prin <CommonViewFields>:

        <proprietate nume="CommonViewFields" tip="şir">Project_x0020_Name;Project_x0020_Expenses;Project_x0020_Status;Project_x0020_Start_x0020_Date;Project_x0020_End_x0020_Date;Project_x0020_Budget</proprietate>

Reţineţi că am avut de a păstra toate câmpurile de proprietate pe o linie sau o nu ar funcţiona (CQWP mi-ar spune că interogarea returnat niciun element).

4. La acest punct, Suntem gata pentru a trece dincolo de articolul MSDN şi flip pe peste articolul lui Heather Solomon. Urmaţi paşii ei incepand de lângă pas #5 pentru a crea o personalizate / unghosted versiune de ItemStyle.xsl. Am urmat sfatul lui Heather, până prin pas 11 şi a obţine aceste rezultate intermediare:

4.1: Nume şablon mea XSL, după cum urmează:

<XSL:Nume şablon = "grilă" meci = "Row[@Style = "Grila"]" modul = "itemstyle">

De asemenea, uşor modifica ei sugerat <XSL:pentru fiecare …> prin adăugarea de o <br /> Tag-ul pentru a oferi o listă mai curat:

    <XSL:pentru fiecare Selectaţi="@*">
      P:<XSL:valoarea de Selectaţi="nume()" /><br/>
    </XSL:pentru fiecare>

4.2: Modifică partea web, Du-te la aspect şi selectaţi meu "grilă" stil:

imagine

Aplicaţi schimbare şi aici este rezultatul:

imagine

Putem vedea din cele de mai sus că domeniile vrem (Numele proiectului, cheltuieli, statutul, etc) sunt disponibile pentru noi de a folosi atunci când am emite HTML. Nu numai că, dar vom vedea numele prin care noi trebuie să referinţă aceste coloane în XSL. De exemplu, am de referinţă proiectul statutului ca "Project_x005F_x0020_Name".

La acest punct, plecam de la Heather pe blog si de la umeri de giganţi aceste, Adăuga propria mea pic.

ContentQueryMain.xsl

NOTĂ: Când a face modificări la atât ContentQueryMain.xsl, cât şi ItemStyle.xsl, trebuie să verificaţi aceste fişiere înapoi în înainte de a vedea efectul de modificări.

Scopuri grila de luare a, MOSS utilizează două fişiere diferite XSL pentru a produce rezultate vom vedea de la o CQWP. Pentru a genera anterioare de biţi de ieşire, am modificat ItemStyle.xsl. MUŞCHI de fapt foloseste un alt fișier XSL, ContentQueryMain.xsl sa în colaborare cu ItemStyle.xsl pentru a genera sale HTML. După cum sugerează şi numele, ContentQueryMain.xsl este principala"" XSL care controleaza fluxul de ansamblu de traducere. Acesta reiterează prin toate elementele găsit şi trece-le unul câte unul la template-uri în ItemStyle.xsl. Ne vom modifica ItemStyle.xsl pentru a genera deschis <tabel> Tag-ul înainte de a emite primul rând de date şi închidere <tabel> Tag-ul după emit ultimul rând. Pentru a realiza acest lucru, ContentQueryMain.xsl este modificat pentru a trece doi parametri noastre "grilă" şablon în ItemStyle.xsl, "ultimul rând" şi "rândul curent". ItemStyle.xsl foloseşte să emită condiţional Tag-uri necesare.

Folosind tehnica de Heather Solomon, ne găsiţi ContentQueryMain.xsl. Acesta este situat în acelaşi loc ca ItemStyle.xsl. Acest ecran shot ar trebui să ajute:

imagine

Trebuie să efectuaţi următoarele modificări:

  • Modificarea unui șablon xsl, "CallItemTemplate" fapt care invocă noastre şablon de grilă în ItemStyle.xsl. Vom trece doi parametri în şablonul grila astfel încât acesta va avea datele are nevoie pentru a genera condiţional deschidere şi închidere <tabel> Tag-uri.
  • Modifica un pic de ContentQueryMain.xsl care necesită "CallItemTemplate" pentru a trece un LastRow"" parametru aşa că LastRow poate fi trecut pe la noastre şablon de grilă.

Găsiţi şablonul denumit "OuterTemplate.CallItemTemplate" identificate de şir:

  <XSL:şablon nume="OuterTemplate.CallItemTemplate">

Înlocui șablonul întreg după cum urmează:

  <XSL:şablon nume="OuterTemplate.CallItemTemplate">
    <XSL:Param nume="CurPosition" />

    <!--
      Adauga "LastRow" parametru.
      Noi folosim doar atunci când elementul stil trece în "Grilă".
    -->
    <XSL:Param nume="LastRow" />

    <XSL:alege>
      <XSL:când test="@Style = 'NewsRollUpItem'">
        <XSL:aplica-template-uri Selectaţi="." modul de="itemstyle">
          <XSL:cu-param nume="EditMode" Selectaţi="$cbq_iseditmode" />
        </XSL:aplica-template-uri>
      </XSL:când>
      <XSL:când test="@Style = 'NewsBigItem'">
        <XSL:aplica-template-uri Selectaţi="." modul de="itemstyle">
          <XSL:cu-param nume="CurPos" Selectaţi="$CurPosition" />
        </XSL:aplica-template-uri>
      </XSL:când>
      <XSL:când test="@Style = 'NewsCategoryItem'">
        <XSL:aplica-template-uri Selectaţi="." modul de="itemstyle">
          <XSL:cu-param nume="CurPos" Selectaţi="$CurPosition" />
        </XSL:aplica-template-uri>
      </XSL:când>

      <!--
              Trece poziţia curentă şi lastrow la grila itemstyle.xsl şablon.
              ItemStyle.xsl care va folosi pentru a emite open şi închidere <tabel> Tag-uri.
      -->
      <XSL:când test="@Style = "Grila"">
        <XSL:aplica-template-uri Selectaţi="." modul de="itemstyle">
          <XSL:cu-param nume="CurPos" Selectaţi="$CurPosition" />
          <XSL:cu-param nume="Ultima" Selectaţi="$LastRow" />
        </XSL:aplica-template-uri>
      </XSL:când>

      <XSL:în caz contrar>
        <XSL:aplica-template-uri Selectaţi="." modul de="itemstyle">
        </XSL:aplica-template-uri>
      </XSL:în caz contrar>
    </XSL:alege>
  </XSL:şablon>

Comentarii descrie scopul modificările.

desigur, "OuterTemplate.CallItemTemplate" în sine este numit de la un alt şablon. Găsiţi că şablon de cercetare pentru acest șir text:

<XSL:şablon nume="OuterTemplate.Body">

Parcurgeţi instrucţiunile din OuterTemplate.Body şi inseraţi parametrul LastRow după cum urmează (indicat ca un comentariu în caractere italice):

<XSL:apel-şablon nume="OuterTemplate.CallItemTemplate">
  <XSL:cu-param nume="CurPosition" Selectaţi="$CurPosition" />
  <!-- Inseraţi parametrul LastRow. -->
  <XSL:cu-param nume="LastRow" Selectaţi="$LastRow"/>
</XSL:apel-şablon>

După toate acestea, în cele din urmă am lucruri stabilite în mod corespunzător astfel încât ItemStyle.xsl nostru poate emite <tabel> Tag-uri la locul potrivit.

ItemStyle.Xsl

NOTĂ: Din nou, verifica în ItemStyle.xsl după a face orice modificări, astfel încât veţi vedea efectul modificărilor.

Avem două sarcini aici:

  • Înlocuiţi întreaga grilă şablon. Să puteţi copy/paste de mai jos.
  • Adauga unele jumbo mumbo în afara definiţia şablonului care permite "formatcurrency" şablon de a lucra. (Vă pot spune că am un mâner fragilă pe XSL).

Prima, lângă partea de sus a ItemStyle.xsl, adăugaţi această linie:

  <!-- Unele mumbo jumbo care ne permite să afişaţi SUA. moneda. -->
  <XSL:zecimal-format nume="Personalul" cifre="D" />

  <XSL:şablon nume="În mod implicit" meci="*" modul de="itemstyle">

Reţineţi că am adăugat-o direct înainte <XSL:Nume şablon = "implicit" …> definiţie.

Următoarea, Du-te înapoi la noastre şablon de grilă. Înlocuiţi întreaga grilă şablon cu codul de mai jos. Acesta este foarte bine comentat, dar nu ezitaţi să mi e-mail sau lăsaţi comentarii pe blog-ul meu, dacă aveţi întrebări.

  <XSL:şablon nume="Grilă" meci="Rând[@Style = "Grila"]" modul de="itemstyle">

    <!--
      ContentMain.xsl trece CurPos şi ultimul.
      Vom folosi aceste să emită condiţional open şi închidere <tabel> Tag-uri.
    -->
    <XSL:Param nume="CurPos" />
    <XSL:Param nume="Ultima" />

    <!-- Următoarele variabile sunt nemodificat la ItemStyle.xsl standard -->
    <XSL:variabila nume="SafeImageUrl">
      <XSL:apel-şablon nume="OuterTemplate.GetSafeStaticUrl">
        <XSL:cu-param nume="UrlColumnName" Selectaţi="'ImageUrl'"/>
      </XSL:apel-şablon>
    </XSL:variabila>
    <XSL:variabila nume="SafeLinkUrl">
      <XSL:apel-şablon nume="OuterTemplate.GetSafeLink">
        <XSL:cu-param nume="UrlColumnName" Selectaţi="'LinkUrl'"/>
      </XSL:apel-şablon>
    </XSL:variabila>
    <XSL:variabila nume="DisplayTitle">
      <XSL:apel-şablon nume="OuterTemplate.GetTitle">
        <XSL:cu-param nume="Titlul" Selectaţi="@Title"/>
        <XSL:cu-param nume="UrlColumnName" Selectaţi="'LinkUrl'"/>
      </XSL:apel-şablon>
    </XSL:variabila>
    <XSL:variabila nume="LinkTarget">
      <XSL:Dacă test="@OpenInNewWindow = "True"" >_blank</XSL:Dacă>
    </XSL:variabila>

    <!--
      Aici vom defini o variabila, "tableStart".  Aceasta conţine HTML pe care le folosim pentru a defini deschiderea de masă, precum şi etichete de coloană.  Reţineţi că, dacă CurPos = 1, Acesta include HTML într-o etichetă CDATA.
      În caz contrar, Acesta va fi gol.

      Valoarea tableStart este emisă de fiecare dată când ItemStyle este numit prin intermediul ContentQueryMain.xsl.
    -->
    <XSL:variabila nume="tableStart">
      <XSL:Dacă test="$CurPos = 1">
        <![CDATA[
        <masă de frontieră = 1>
          <TR bgcolor = "albastru">
            <TD><culoare font = "alb"><b>Numele proiectului</b></font></TD>
            <TD alinia = "dreapta"><culoare font = "alb"><b>Data completă</b></font></TD>
            <TD alinia = "dreapta"><culoare font = "alb"><b>Buget</b></font></TD>
            <TD alinia = "dreapta"><culoare font = "alb"><b>Cheltuieli actuale</b></font></TD>
            <TD><culoare font = "alb"><b>Starea generală</b></font></TD>
          </TR>
        ]]>
      </XSL:Dacă>
    </XSL:variabila>

    <!--
      O altă variabilă, tableEnd defineşte pur şi simplu închiderea tag-ul de masă.

      Ca cu tableStart, este întotdeauna emisă.  De aceea, valoarea sa este asociată condiţional pe baza dacă am fost trecut ultimul rând de ContentQueryMain.xsl.
    -->
    <XSL:variabila nume="tableEnd">
      <XSL:Dacă test="$CurPos = $Last">
        <![CDATA[ </tabel> ]]>
      </XSL:Dacă>
    </XSL:variabila>

    <!--
      Întotdeauna emite conţinutul tableStart.  Dacă acest lucru nu este primul rând trecut la noi de ContentQueryMain.xsl, apoi am ştiu valoarea sa va fi necompletat.

      Dezactiva de ieşire evadarea deoarece când tableStart ea nu gol, Acesta include HTML reale, care ne-o dorim a fi prestate de către browser.  Dacă nu spunem XSL parser-ul pentru a dezactiva de ieşire evadarea, Acesta va genera chestii de genul"&lt;tabel&gt;" în loc de"<tabel>".
    -->
    <XSL:valoarea de Selectaţi="$tableStart" Dezactivează-ieşire-evadarea="da"/>


    <TR>
      <!--
      P:Project_x005F_x0020_Name P:Project_x005F_x0020_End_x005F_x0020_Date P:Project_x005F_x0020_Budget P:Project_x005F_x0020_Expenses P:Project_x005F_x0020_Status
      -->
      <TD>
        <XSL:valoarea de Selectaţi="@Project_x005F_x0020_Name"/>
      </TD>

      <TD Aliniaţi="dreptul de">
        <XSL:valoarea de Selectaţi="@Project_x005F_x0020_End_x005F_x0020_Date"/>
      </TD>

      <TD Aliniaţi="dreptul de">
        <XSL:apel-şablon nume="formatcurrency">
          <XSL:cu-param nume="valoarea" 
Selectaţi="@Project_x005F_x0020_Budget"></XSL:cu-param> </XSL:apel-şablon> </TD> <TD Aliniaţi="dreptul de"> <XSL:apel-şablon nume="formatcurrency"> <XSL:cu-param nume="valoarea" Selectaţi="@Project_x005F_x0020_Expenses">
</XSL:cu-param> </XSL:apel-şablon> </TD> <TD> <XSL:valoarea de Selectaţi="@Project_x005F_x0020_Status"/> </TD> <!-- Următoarele este comentat afară pentru a clarifica lucrurile. Cu toate acestea, aduceţi-l înapoi şi chestii-l într-un <TD> pentru a vedea efectul acesteia. --> <!-- <div id = "linkitem" clasa = "element"> <XSL:Dacă testul = "şir de caractere de lungime($SafeImageUrl) != 0"> <div clasa = "imagine-zona-stânga"> <o href = "{$SafeLinkUrl}" target = "{$LinkTarget}"> <img clasa = "imagine-lăţime fixă" src = "{$SafeImageUrl}"
alt = "{@ImageUrlAltText}"/> </o> </div> </XSL:Dacă> <div clasa = "link-ul-element"> <XSL:apel-şablon
name="OuterTemplate.CallPresenceStatusIconTemplate"/> <o href = "{$SafeLinkUrl}"
target = "{$LinkTarget}" title = "{@LinkToolTip}"> <XSL:valoare-a selecta = "$DispXSLTitle" /> </o> <div clasa = "Descriere"> <XSL:valoare de select="@Description" /> </div> </div> </div>
--> </TR> <!-- Emite închidere tag-ul de masă. Dacă nu suntem pe ultimul rând, Acest lucru va fi necompletat. --> <XSL:valoarea de Selectaţi="$tableEnd" Dezactivează-ieşire-evadarea="da"/> </XSL:şablon> <XSL:şablon nume="formatcurrency"> <XSL:Param nume="valoarea" Selectaţi="0" /> <XSL:valoarea de Selectaţi='format de număr($valoarea, "$DDD,DDD,DDD.DD", "personal")' /> </XSL:şablon>

Standardul AAC/MOSS date intrare ecrane nu acceptă Cascading Drop-coborâşuri (sau alte intra-de comunicare)

ACTUALIZARE (04/2008): Această intrare mare blog prezinta o abordare bun javascript pe bază de la această problemă: http://webborg.blogspot.com/2008/04/add-functions-and-events-to-sharepoint.html

ACTUALIZARE AL II-LEA: (04/2008): Acest blog intrare pare promiţătoare, precum şi: http://www.cleverworkarounds.com/2008/03/13/free-mosswss-2007-web-part-hide-controls-via-javascript/

Mai multe ori pe săptămână, Daca nu zilnic, utilizatori forum descrie o cerinţă care în mod normal ar fi îndeplinite prin intermediul picătură-coborâşuri în cascadă. De exemplu, Am două controale verticală:

  • Listă de SUA. Statele
  • Listă de SUA. Oraşe.

Ca responsabil UI furnizori, vrem să funcţioneze ca aceasta:

  • Paul selectează o SUA. stat din meniul vertical.
  • Acest lucru provoacă oraşele verticală pentru a filtra doar acele oraşe care aparţin statului selectate.
  • Paul selectează un oraş din această listă filtrată.

Nu există nici un suport de out-of--box pentru această caracteristică. de fapt, nu există nici un suport OOB pentru orice fel de comunicare directă intra-formular. Aceasta include programatic ascunde/activarea/dezactivarea domenii ca răspuns la schimbările de teren în altă parte pe formular.

Obiectivul reală a acestui articol pentru a descrie soluţii posibile, iar acestea sunt opţiunile ştiu ei:

  1. Dezvolta un tip de coloană particularizat. Ca o personalizat-coloana-developer, ai control deplin asupra lumii"" de acea coloană particularizat. Aveţi posibilitatea să implementaţi o cascading drop-jos în acest fel.
  2. Luaţi în considerare utilizarea flux de lucru. În unele cazuri, doriţi să se atribuie automat o valoare bazat pe un alt câmp valoarea câmpului. În acest caz, în mod normal, ar încerca să utilizezi o coloană calculată, dar unele ori, Acesta nu va lua doar treaba. Flux de lucru SharePoint Designer este un relativ administra-prietenos pentru dropping jos în cod şi visual studio. Dacă te duci acest traseu, Fiţi conştienţi de problema abordată de Acest articol (http://paulgalvin.spaces.live.com/blog/cns!CC1EDB3DAA9B8AA!405.entry).
  3. Gestionari de eveniment: Ca flux de lucru, Aceasta este o soluţie de după-faptul. Dumneavoastră de tratare a evenimentului este o asamblare .NET (C#, VB.NET) SharePoint care trece controlul. Obiectul să dezvolte are acces la datele din lista (şi modelul de obiect întreg) şi puteţi face orice calcul necesare.
  4. Utilizați SharePoint Designer pentru a crea formulare particularizate de intrare. Nu am experienta directa cu această abordare, but I hear they are doing good things with NewForm.aspx these days 🙂
  5. Rola propriul funcţia de intrare de date ASP.NET (ca o pagină de web de sine stătătoare sau ca o parte web) şi de a folosi în schimb.

Dacă cineva ştie opţiuni de alte sau mai bună, vă rugăm să posta un comentariu şi voi actualiza corpul de acest post.

<final />

Technorati Tags:

Crearea grafice cu bare în SharePoint

Privire de ansamblu:

(ACTUALIZARE 12/04/07: Adăugat o altă resursă interesantă la sfârşitul conectarea la un alt blog care se adresează acest lucru prin o parte web foarte interesant)

Această intrare de blog descrie modul de a crea un grafic cu bare în SharePoint. Acest lucru funcţionează în ambele WSS şi MOSS medii ca aceasta depinde doar partea web Vizualizare date.

Abordării globale este după cum urmează:

  1. Creaţi o listă sau bibliotecă de documente, care conţine datele pe care doriţi să grafic.
  2. Loc în biblioteca de documente asociate / particularizat lista de pe o pagină şi convertizor it la spre un partea de web date vizualizare (DVWP).
  3. Modifica DVWP XSL pentru a genera HTML care arată ca un grafic.

Scenariu de afaceri / Programul de instalare:

Am creat o listă particularizată cu standardul titlu coloană şi o coloana suplimentară, "Statutul". Acest modele (foarte simplist) o "autorizaţie pentru cheltuieli" scenariu în cazul în care titlul reprezinta proiectul şi statutul o valoare din lista de:

  • Propus
  • În procesul de
  • Au stagnat

Obiectivul este de a produce un interactive orizontală bar grafic care prezinta aceste coduri de stare.

Am au populat lista si se pare ca acest lucru:

imagine

Crea datelor partea Web vizualizare:

Crea DVWP prin adăugarea de listă particularizată la o pagină (pagina site-ului în cazul meu) şi urmaţi instrucţiunile aici (http://paulgalvin.spaces.live.com/blog/cns!1CC1EDB3DAA9B8AA!395.entry).

Pe lângă crearea pur şi simplu DVWP, de asemenea, trebuie să setați proprietatea de paginare pentru a afişa toate rândurile disponibile. Pentru mine, Aceasta arata ceva de genul:

imagine

La acest punct, Am aproape întotdeauna SPD şi browser-ul. Am apoi re-deschide pagina folosind browser-ul. Acest lucru evită accidental mucking până aspectul de parte web pe pagina.

Modifica XSLT:

Acum este momentul pentru a modifica XSLT.

I always folos visual student pentru acest. (A se vedea aici pentru o notă importantă despre intellisense care vă va ajuta foarte mult).

Crea un proiect gol adăuga fişiere noi patru (înlocuind cuvintele "Original" şi "nou" după caz):

  • Original.XSLT
  • New.XSLT
  • Original Params.xml
  • Noi Params.xml

În cazul meu, se pare ca asta:

imagine

Modifica partea web şi copiaţi params şi XSL original"" versiunea în Visual Studio.

Scopul aici este de a provoca XSL pentru a transforma rezultatele am sa ma intorc din interogarea de DVWP în HTML, care face ca un grafic.

În acest scop, El ajută să ia în considerare în primul rând ceea ce HTML ar trebui să arate înainte ne-am lua confuz de nebunie care este cunoscut ca "XSL". (Să fie clar, Aceasta este doar un exemplu; nu de tip-l sau de copiere/lipire în visual studio. Am oferi o lovitură completă punct de plecare pentru că mai târziu, în a scrie-up). Următorul eşantion grafic este randat ca pe HTML imediat după:

Exemplu Bar Graph

Corespunzătoare HTML:

<HTML>
<corpul>
<Centrul>
<lăţimea de masa = 80%>
<TR><TD><Centrul>Graficul cu bare orizontale</TD></TR>
<TR>
<TD alinia = "centru">
<masă de frontieră = "1" latime = 80%>
<TR>
<TD lăţime = 10%>Deschis</TD>
<TD><tabelul cellpadding ="0" cellSpacing ="0" frontieră = 0 width = 50%><TR bgcolor = roşu><TD>&nbsp;</TD></TR></tabel></TD>
</TR>
<TR>
<TD lăţime = 10%>Închis</TD>
<TD><tabelul cellpadding ="0" cellSpacing ="0" frontieră = 0 width = 25%><TR bgcolor = roşu><TD>&nbsp;</TD></TR></tabel></TD>
</TR>
<TR>
<TD lăţime = 10%>Au stagnat</TD>
<TD><tabelul cellpadding ="0" cellSpacing ="0" frontieră = 0 width = 25%><TR bgcolor = roşu><TD>&nbsp;</TD></TR></tabel></TD>
</TR>
</tabel>
</TD>
</TR>
</tabel>
</corpul>
</HTML>

Am folosit o abordare mort simplu la crearea baruri mea prin stabilirea culoarea de fundal a unui rând în "roşu".

Ia-te de aici este acest: În cele din urmă, toate vom face este de a crea HTML cu rânduri şi coloane.

Şablon XSLT:

I-am copiat XSLT care generează un grafic cu bare orizontale. Este destul de bine a comentat astfel încât nu va adăuga mult aici cu excepţia aceste note:

  • Am inceput cu XSL care SharePoint Designer mi-a dat când am creat primul DVWP implicit.
  • Am fost capabil de a reduce acest lucru la SPD pe 657 linii de 166 linii.
  • Eu nu mizerie în jurul cu fişierul XML parametrii (care este separat de XSL şi veţi şti ce vreau să spun atunci când te duci pentru a modifica DVWP sine; Există două fişiere puteţi modifica). Cu toate acestea, pentru a simplifica aceasta, Elimina aproape tot de pe ei la XSL. Aceasta înseamnă că dacă doriţi să faceţi uz de acei parametri, trebuie doar să adăugaţi variabile definiţiile lor înapoi la XSL. Că va fi uşor, deoarece aveţi originale XSL variabilă definiţii în dumneavoastră proiect visual studio.
  • Ar trebui să fie în măsură să copiaţi şi inseraţi acest lucru direct în dumneavoastră proiect visual studio. Apoi, Scoateţi apelurile mele şi introduceţi apelurile la "ShowBar".
  • Burghiu în jos de lucrări prin crearea unui <a href> aşa: http://server/List?FilterField1=fieldname&FilterValue1=actualFilterValue. Aceasta tehnica poate fi de valoare în alte contexte. La prima, M-am gândit mi-ar trebui să fie conforme cu un format mai complexe: http://server/List/AllItems.aspx?View={guid}&FilterField1=blah&FilterValue1=blah, dar în mediul meu care nu este necesar. Lista pe URL-ul este trecut la noi de SharePoint astfel încât acesta este destul de uşor să generalizeze.

Aici este:

<XSL:foaie de stil versiunea="1.0" exclude-rezultat-Prefixe="RS z o s ddwrt dt msxsl" 
xmlns:msxsl="urnă:schemas-microsoft-com:XSLT" xmlns:XSL="http://www.w3.org/ 1999/XSL/transformare"
xmlns:SharePoint="Microsoft.SharePoint.WebControls" xmlns:__designer="http://schemas.microsoft.com/WebParts/v2/DataView/designer"
xmlns:ASP="http://schemas.microsoft.com/ASPNET/20" xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime"
xmlns:oana="urnă:schemas-microsoft-com:birou" xmlns:s="UUID:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"
xmlns:DT="UUID:C2F41010-65B3 - 11d 1-A29F-00AA00C14882" xmlns:RS="urnă:schemas-microsoft-com:set de rânduri" xmlns:z="#RowsetSchema"
xmlns:ddwrt2="urnă:FrontPage:interne"
> <XSL:ieşire metoda="HTML" liniuţă="nu" /> <XSL:zecimal-format NaN="" /> <XSL:Param nume="ListUrlDir"></XSL:Param> <!-- Am nevoie de acest lucru pentru a sprijini o detaliaþi-jos. --> <XSL:şablon meci="/" xmlns:SharePoint="Microsoft.SharePoint.WebControls"
xmlns:__designer=http://schemas.microsoft.com/WebParts/v2/DataView/designer xmlns:ASP="http://schemas.microsoft.com/ASPNET/20"
> <XSL:variabila nume="dvt_StyleName">Tabel</XSL:variabila> <XSL:variabila nume="Rânduri" Selectaţi="/Rânduri/dsQueryResponse/rând" /> <XSL:variabila nume="dvt_RowCount" Selectaţi="Contele($Rânduri)" /> <XSL:variabila nume="IsEmpty" Selectaţi="$dvt_RowCount = 0" /> <XSL:variabila nume="dvt_IsEmpty" Selectaţi="$dvt_RowCount = 0" /> <XSL:alege> <XSL:când test="$dvt_IsEmpty"> Nu există date la graficul!<br/> </XSL:când> <XSL:în caz contrar> <!-- Chestii interesante incepe aici. Este necesar să definim o pereche de variabile pentru fiecare rând din grafic: numărul total de elemente şi la sută din total. --> <XSL:variabila nume="totalProposed" Selectaţi="Contele(/Rânduri/dsQueryResponse/rând[normalizarea-spaţiu(@Status) = 'Propuse'])" /> <XSL:variabila nume="percentProposed" Selectaţi="$totalProposed div $dvt_RowCount" /> <XSL:variabila nume="totalInProcess" Selectaţi="Contele(/Rânduri/dsQueryResponse/rând[normalizarea-spaţiu(@Status) = "În proces"])" /> <XSL:variabila nume="percentInProcess" Selectaţi="$totalInProcess div $dvt_RowCount" /> <XSL:variabila nume="totalStalled" Selectaţi="Contele(/Rânduri/dsQueryResponse/rând[normalizarea-spaţiu(@Status) = 'Blocat'])" /> <XSL:variabila nume="percentStalled" Selectaţi="$totalStalled div $dvt_RowCount" /> <!-- Am defini noastre tabel HTML aici. Eu sunt împrumut de la stiluri unele standard SharePoint aici pentru a face în concordanţă. Cred că aceasta va onora schimbările la nivel global css fişier, precum şi tema suprascrie. --> <tabel lăţime="100%" cellSpacing="0" cellPadding="2" stil="de frontieră-dreapta: 1 #C0C0C0 solide; de frontieră-fund: 1 #C0C0C0 solide; de frontieră-stanga-stil: solide; stânga de frontieră-lăţime: 1; frontieră-top-style: solide; de frontieră-top-lăţime: 1;"> <TR> <TD Aliniaţi="Centrul"> <tabel frontieră="1" lăţime="100%"> <!-- Pentru fiecare stare că vrem să grafic, numim "ShowBar" şablon. Am să-l: 1. O etichetă pentru rând. Acest lucru este transformat într-un hyperlink. 2. La sută (variabila de mai sus). 3. Numele de câmp reale a codului din lista care stau la baza. Aceasta nu are nevoie pentru a se potrivi eticheta de afişare. 4. Valoarea câmpului potrivite pentru #3. 5. Totală elemente de acest cod de stare (nu total de toate coduri de stare). El emite un <TR></TR> şi linia orizontală bar grafic. Noi numim acest şablon pentru fiecare cod de stare vrem să Vezi. --> <XSL:apel-şablon nume="ShowBar"> <XSL:cu-param nume="BarDisplayLabel" Selectaţi="'Propuse'"/> <XSL:cu-param nume="BarPercent" Selectaţi="$percentProposed"/> <XSL:cu-param nume="QueryFilterFieldName" Selectaţi=""Statut""/> <XSL:cu-param nume="QueryFilterFieldValue" Selectaţi="'Propuse'"/> <XSL:cu-param nume="TotalItems" Selectaţi="$totalProposed"></XSL:cu-param> </XSL:apel-şablon> <XSL:apel-şablon nume="ShowBar"> <XSL:cu-param nume="BarDisplayLabel" Selectaţi="'Blocat'"/> <XSL:cu-param nume="BarPercent" Selectaţi="$percentStalled"/> <XSL:cu-param nume="QueryFilterFieldName" Selectaţi=""Statut""/> <XSL:cu-param nume="QueryFilterFieldValue" Selectaţi="'Blocat'"/> <XSL:cu-param nume="TotalItems" Selectaţi="$totalStalled"></XSL:cu-param> </XSL:apel-şablon> <XSL:apel-şablon nume="ShowBar"> <XSL:cu-param nume="BarDisplayLabel" Selectaţi=""În proces""/> <XSL:cu-param nume="BarPercent" Selectaţi="$percentInProcess"/> <XSL:cu-param nume="QueryFilterFieldName" Selectaţi=""Statut""/> <XSL:cu-param nume="QueryFilterFieldValue" Selectaţi=""În proces""/> <XSL:cu-param nume="TotalItems" Selectaţi="$totalInProcess"></XSL:cu-param> </XSL:apel-şablon> </tabel> </TD> </TR> </tabel> </XSL:în caz contrar> </XSL:alege> </XSL:şablon> <!-- Acest şablon functioneaza de afişare linii individuale în graficul cu bare. Veţi face, probabil, cel mai mult de tweaking ta aici. --> <XSL:şablon nume="ShowBar"> <XSL:Param nume="BarDisplayLabel" /> <!-- eticheta pentru a arăta --> <XSL:Param nume="BarPercent"/> <!-- % Din total. --> <XSL:Param nume="QueryFilterFieldName"/> <!-- Utilizate pentru a sări la interogare & filtru --> <XSL:Param nume="QueryFilterFieldValue"/> <!-- Utilizate pentru a sări la interogare & filtru --> <XSL:Param nume="TotalItems" /> <!-- numărul total de acest barlabel --> <TR> <!-- Bar eticheta în sine. --> <TD Clasa="MS-formbody" lăţime="30%"> <!-- Acest următorul set de afirmaţii construieşte un şir de interogare, care ne permite de a detalia la o vizualizare filtrată de date care stau la baza. Vom face uz de o serie de lucruri aici: 1. Putem trece FilterField1 şi FilterValue1 la o listă pentru a filtra pe o coloană. 2. SharePoint este de a trece un parametru cheie pentru noi, ListUrlDir că punctele de la lista de bază împotriva cărora acest DVWP este "rulează". Nu este distractiv XSL? --> <XSL:textul Dezactivează-ieşire-evadarea="da"> <![CDATA[<o href ="]]></XSL:textul> <XSL:valoarea de Selectaţi="$ListUrlDir"/> <XSL:textul Dezactivează-ieşire-evadarea="da"><![CDATA[?FilterField1 =]]></XSL:textul> <XSL:valoarea de Selectaţi="$QueryFilterFieldName"/> <XSL:textul Dezactivează-ieşire-evadarea="da"><![CDATA[&FilterValue1 =]]></XSL:textul> <XSL:valoarea de Selectaţi="$QueryFilterFieldValue"/> <XSL:textul Dezactivează-ieşire-evadarea="da"><![CDATA[">]]></XSL:textul> <XSL:valoarea de Selectaţi="$BarDisplayLabel"/> <XSL:textul Dezactivează-ieşire-evadarea="da"><![CDATA[</o>]]></XSL:textul> <!-- Bitul următoare afişează unele numere în format: "(totalul / % total)" --> (<XSL:valoarea de Selectaţi="$TotalItems"/> / <!-- Acest lucru creează o etichetă la sută frumos pentru noi. mulţumesc, Microsoft! --> <XSL:apel-şablon nume="percentformat"> <XSL:cu-param nume="la sută" Selectaţi="$BarPercent"/> </XSL:apel-şablon>) </TD> <!-- În cele din urmă, emite un <TD> Tag-ul pentru bara de sine.--> <TD> <tabel cellPadding="0" cellSpacing="0" frontieră="0" lăţime="{Runda($BarPercent * 100)+1}%"> <TR bgcolor="rosu"> <XSL:textul Dezactivează-ieşire-evadarea="da"><![CDATA[&nbsp;]]></XSL:textul> </TR> </tabel> </TD> </TR> </XSL:şablon> <!-- Acest lucru este luat direct de la unele XSL am găsit într-un şablon de MS. --> <XSL:şablon nume="percentformat"> <XSL:Param nume="la sută"/> <XSL:alege> <XSL:când test="format de număr($la sută, '#,##0%;-#,##0%')= "NaN"">0%</XSL:când> <XSL:în caz contrar> <XSL:valoarea de Selectaţi="format de număr($la sută, '#,##0%;-#,##0%')" /> </XSL:în caz contrar> </XSL:alege> </XSL:şablon> </XSL:foaie de stil>

Rezultatele:

XSL de mai sus genereaza acest grafic:

imagine

Detalia la care stau la baza de date făcând clic pe codul de stare:

imagine

Gânduri finale:

Acest lucru poate fi generalizată?

Îmi place acest concept grafice, dar urăsc faptul că trebuie să meargă şi face parte atât de mult de codificare. I-am dat un pic crezut să dacă acesta poate fi generalizată şi eu sunt optimist, dar eu sunt, de asemenea, un pic de teamă că ar putea exista un zid de cărămidă undeva de-a lungul calea care nu va oferi orice lucru-în jurul. Dacă cineva are unele idei bune pe acest, vă rugăm să faceţi o notă în comentarii sau e-mail-mă.

Verticală grafice:

Acesta este un grafic cu bare orizontale. Este cu siguranţă posibil pentru a crea un grafic verticale. Avem nevoie doar de a schimba HTML. Aş începe acelaşi mod: A crea o reprezentare HTML de un grafic cu bare verticale şi apoi dau seama cum să obţineţi că prin intermediul XSL. Dacă cineva este interesat în care, Am putea fi convins să-l încercaţi şi elaborarea îndoit. Dacă cineva a făcut deja că, te rog să-mi spuneți și voi cu bucurie link către blog-ul dvs. 🙂

Cred că provocarea cu un grafic de verticală este că etichetele pentru grafic sunt mai dificil de a gestiona, dar cu siguranţă nu imposibil.

Câmpul nume Gotcha:

Există cel puţin două lucruri să se uite cu numele de domeniu.

Prima, un nume de câmp cu un spaţiu de a fi scăpat în XSL. Acest lucru va fi, probabil, o problemă aici:

        <XSL:variabila nume="totalProposed" 
Selectaţi="Contele(/Rânduri/dsQueryResponse/rând[normalizarea-spaţiu(@Status) = 'Propuse'])" />

Dacă starea"" coloana este de fapt numit "codul de stare" atunci ai nevoie să referinţă-l ca "Status_x0020_Code":

   <XSL:variabila nume="totalProposed" 
Selectaţi="Contele(/Rânduri/dsQueryResponse/rând[normalizarea-spaţiu(@Status_x0020_Code) = 'Propuse'])" />

Al doilea, şi eu sunt un pic fuzzy pe acest, dar, de asemenea, trebuie să fie în alertă pentru schimbări de nume câmp. Dacă numele de domeniu "codul de stare" şi apoi mai târziu, redenumiţi-o ca "AFE Status", "numele intern" nu se schimba. Numele intern va fi în continuare "codul de stare" şi trebuie să fie menţionate ca "Status_x0020_Code". "Alte resurse" link-uri pot ajuta la diagnosticarea şi de a corecta acest tip de problemă.

Despre acea culoare:

Am luat "roşu" pentru că este plăcut pentru mine în acest moment. Nu ar fi o afacere mare pentru a arăta culori diferite pentru a oferi mai mult decât o descriere vizuale a unui număr, dar, de asemenea, a furniza un KPI utile. De exemplu, în cazul în care procentul de "stagnat" Este AFE pe > 10% apoi Arată roşu, altfel arată-l în negru. Utilizarea <XSL:alege> pentru a realiza acest lucru.

Alte resurse:

Transformarea fericit!

<final />

Aboneaza-te la blog-ul meu!

Prezinte date de OM prin intermediul o listă particularizată (sau, Încă un alt OM de date Displayor [ca YACC, dar diferite])

Astăzi, Mi-am petrecut câteva ore de urmărire în jos cauza din spatele mesajul "coloana numele pe care le-aţi introdus este deja în uz sau rezervate. Alege un alt nume."

Coloana în cauză ar putea fi create, şters şi re-creat într-un alt mediu, aşa că am ştiut că nu a fost un nume rezervat. Cu toate acestea, Am pur şi simplu nu a putut găsi coloana oriunde prin interfaţa utilizator standard pentru SharePoint la orice site din colecția de site-ul.

Am postat la MSDN forumuri aici şi îndărătnic Andrew Woodward a subliniat mine în direcţia de date care stau la baza modelul obiect.

Am plecat la Codeplex pentru a găsi unele instrumente care ar ajuta-mi peer în OM care stau la baza de date şi ajută-mă găsiţi probleme.

Am incercat mai multe instrumente şi au fost foarte cool şi interesant, dar în cele din urmă, UI nu a fost suficient de bun pentru scopul meu. Eu nu sunt critici le prin orice mijloace, dar în mod clar factorii de instrument nu au problema mea în minte atunci când au creat lor UI :). Cei mai mulţi oameni par a fi investind o cantitate echitabil de timp şi efort în crearea postului de lucru / aplicaţiile client care oferă vedere la copac, faceţi clic dreapta pe meniuri context şi aşa mai departe. Acestea sunt frumos şi toate, dar este o mulţime de lucru pentru a crea o experienţă de utilizator de top-of--line, care este de asemenea foarte flexibil.

Am nevoie într-adevăr un răspuns la această problemă. A avut loc la mine că dacă aş putea obţine toate coloanele site din colecția de site-ul într-o listă particularizată, Am putea filtra, sorta şi de a crea vederi care ar ajuta-mi găsi această coloană se presupune existente (care a făcut-o, BTW). Am mers înainte şi a făcut asta şi o oră sau două mai târziu, a avut toate coloanele de site-ul meu încărcat într-o listă particularizată cu gruparea, sortare şi aşa mai departe. Am găsit răspunsul meu cinci minute mai târziu.

Dacă am lua cu succes în întreaga lume, Cred că am decret că toţi furnizorii de instrumente SharePoint trebuie să ia serios în considerare suprafaţă lor date de modelul de obiect într-o listă particularizată. În acest fel, Am puterea pentru a căuta orice fel vreau (constrânse, desigur, de caracteristicile standard sharepoint).