Kategoriarkiv: SharePoint-utvikling

Pass opp bryte endringer til ItemStyle.xsl

Jeg jobbet med ItemStyle.xsl å tilpasse utseendet på en webdelen for innholdsspørring og rett om lunsjtid, Jeg gjorde en bryter endrer til xsl. Jeg skjønte ikke det, men dette hatt vidtrekkende effekter i hele områdesamlingen. Jeg gikk til lunsj og etter min tilbake, merke denne meldingen vises i en rekke steder:

Kan ikke vise webdelen. Feilsøke problemet, Åpne denne websiden i et Windows SharePoint Services-kompatibelt HTML-redigeringsprogram for eksempel Microsoft Office SharePoint Designer. Hvis problemet vedvarer, Kontakt administratoren for webserveren.

Jeg skylda klienten (ikke realisere ennå at det var min feil på dette punktet) men til slutt merke til at visual studio intellisense advarer meg at jeg hadde ugyldig XSL. Jeg rettet det og alt begynte.

Være darned forsiktig når du arbeider med ItemStyle.xsl (og de globale XSL-filer) — bryte dem påvirker mange gjenstander i områdesamlingen.

<slutten />

Vise innhold webdel spørringsresultatene i et rutenett / Tabell

Oversikt og mål

Esken, MOSS’ Webdelen for innholdsspørring (CQWP) viser resultatene i listeformat, lik søkeresultater. Det er også mulig å vise resultatene i et rutenettformat (dvs.. HTML tabellformat). Rutenettet er bedre i enkelte tilfeller. Jeg beskrive hvordan å oppnå den effekten i denne artikkelen.

Virksomhet Scenario

Jeg har jobbet med en klient på en bedriftsomfattende MOSS distribusjon. Vi har utformet sine taksonomi slik at prosjekter er førsteklasses borgere i hierarkiet og har sin egen området på toppnivå. Prosjektledere vedlikeholde en singleton liste over sammendragsinformasjon for prosjektet, som tittelen, budsjett, forventet fullføringsdato, Gjenstående budsjett og andre oppsummeringstype felt. Av "singleton" Jeg mener en egendefinert SharePoint-liste som er garantert å inneholde bare ett element. Simplistically, Det ser ut som dette:

bilde

Tekniske tilnærmingen er mye det samme som beskrevet her (http://paulgalvin.spaces.live.com/blog/cns!1CC1EDB3DAA9B8AA!447.entry). CQWP bruker en XSL-transformasjon for å avgi HTML for leseren for å gjengi.

Envision jeg alltid resultatet før dykking i XSL fordi XSL er et mareritt. Her er min ønsket resultat:

bilde

HTML som dette genererer resultatet:

<HTML>
 <kroppen>
 <Center>
 <tabell kantlinje= 1>

<!-- Etiketter->
 <tr BgColor= blå>
 <TD><skrift farge= hvit><b>Prosjektnavnet</b></skrift></TD>
 <TD justere= høyre><skrift farge= hvit><b>Fullført dato</b></skrift></TD>
 <TD justere= høyre><skrift farge= hvit><b>Budsjett</b></skrift></TD>
 <TD justere= høyre><skrift farge= hvit><b>Faktiske kostnader</b></skrift></TD>
 <TD><skrift farge= hvit><b>Samlet Status</b></skrift></TD>
 </tr>

<tr>
 <TD>Re-wire datarom.</TD>
 <TD justere= høyre>02/01/08</TD>
 <TD justere= høyre>22,500.00</TD>
 <TD justere= høyre>19,000.00</TD>
 <TD>Pågår</TD>
 </tr>

<tr>
 <TD>Bestemmelsen servere for SQL Upgrade</TD>
 <TD justere= høyre>04/01/08</TD>
 <TD justere= høyre>7,500.00</TD>
 <TD justere= høyre>0.00</TD>
 <TD>Planlagt</TD>
 </tr>

</tabell>
 </Center>
 </kroppen>
</HTML>

Tilnærming

Følg denne fremgangsmåten for å opprette rutenettet:

  1. Komponentene i rutenettet (rader/kolonner).
  2. Definerer og nødvendig områdekolonner.
  3. Opprette sub-områder for prosjekter og singleton lister.
  4. Legge til CQWP til en webside og konfigurere den til å søke for listene.
  5. Endre det CQWP XML til å samle tilleggskolonnene.
  6. Endre XSL for å generere en tabell.

Jeg skal konsentrere nummer seks. Tallene en gjennom fire er rett fram og noe som CQWP brukere har allerede gjort. Nummer fem er veldokumentert av andre inkludert denne uttømmende skjermbilde laden artikkelen fra MSDN her (http://msdn2.microsoft.com/en-us/library/bb897399.aspx) og Heather Solomons blogg her (http://www.heathersolomon.com/blog/articles/CustomItemStyle.aspx).

Muttere og bolter

Begynner og implementere trinn en til fem i MSDN-dokumentasjonen og Heather Solomons artikkel.

På dette punktet, du har lagt til din CQWP til siden og du har din <CommonViewFields> konfigurert som nødvendig.

Vanlige fremgangsmåten, Jeg får disse mellomliggende resultater:

1. Opprette en innholdstype, en malbasert liste for innholdstypen og to områder. Her er innholdstypen:

bilde

Her er områdestrukturen:

bilde

2. Legge til CQWP når du har opprettet min prosjektet sekundære områder og singleton prosjektet Sammendrag lister:

bilde

3. Legge til den ekstra informasjonen jeg ønsker via den <CommonViewFields>:

        <egenskapen navn="CommonViewFields" type="streng">Project_x0020_Name;Project_x0020_Expenses;Project_x0020_Status;Project_x0020_Start_x0020_Date;Project_x0020_End_x0020_Date;Project_x0020_Budget</egenskapen>

Merk at jeg måtte holde alle egenskapsfelt på én linje, eller det ville ikke fungere (CQWP ville fortelle meg at spørringen returnerte ingen elementer).

4. På dette punktet, Vi er klare til å MSDN-artikkelen og snu på Heather Solomons artikkel. Følg hennes fremgangsmåte begynner nær trinn #5 opprette en tilpasset / unghosted versjon av ItemStyle.xsl. Jeg følger Heather råd, opp gjennom trinn 11 og få disse midlertidige resultater:

4.1: Navnet mitt XSL-mal som følger:

<XSL:malnavnet = "rutenett" matche = "rad[@Style = 'Rutenett']" Mode = "itemstyle">

Jeg endre også litt henne foreslo <XSL:for each …> ved å legge til en <br /> kode for å gi en renere liste:

    <XSL:for each Velg="@*">
      P:<XSL:verdien av Velg="navn()" /><br/>
    </XSL:for each>

4.2: Jeg endre webdelen, gå til utseende og velg min "rutenett" stil:

bilde

Før endringen og her er resultatet:

bilde

Vi kan se fra ovenfor at feltene vi ønsker (Prosjektnavnet, bekostning, status, osv.) er tilgjengelig for oss å bruke når vi sender ut HTML. Ikke bare det, men vi se navnene som vi må referere til disse kolonnene i XSL. For eksempel, Vi referanse prosjektstatus som "Project_x005F_x0020_Name".

På dette punktet, Vi går fra Heathers blogg og skuldrene til disse gigantene, Jeg legger min egen litt.

ContentQueryMain.xsl

NOTE: Når endringer både ContentQueryMain.xsl samt ItemStyle.xsl, du må sjekke filene tilbake i før du ser effekten av endringene.

Rutenett-making forbindelse, MOSS bruker to forskjellige XSL-filer for å produsere resultatene vi ser fra en CQWP. Generere den forrige bit av utdata, vi endret ItemStyle.xsl. MOSS faktisk bruker en XSL-fil, ContentQueryMain.xsl til i forbindelse med ItemStyle.xsl til å generere dens HTML. Som navnet tilsier, ContentQueryMain.xsl er den "viktigste" XSL som styrer den samlede flyten i oversettelse. Det går gjennom alle funnet elementene og sender dem én etter én til malene i ItemStyle.xsl. Vi vil endre ItemStyle.xsl for å generere åpne <tabell> før emitting den første raden med data og lukking <tabell> koden etter emitting siste. Å oppnå dette, ContentQueryMain.xsl er endret for å sende to parametere til våre "rutenett" malen i ItemStyle.xsl, "siste rad" og "gjeldende rad". ItemStyle.xsl bruker dette til betinget avgir de nødvendige kodene.

Bruke Heather Solomons teknikken, Vi finner ContentQueryMain.xsl. Det ligger på samme sted som ItemStyle.xsl. Dette skjermbildet skal hjelpe:

bilde

Vi må gjøre følgende endringer:

  • Endre en xsl-mal, "CallItemTemplate" som påkaller faktisk våre rutenettet malen i ItemStyle.xsl. Vi passerer to parametere for rutenettet malen slik at den har dataene må betinget generering åpning og lukking <tabell> Tags.
  • Endre en annen bit av ContentQueryMain.xsl som kaller "CallItemTemplate" skjedde det en "LastRow" parameteren slik at LastRow kan bli gitt videre til vår rutenettet mal.

Finn malen kalt "OuterTemplate.CallItemTemplate" identifisert av strengen:

  <XSL:mal navn="OuterTemplate.CallItemTemplate">

Erstatte hele malen som følger:

  <XSL:mal navn="OuterTemplate.CallItemTemplate">
    <XSL:param navn="CurPosition" />

    <!--
      Legge til LastRow"" parameteren.
      Vi bare bruker den når elementet stil trinnet er "Rutenett".
    -->
    <XSL:param navn="LastRow" />

    <XSL:Velg>
      <XSL:når test="@Style = 'NewsRollUpItem'">
        <XSL:bruke-maler Velg="." modus="itemstyle">
          <XSL:med param navn="EditMode" Velg="$cbq_iseditmode" />
        </XSL:bruke-maler>
      </XSL:når>
      <XSL:når test="@Style = 'NewsBigItem'">
        <XSL:bruke-maler Velg="." modus="itemstyle">
          <XSL:med param navn="CurPos" Velg="$CurPosition" />
        </XSL:bruke-maler>
      </XSL:når>
      <XSL:når test="@Style = 'NewsCategoryItem'">
        <XSL:bruke-maler Velg="." modus="itemstyle">
          <XSL:med param navn="CurPos" Velg="$CurPosition" />
        </XSL:bruke-maler>
      </XSL:når>

      <!--
              Pass nåværende posisjon og lastrow i malen rutenett itemstyle.xsl.
              ItemStyle.xsl vil bruke det til å avgi åpne og lukke <tabell> Tags.
      -->
      <XSL:når test="@Style = 'Rutenett'">
        <XSL:bruke-maler Velg="." modus="itemstyle">
          <XSL:med param navn="CurPos" Velg="$CurPosition" />
          <XSL:med param navn="Siste" Velg="$LastRow" />
        </XSL:bruke-maler>
      </XSL:når>

      <XSL:ellers>
        <XSL:bruke-maler Velg="." modus="itemstyle">
        </XSL:bruke-maler>
      </XSL:ellers>
    </XSL:Velg>
  </XSL:mal>

Kommentarer beskriver hensikten med endringene.

selvfølgelig, "-OuterTemplate.CallItemTemplate" kalles seg fra en annen mal. Finn malen ved å søke etter denne tekststrengen:

<XSL:mal navn="OuterTemplate.Body">

Bla gjennom instruksjonene i OuterTemplate.Body og setter parameteren LastRow som følger (vises som en kommentar i kursiv):

<XSL:samtale-mal navn="OuterTemplate.CallItemTemplate">
  <XSL:med param navn="CurPosition" Velg="$CurPosition" />
  <!-- Sette parameteren LastRow. -->
  <XSL:med param navn="LastRow" Velg="$LastRow"/>
</XSL:samtale-mal>

Etter alt dette, Vi endelig har ting satt opp riktig slik at våre ItemStyle.xsl kan avgi <tabell> koder på rett sted.

ItemStyle.Xsl

NOTE: Igjen, innsjekking ItemStyle.xsl etter gjør endringer slik at du ser effekten av endringene.

Vi har to aktiviteter:

  • Erstatte malen for hele rutenettet. Du kan kopiere/lime nedenfor.
  • Legge noe mumbo jumbo utenfor maldefinisjonen som gjør "formatcurrency" mal å arbeide. (Du kan fortelle at jeg har en spinkel håndtak på XSL).

Første, øverst på ItemStyle.xsl, Legg til denne linjen:

  <!-- Noe mumbo jumbo som lar oss vise USA. valuta. -->
  <XSL:desimal-format navn="ansatte" siffer="D" />

  <XSL:mal navn="Standard" kamp="*" modus="itemstyle">

Merk at jeg la det direkte før den <XSL:malnavnet = "retten" …> definisjon.

Neste, gå tilbake til vår rutenettet mal. Erstatte malen for hele rutenettet med koden nedenfor. Det er godt kommentert, men ikke nøl med å email meg eller forlate kommentarer på bloggen min hvis du har spørsmål.

  <XSL:mal navn="Rutenett" kamp="Rad[@Style = 'Rutenett']" modus="itemstyle">

    <!--
      ContentMain.xsl går CurPos og siste.
      Vi bruker disse til betinget avgir åpne og lukke <tabell> Tags.
    -->
    <XSL:param navn="CurPos" />
    <XSL:param navn="Siste" />

    <!-- Følgende variabler er uendret fra den standard ItemStyle.xsl -->
    <XSL:variabel navn="SafeImageUrl">
      <XSL:samtale-mal navn="OuterTemplate.GetSafeStaticUrl">
        <XSL:med param navn="UrlColumnName" Velg="'ImageUrl'"/>
      </XSL:samtale-mal>
    </XSL:variabel>
    <XSL:variabel navn="SafeLinkUrl">
      <XSL:samtale-mal navn="OuterTemplate.GetSafeLink">
        <XSL:med param navn="UrlColumnName" Velg="'LinkUrl'"/>
      </XSL:samtale-mal>
    </XSL:variabel>
    <XSL:variabel navn="DisplayTitle">
      <XSL:samtale-mal navn="OuterTemplate.GetTitle">
        <XSL:med param navn="Tittel" Velg="@Title"/>
        <XSL:med param navn="UrlColumnName" Velg="'LinkUrl'"/>
      </XSL:samtale-mal>
    </XSL:variabel>
    <XSL:variabel navn="LinkTarget">
      <XSL:Hvis test="@OpenInNewWindow = "True"" >_blank</XSL:Hvis>
    </XSL:variabel>

    <!--
      Her definere vi en variabel, "tableStart".  Denne inneholder HTML som vi bruker til å definere åpningen av tabellen samt kolonneetikettene.  Merk at hvis CurPos = 1, Det inkluderer HTML i en CDATA-kode.
      Ellers, det vil være tomt.

      Verdien for tableStart er emited hver gang ItemStyle kalles via ContentQueryMain.xsl.
    -->
    <XSL:variabel navn="tableStart">
      <XSL:Hvis test="$CurPos = 1">
        <![CDATA[
        <tabellkantlinjen = 1>
          <St bgcolor = "blue">
            <TD><skriftfarge = "hvit"><b>Prosjektnavnet</b></skrift></TD>
            <TD Juster = "høyre"><skriftfarge = "hvit"><b>Fullført dato</b></skrift></TD>
            <TD Juster = "høyre"><skriftfarge = "hvit"><b>Budsjett</b></skrift></TD>
            <TD Juster = "høyre"><skriftfarge = "hvit"><b>Faktiske kostnader</b></skrift></TD>
            <TD><skriftfarge = "hvit"><b>Samlet Status</b></skrift></TD>
          </tr>
        ]]>
      </XSL:Hvis>
    </XSL:variabel>

    <!--
      En annen variabel, tableEnd bare definerer avslutningskoden tabellen kode.

      Som med tableStart, Det er alltid emited.  Derfor verdien tilordnes betinget basert på om har vi passert siste av ContentQueryMain.xsl.
    -->
    <XSL:variabel navn="tableEnd">
      <XSL:Hvis test="$CurPos = $Last">
        <![CDATA[ </tabell> ]]>
      </XSL:Hvis>
    </XSL:variabel>

    <!--
      Alltid avgi innholdet i tableStart.  Hvis dette ikke er den første raden passerte oss ContentQueryMain.xsl, så vet vi verdien være tom.

      Deaktiverer utgang rømmer fordi når tableStart det ikke tomme, den inneholder selve HTML som vi skal gjengis i leseren.  Hvis vi ikke forteller utgang XSL parseren deaktiverer rømme, det vil generere ting som"&lt;tabell&gt;" i stedet for"<tabell>".
    -->
    <XSL:verdien av Velg="$tableStart" Deaktiver-utdata-unnslippe="ja"/>


    <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:verdien av Velg="@Project_x005F_x0020_Name"/>
      </TD>

      <TD justere="høyre">
        <XSL:verdien av Velg="@Project_x005F_x0020_End_x005F_x0020_Date"/>
      </TD>

      <TD justere="høyre">
        <XSL:samtale-mal navn="FormatCurrency">
          <XSL:med param navn="verdi" 
Velg="@Project_x005F_x0020_Budget"></XSL:med param> </XSL:samtale-mal> </TD> <TD justere="høyre"> <XSL:samtale-mal navn="FormatCurrency"> <XSL:med param navn="verdi" Velg="@Project_x005F_x0020_Expenses">
</XSL:med param> </XSL:samtale-mal> </TD> <TD> <XSL:verdien av Velg="@Project_x005F_x0020_Status"/> </TD> <!-- Følgende er kommentert ut for å avklare ting. Men, bringe det tilbake og greier det i en <TD> å se sin effekt. --> <!-- <div id = "linkitem" class = "element"> <XSL:Hvis test = "strenglengde($SafeImageUrl) != 0"> <div class = "bilde-området-left"> <et href = "{$SafeLinkUrl}" Target = "{$LinkTarget}"> <img class = "bilde-fast bredde" src = "{$SafeImageUrl}"
alt = "{@ImageUrlAltText}"/> </en> </div> </XSL:Hvis> <div class = "link-element"> <XSL:samtale-mal
Name="OuterTemplate.CallPresenceStatusIconTemplate"/> <et href = "{$SafeLinkUrl}"
Target = "{$LinkTarget}" Tittel = "{@LinkToolTip}"> <XSL:verdien av Velg = "$DisXSLyTitle" /> </en> <div class = "beskrivelse"> <XSL:verdien av select="@Description" /> </div> </div> </div>
--> </tr> <!-- Avgi avslutningskoden tabellen kode. Hvis vi ikke er i den siste raden, Dette vil være tom. --> <XSL:verdien av Velg="$tableEnd" Deaktiver-utdata-unnslippe="ja"/> </XSL:mal> <XSL:mal navn="FormatCurrency"> <XSL:param navn="verdi" Velg="0" /> <XSL:verdien av Velg='formater tall($verdi, "$DDD,DDD,DDD.DD", "personale")' /> </XSL:mal>

Standard WSS RUNDPINNE dataregistreringsskjermbilder støtter ikke gjennomgripende rullegardinlister (eller andre intra-fra kommunikasjon)

OPPDATERINGEN (04/2008): Dette flott bloggpost viser en god javascript basert tilnærming til problemet: http://webborg.blogspot.com/2008/04/add-functions-and-events-to-sharepoint.html

UPDATE II: (04/2008): Dette blogginnlegget ser lovende også: http://www.cleverworkarounds.com/2008/03/13/free-mosswss-2007-web-part-hide-controls-via-javascript/

Flere ganger i uken, om ikke daglig, forumbrukerne beskrive et krav som normalt ville bli møtt via gjennomgripende rullegardinlister. For eksempel, Jeg har to rullegardinlisten kontroller:

  • Liste over USA. stater
  • Liste over USA. Byer.

Som ansvarlig UI leverandører, Vi vil at det skal fungere som dette:

  • Paul velger en USA. staten fra rullegardinlisten.
  • Dette fører til byene rullegardinlisten til å filtrere listen inneholder bare byer som tilhører den valgte tilstanden.
  • Paul velger en by fra denne filtrert liste.

Det er ingen out-of-the-box støtte for denne funksjonen. faktisk, Det er ingen OOB støtte for noen form for direkte intra-form kommunikasjon. Dette inkluderer programmatisk skjule/aktivering/deaktivering felt svar på feltet endres andre steder i skjemaet.

Den virkelige målet av denne artikkelen for å beskrive mulige løsninger og disse er alternativene som jeg kjenner dem:

  1. Utvikle en egendefinert kolonnetype. Som en tilpasset-kolonnen-utvikler, du har full kontroll over "verden" den egendefinerte kolonnen. Du kan implementere en CSS rullegardinmenyen sånn.
  2. Vurder å bruke arbeidsflyten. I noen tilfeller, du vil automatisk tilordne en verdi til-feltet basert på en annen feltverdi. I dette tilfellet, du vil normalt forsøke å bruke en beregnet kolonne, men noen ganger, det får bare ikke jobben gjort. SharePoint Designer arbeidsflyt er et relativt administrere-vennlig alternativ til synker ned i kode og visual studio. Hvis du går denne ruten, Vær oppmerksom på problemet Denne artikkelen (http://paulgalvin.spaces.live.com/blog/cns!CC1EDB3DAA9B8AA!405.entry).
  3. Hendelsesbehandling: Som arbeidsflyten, Dette er en etter-det-faktum løsning. Hendelsesbehandlingen er en .NET-samling (C#, VB.NET) til hvilke SharePoint sender kontroll. Objektet du har tilgang til dataene i listen (og hele objektmodellen) og kan gjøre alle nødvendige beregning.
  4. Bruke SharePoint Designer til å opprette egendefinerte oppføring skjemaer. Jeg har ikke direkte erfaring med denne tilnærmingen, but I hear they are doing good things with NewForm.aspx these days 🙂
  5. Roll din egen ASP.NET data oppføring funksjon (som en frittstående web-side eller en webdel) og bruke det i stedet.

Vet noen andre og/eller bedre alternativer, Vennligst legg inn en kommentar og jeg vil oppdatere kroppen til dette innlegget.

<slutten />

Technorati Merkelapper:

Opprette søylediagrammer i SharePoint

Oversikt:

(OPPDATERINGEN 12/04/07: Lagt en annen interessant ressurs på slutten kobling til en annen blogg som omhandler dette via en veldig interessant webdel)

Dette blogginnlegget beskriver hvordan du oppretter et stolpediagram i SharePoint. Dette fungerer både WSS og MOSS som det bare avhenger av webdelen for datavisning.

Den generelle tilnærmingen er som følger:

  1. Opprette en liste eller et dokumentbibliotek som inneholder dataene du vil lage.
  2. Plass tilknyttet dokumentbiblioteket / egendefinert liste på en side og konvertere den til en webdelen for datavisning (DVWP).
  3. Endre det DVWP XSL for å generere HTML som vises som en graf.

Virksomhet Scenario / Installasjonsprogrammet:

Jeg har opprettet en egendefinert liste med standard Tittel-kolonnen og en ekstra kolonne, "Status". Denne modeller (veldig simplistically) "tillatelse For regning" scenariet der tittelen representerer prosjektet og Status en verdi fra listen over:

  • Foreslått
  • I prosessen
  • Stoppet

Målet er å produsere en interaktiv vannrett stolpediagram som viser disse statuskoder.

Jeg har fylt ut listen og det ser slik ut:

bilde

Opprette webdelen for datavisning:

Lage DVWP ved å legge den egendefinerte listen på en side (siden i mitt tilfelle) og følg instruksjonene her (http://paulgalvin.spaces.live.com/blog/cns!1CC1EDB3DAA9B8AA!395.entry).

I tillegg til å lage DVWP, Vi må også angi egenskapen paginerer å vise alle tilgjengelige rader. For meg, Dette ser noe som dette:

bilde

På dette punktet, Jeg lukke alltid SPD og leseren. Jeg deretter åpne siden ved hjelp av leseren på nytt. Dette unngår tilfeldigvis rote opp del weboppsett på siden.

Endre XSLT:

Det er nå tid til å endre XSLT.

Jeg har alltid bruke visual studio til dette. (Se her for en viktig merknad om intellisense som vil hjelpe deg mye).

Jeg opprette et tomt prosjekt legge til fire nye filer (erstatte ordene "Original" og "ny" etter behov):

  • Original.XSLT
  • New.XSLT
  • Opprinnelige Params.xml
  • Nye Params.xml

I mitt tilfelle, Det ser ut som dette:

bilde

Endre webdelen og kopier parametere og XSL til originalen»" versjonen i Visual Studio.

Målet her er å føre XSL å forvandle resultatene vi kommer tilbake fra DVWP spørringen i HTML som gjengir som en graf.

Dette, Det hjelper å først vurdere hva HTML skal se ut før vi forvirret av galskapen som er kjent som "XSL". (Å være klar, Følgende er bare et eksempel; ikke skrive det inn eller lime inn visual studio. Jeg gi en full slag utgangspunkt for senere i skrive opp). Følgende eksempel diagram gjengis som HTML umiddelbart etter:

Smak Bar Graph

Tilsvarende HTML:

<HTML>
<kroppen>
<Center>
<tabell bredde = 80%>
<tr><TD><Center>Vannrett stolpediagram</TD></tr>
<tr>
<TD align = "center">
<tabellkantlinjen = "1" bredde = 80%>
<tr>
<TD bredde = 10%>Åpne</TD>
<TD><tabell cellpadding ="0" cellspacing ="0" border = 0 width = 50%><St bgcolor = rød><TD>&nbsp;</TD></tr></tabell></TD>
</tr>
<tr>
<TD bredde = 10%>Stengt</TD>
<TD><tabell cellpadding ="0" cellspacing ="0" border = 0 width = 25%><St bgcolor = rød><TD>&nbsp;</TD></tr></tabell></TD>
</tr>
<tr>
<TD bredde = 10%>Stoppet</TD>
<TD><tabell cellpadding ="0" cellspacing ="0" border = 0 width = 25%><St bgcolor = rød><TD>&nbsp;</TD></tr></tabell></TD>
</tr>
</tabell>
</TD>
</tr>
</tabell>
</kroppen>
</HTML>

Jeg brukte en død enkel tilnærming til å skape min barer ved å angi bakgrunnsfarge for en rad "røde".

Det takeaway her er dette: Til slutt, alt vi gjør er skaper HTML med rader og kolonner.

Malen XSLT:

Jeg har kopiert XSLT-filen som genererer et vannrett stolpediagram. Det er ganske godt kommentert så jeg ikke vil legge mye her bortsett fra disse notatene:

  • Jeg startet med standard XSL som SharePoint Designer ga meg da jeg først skapte DVWP.
  • Jeg klarte å kutte dette ned fra SPD 657 linjer 166 linjer.
  • Jeg rote ikke rundt med parameterne XML-filen (som er atskilt fra XSL og du vet hva jeg mener når du går for å endre DVWP selv; Det er to filer kan du endre). Men, for å forenkle it, Jeg fjernet nesten alle av dem fra XSL. Dette betyr at hvis du vil gjøre bruk av disse parametrene, du trenger bare legge variabel definisjoner XSL. Det vil være lett siden du har de opprinnelige XSL variable definisjonene i visual studio-prosjekt.
  • Du bør kunne kopiere og lime inn dette direkte i visual studio-prosjekt. Deretter, ta mine samtaler og sett dine egne kall til "ShowBar".
  • Vil neddrillingen fungerer ved å opprette en <et href> som dette: http://server/List?FilterField1=fieldname&FilterValue1=actualFilterValue. Denne teknikken kan være av verdi i andre sammenhenger. Først, Jeg trodde jeg måtte oppfyller en mer kompleks: http://server/List/AllItems.aspx?View={guid}&FilterField1=blah&FilterValue1=blah, men i mine omgivelser som er ikke nødvendig. Listens URL sendes til oss av SharePoint så dette er ganske lett å generalisere.

Her er det:

<XSL:stilark versjon="1.0" Ekskluder-resultat-prefikser="RS z o s ddwrt dt msxsl" 
xmlns:msxsl="urn:schemas-microsoft-com:XSLT" xmlns:XSL="http://www.w3.org/ 1999/XSL/overføring"
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:o="urn:schemas-microsoft-com:Office" xmlns:s="UUID:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"
xmlns:dt="UUID:C2F41010-65B3 - 11d 1-A29F-00AA00C14882" xmlns:RS="urn:schemas-microsoft-com:radsettet" xmlns:z="#RowsetSchema"
xmlns:ddwrt2="urn:FrontPage:intern"
> <XSL:utgang metoden="HTML" innrykk="nei" /> <XSL:desimal-format NaN="" /> <XSL:param navn="ListUrlDir"></XSL:param> <!-- Jeg nød denne å støtte en neddrilling. --> <XSL:mal kamp="/" xmlns:SharePoint="Microsoft.SharePoint.WebControls"
xmlns:__designer=http://schemas.microsoft.com/WebParts/v2/DataView/designer xmlns:ASP="http://schemas.microsoft.com/ASPNET/20"
> <XSL:variabel navn="dvt_StyleName">Tabell</XSL:variabel> <XSL:variabel navn="Rader" Velg="/dsQueryResponse/rader/rad" /> <XSL:variabel navn="dvt_RowCount" Velg="antall($Rader)" /> <XSL:variabel navn="IsEmpty" Velg="$dvt_RowCount = 0" /> <XSL:variabel navn="dvt_IsEmpty" Velg="$dvt_RowCount = 0" /> <XSL:Velg> <XSL:når test="$dvt_IsEmpty"> Det er ingen data diagrammet!<br/> </XSL:når> <XSL:ellers> <!-- Interessante ting begynner her. Vi må definere et par variabler for hver rad i diagrammet: Totalt antall elementer og prosent av total. --> <XSL:variabel navn="totalProposed" Velg="antall(/dsQueryResponse/rader/rad[Normalize-plass(@Status) = 'Foreslått'])" /> <XSL:variabel navn="percentProposed" Velg="$totalProposed div $dvt_RowCount" /> <XSL:variabel navn="totalInProcess" Velg="antall(/dsQueryResponse/rader/rad[Normalize-plass(@Status) = "Pågår"])" /> <XSL:variabel navn="percentInProcess" Velg="$totalInProcess div $dvt_RowCount" /> <XSL:variabel navn="totalStalled" Velg="antall(/dsQueryResponse/rader/rad[Normalize-plass(@Status) = "Stoppet"])" /> <XSL:variabel navn="percentStalled" Velg="$totalStalled div $dvt_RowCount" /> <!-- Vi definerer våre HTML-tabell her. Jeg er låne fra noen SharePoint standardstilene her å gjøre det konsekvent. Jeg tror det vil respektere endringer i globale css filen samt tema overstyrer. --> <tabell bredde="100%" cellspacing="0" CellPadding="2" stil="kantlinje-høyre: 1 solid #C0C0C0; kantlinje-bunn: 1 solid #C0C0C0; venstre kantlinjestil: solid; venstre kantlinjetykkelse: 1; kantlinje-topp-stil: solid; topp kantlinjetykkelse: 1;"> <tr> <TD justere="Center"> <tabell kantlinje="1" bredde="100%"> <!-- For hver vi vil lage, Vi kaller det "-ShowBar" mal. Vi passerer det: 1. En etikett for raden. Dette er forvandlet til en hyperkobling. 2. Prosent (variabel ovenfra). 3. Selve navnet på koden fra den underliggende listen. Dette trenger ikke å matche Vis etikett. 4. Feltverdien tilpasset for #3. 5. Totalt antall artikler av denne statuskoden (ikke totalsummen av alle statuskoder). Den avgir en <tr></tr> og vannrett stolpediagram. Vi kaller denne malen for hver statuskode vi vil vise. --> <XSL:samtale-mal navn="ShowBar"> <XSL:med param navn="BarDisplayLabel" Velg="'Foreslått'"/> <XSL:med param navn="BarPercent" Velg="$percentProposed"/> <XSL:med param navn="QueryFilterFieldName" Velg=""Status""/> <XSL:med param navn="QueryFilterFieldValue" Velg="'Foreslått'"/> <XSL:med param navn="TotalItems" Velg="$totalProposed"></XSL:med param> </XSL:samtale-mal> <XSL:samtale-mal navn="ShowBar"> <XSL:med param navn="BarDisplayLabel" Velg=""Stoppet""/> <XSL:med param navn="BarPercent" Velg="$percentStalled"/> <XSL:med param navn="QueryFilterFieldName" Velg=""Status""/> <XSL:med param navn="QueryFilterFieldValue" Velg=""Stoppet""/> <XSL:med param navn="TotalItems" Velg="$totalStalled"></XSL:med param> </XSL:samtale-mal> <XSL:samtale-mal navn="ShowBar"> <XSL:med param navn="BarDisplayLabel" Velg=""Pågår""/> <XSL:med param navn="BarPercent" Velg="$percentInProcess"/> <XSL:med param navn="QueryFilterFieldName" Velg=""Status""/> <XSL:med param navn="QueryFilterFieldValue" Velg=""Pågår""/> <XSL:med param navn="TotalItems" Velg="$totalInProcess"></XSL:med param> </XSL:samtale-mal> </tabell> </TD> </tr> </tabell> </XSL:ellers> </XSL:Velg> </XSL:mal> <!-- Denne malen gjør arbeidet med å vise enkeltlinjer i stolpediagrammet. Du vil sannsynligvis gjøre de fleste av dine tilpasning her. --> <XSL:mal navn="ShowBar"> <XSL:param navn="BarDisplayLabel" /> <!-- etiketten for å vise --> <XSL:param navn="BarPercent"/> <!-- Prosent av totalt. --> <XSL:param navn="QueryFilterFieldName"/> <!-- Brukes til å hoppe til spørringen & filter --> <XSL:param navn="QueryFilterFieldValue"/> <!-- Brukes til å hoppe til spørringen & filter --> <XSL:param navn="TotalItems" /> <!-- Totalt antall denne barlabel --> <tr> <!-- Baren merke seg. --> <TD klassen="MS-formbody" bredde="30%"> <!-- Denne neste rekke utsagn bygger en spørrestreng som tillater oss å drille ned til en filtrert visning av de underliggende dataene. Vi gjøre bruk av noen ting her: 1. Vi kan sende FilterField1 og FilterValue1 til en liste for å filtrere på en kolonne. 2. SharePoint passerer en viktig parameter for oss, ListUrlDir som peker til den underliggende listen som denne DVWP "kjører". Ikke XSL moro? --> <XSL:tekst Deaktiver-utdata-unnslippe="ja"> <![CDATA[<et href ="]]></XSL:tekst> <XSL:verdien av Velg="$ListUrlDir"/> <XSL:tekst Deaktiver-utdata-unnslippe="ja"><![CDATA[?FilterField1 =]]></XSL:tekst> <XSL:verdien av Velg="$QueryFilterFieldName"/> <XSL:tekst Deaktiver-utdata-unnslippe="ja"><![CDATA[&FilterValue1 =]]></XSL:tekst> <XSL:verdien av Velg="$QueryFilterFieldValue"/> <XSL:tekst Deaktiver-utdata-unnslippe="ja"><![CDATA[">]]></XSL:tekst> <XSL:verdien av Velg="$BarDisplayLabel"/> <XSL:tekst Deaktiver-utdata-unnslippe="ja"><![CDATA[</en>]]></XSL:tekst> <!-- Neste bit viser noen tall i format: "(Totalt / % Total)" --> (<XSL:verdien av Velg="$TotalItems"/> / <!-- Dette skaper en hyggelig prosent etikett for oss. takk, Microsoft! --> <XSL:samtale-mal navn="percentformat"> <XSL:med param navn="prosent" Velg="$BarPercent"/> </XSL:samtale-mal>) </TD> <!-- Endelig, avgir en <TD> kode for bar seg.--> <TD> <tabell CellPadding="0" cellspacing="0" kantlinje="0" bredde="{runde($BarPercent * 100)+1}%"> <tr BgColor="rød"> <XSL:tekst Deaktiver-utdata-unnslippe="ja"><![CDATA[&nbsp;]]></XSL:tekst> </tr> </tabell> </TD> </tr> </XSL:mal> <!-- Dette er hentet direkte fra noen XSL jeg fant i en MS-mal. --> <XSL:mal navn="percentformat"> <XSL:param navn="prosent"/> <XSL:Velg> <XSL:når test="formater tall($prosent, '#,##0%;-#,##0%')= 'NaN'">0%</XSL:når> <XSL:ellers> <XSL:verdien av Velg="formater tall($prosent, '#,##0%;-#,##0%')" /> </XSL:ellers> </XSL:Velg> </XSL:mal> </XSL:stilark>

Resultatene:

XSL ovenfra genererer denne grafen:

bilde

Drille ned til de underliggende dataene ved å klikke på statuskoden:

bilde

Avsluttende tanker:

Dette kan generaliseres?

Jeg elsker dette grafisk konseptet, men jeg hater det faktum at jeg måtte gå inn og gjøre så mye hånd-koding. Jeg har gitt en liten tanke til om det kan generaliseres og jeg optimistisk, men jeg er også litt engstelig at det kan være en murvegg sted langs stien som ikke tilbyr noen arbeide-i nærheten. Hvis noen har noen gode ideer om dette, Vennligst noter i kommentarfeltet eller email meg.

Loddrett grafer:

Dette er et vannrett stolpediagram. Det er sikkert mulig å opprette en loddrett graf. Vi nød rettferdig å endre HTML. Jeg vil starte på samme måte: Opprette en HTML-representasjon av et loddrett stolpediagram og deretter finne ut hvordan å få det via XSL. Hvis noen er interessert i det, Jeg kunne bli overtalt til å prøve den ut og arbeide ut kinks. Hvis noen allerede har gjort det, vennligst gi meg beskjed og jeg vil gjerne link til bloggen din 🙂

Jeg tror at utfordringen med en loddrett graf er at etikettene for grafen er vanskeligere å håndtere, men ikke umulig.

Feltet navn fikser:

Det er to ting å se etter med feltnavnene.

Første, et feltnavn med et mellomrom må være rømte i XSL. Dette vil trolig være et problem her:

        <XSL:variabel navn="totalProposed" 
Velg="antall(/dsQueryResponse/rader/rad[Normalize-plass(@Status) = 'Foreslått'])" />

Hvis statusen"" kolonnen er egentlig benevnt "statuskode" må du referere til den som "Status_x0020_Code":

   <XSL:variabel navn="totalProposed" 
Velg="antall(/dsQueryResponse/rader/rad[Normalize-plass(@Status_x0020_Code) = 'Foreslått'])" />

Andre, og jeg er litt uklar på dette, men du må også være på vakt for feltnavnet endres. Hvis du feltet "statuskode" og senere på, endre navnet til "AFE Status", "interne navn" ikke endre. Det interne navnet vil fortsatt være "statuskode" og må være referert til som "Status_x0020_Code". "Andre ressurser" koblinger kan bidra til å diagnostisere og løse denne type problem.

Om denne fargen:

Jeg plukket "rød" fordi det er behagelig for meg i øyeblikket. Det ville ikke være en stor avtale å vise forskjellige farger for å gi mer enn bare en visuell beskrivelse av et tall, men også gi en nyttig KPI. For eksempel, Hvis prosentandelen av "stoppet" AFES er > 10% Vis det røde, ellers Vis den i svart. Bruk <XSL:Velg> å oppnå dette.

Andre ressurser:

Happy transformere!

<slutten />

Abonner på bloggen min!

Technorati Merkelapper: , , , , , ,

Presentere OM Data Via en egendefinert liste (eller, Ennå en annen Data OM Displayor [som YACC, men forskjellige])

I dag, Jeg tilbrakte en håndfull timer spore opp årsaken bak meldingen "kolonnenavnet du angav er allerede i bruk eller reservert. Velg et annet navn."

Kolonnen i spørsmålet kan opprettes, slettes og opprettes på nytt i et annet miljø, så jeg visste det ikke var et reservert navn. Men, Jeg kunne ikke bare finne kolonnen hvor som helst via standard SharePoint-brukergrensesnittet på alle områder i områdesamlingen.

Jeg postet til MSDN-foraene her og den ukuelig Andrew Woodward pekte meg i retning av de underliggende dataene for objekt-modell.

Jeg gikk til Codeplex å finne noen verktøy som ville hjelpe meg å likemann i de underliggende OM dataene og hjelpe meg finne problemer.

Jeg prøvde flere verktøy og de var veldig kul og interessante, men i slutten, UI var ikke godt nok for mitt formål. Jeg er ikke kritisere dem på noen måte, men klart verktøyet-skaperne hadde ikke mitt problem i tankene når de opprettet sin UI :). Fleste synes å investere en god del tid og krefter i å skape arbeidsstasjon / klientprogrammer som har tre visninger, Høyreklikk sammenheng menyer og så videre. Dette er hyggelig og alle, men det er mye arbeid å lage en top-of-the-line brukeropplevelse som er også svært fleksibel.

Jeg virkelig trengte et svar på dette problemet. Det slo meg som om jeg kunne få alle områdekolonnene i områdesamlingen til en egendefinert liste, Jeg kan filtrere, sortere og opprette visninger som ville hjelpe meg å finne denne angivelig eksisterende kolonne (som det gjorde, BTW). Jeg gikk videre og gjorde det og en time eller to senere, hadde alle mine områdekolonner lastet inn en egendefinert liste med gruppering, sortering og så videre. Jeg fant mitt svar fem minutter senere.

Hvis og når jeg klarer å ta over verden, Jeg tror jeg vil dekret at alle SharePoint verktøy tilbydere må seriøst vurdere overflaten objekt modelldataene i en liste. Sånn, Jeg har makt Hvis du vil søke noen vil måte jeg (begrenset, selvfølgelig, av standard sharepoint-funksjoner).