Kategori Arkiv: SharePoint utveckling

Akta dig bryta ändringar till ItemStyle.xsl

Jag arbetade med ItemStyle.xsl att anpassa utseendet på en webbdelen för innehållsfråga och rätt lunch dags, Jag gjorde en brytande ändra till xsl. Jag visste inte att det, men detta hade långtgående effekterna i hela webbplatssamlingen. Jag gick på lunch och på min återkomst, märkte detta meddelande som visas i en massa platser:

Det går inte att visa den här webbdelen. Felsökning av problemet, Öppna den här sidan i en Windows SharePoint Services-kompatibel HTML-redigerare, till exempel Microsoft Office SharePoint Designer. Om problemet kvarstår, Kontakta webbserveradministratören.

Jag skyllde på klienten (inte insåg ännu att det var mitt fel på denna punkt) men så småningom märkte att visual studio intellisense var varnar mig att jag hade felaktigt XSL. Jag korrigerade det och allt började arbeta.

Vara förbaskad försiktig när du arbetar med ItemStyle.xsl (och någon av de globala XSL-filerna) — bryta dem påverkar många artefakter i webbplatssamlingen.

<slutet />

Visa innehåll Web del frågeresultaten i ett rutnät / Tabell

Översikt och mål

Ur lådan, MOSS’ Webbdelen för innehållsfråga (CQWP) visar resultatet i ett listformat, liknar sökresultat. Det är också möjligt att visa resultaten i ett rutnätsformat (dvs. HTML-tabellformat). Rutnät format är bättre i vissa situationer. Jag beskriva hur man kan uppnå denna effekt i denna artikel.

Affärsscenario

Jag har arbetat med en klient på en företagsomfattande MOSS utbyggnaden. Vi har utformat sina taxonomi så att projekten är första klassens medborgare i hierarkin och har sina egna högsta nivån webbplats. Projektledare upprätthålla en singleton lista över projektsammanfattning, som titel, budget, förväntade slutförandedatum, återstående budget och andra sammanfattningstyp fält. Genom "singleton" Jag menar en anpassad SharePoint-lista garanteras att innehålla endast ett objekt. Något förenklat, Det ser ut så här:

bild

Den tekniska lösningen är ungefär samma som beskrivs Här (http://paulgalvin.spaces.live.com/blog/cns!1CC1EDB3DAA9B8AA!447.entry). CQWP använder en XSL-transformeringen att släppa ut HTML-koden för webbläsaren att göra.

Jag alltid föreställa sig resultatet innan dykning i XSL eftersom XSL är en mardröm. Här är min önskat resultat:

bild

HTML som denna genererar resultatet:

<HTML>
 <organ>
 <Center>
 <tabell gränsen= 1>

<!-- Etiketter-->
 <TR bgcolor= blå>
 <TD><teckensnitt färg= vit><b>Projektets namn</b></teckensnitt></TD>
 <TD justera= höger><teckensnitt färg= vit><b>Komplett datum</b></teckensnitt></TD>
 <TD justera= höger><teckensnitt färg= vit><b>Budget</b></teckensnitt></TD>
 <TD justera= höger><teckensnitt färg= vit><b>Faktiska utgifter</b></teckensnitt></TD>
 <TD><teckensnitt färg= vit><b>Övergripande Status</b></teckensnitt></TD>
 </TR>

<TR>
 <TD>Re-tråd datasal.</TD>
 <TD justera= höger>02/01/08</TD>
 <TD justera= höger>22,500.00</TD>
 <TD justera= höger>19,000.00</TD>
 <TD>Pågående</TD>
 </TR>

<TR>
 <TD>Bestämmelse servrar för SQL-uppgradering</TD>
 <TD justera= höger>04/01/08</TD>
 <TD justera= höger>7,500.00</TD>
 <TD justera= höger>0.00</TD>
 <TD>Planerade</TD>
 </TR>

</tabell>
 </Center>
 </organ>
</HTML>

Tillvägagångssätt

Följ dessa steg för att skapa rutnätet:

  1. Identifiera delarna av nätet (rader/kolumner).
  2. Definiera och skapa nödvändiga webbplatskolumner.
  3. Skapa sub-webbplatser för projekt och singleton listor.
  4. Lägga till CQWP till en webbsida och konfigurera den för att söka efter dina listor.
  5. Ändra den CQWP XML att samla upp ytterligare kolumner.
  6. Ändra XSL för att generera en tabell.

Jag kommer att koncentrera sig på nummer sex. Nummer ett genom fyra är rättfram och något som alla CQWP användare har redan gjort. Nummer fem har varit väl dokumenterade av andra inklusive denna uttömmande skärm-shot lastade artikel från MSDN Här (http://msdn2.microsoft.com/en-us/library/bb897399.aspx) och Heather Solomons blogg Här (http://www.heathersolomon.com/blog/articles/CustomItemStyle.aspx).

Och muttrar

Påbörja och genomföra steg ett till fem per i MSDN-dokumentationen och Heather Solomons artikel.

Vid denna punkt, du har lagt till din CQWP till sidan och du har din <CommonViewFields> konfigurerad som krävs.

Efter de vanliga stegen, Jag får dessa mellanliggande resultat:

1. Skapa en innehållstyp, en mallbaserad anpassad lista för innehållstypen och två platser. Här är innehållstypen:

bild

Här är webbplatsstrukturen:

bild

2. Lägg till CQWP efter att skapa mitt projekt underwebbplatser och singleton projektet Sammanfattning listor:

bild

3. Lägg till alla de kompletteringar som jag vill via den <CommonViewFields>:

        <Egenskapen Namn="CommonViewFields" typ="sträng">Project_x0020_Name;Project_x0020_Expenses;Project_x0020_Status;Project_x0020_Start_x0020_Date;Project_x0020_End_x0020_Date;Project_x0020_Budget</Egenskapen>

Observera att jag var tvungen att hålla alla egenskapsfält på en linje eller det skulle inte fungera (CQWP skulle berätta för mig att frågan returnerade inga träffar).

4. Vid denna punkt, Vi är redo att gå bortom MSDN-artikeln och flip Heather Solomons artikel. Följ hennes steg börjar nära steg #5 skapa en anpassad / unghosted version av ItemStyle.xsl. Jag följa Heathers råd, upp genom steg 11 och få dessa mellanliggande resultat:

4.1: Namnge min XSL-mall som följer:

<XSL:mallens namn = "Grid" matcha = "rad[@Style = "Rutnät"]" läge = "itemstyle">

Jag ändra också något henne föreslog <XSL:för varje …> genom att lägga till en <br /> tag till ger en renare lista:

    <XSL:för varje Välj="@*">
      P:<XSL:värdet av Välj="Namn()" /><br/>
    </XSL:för varje>

4.2: Jag ändra webbdelen, gå till utseende och välja min "Grid" stil:

bild

Applicera ändringen och här är resultatet:

bild

Vi kan se av ovanstående att områdena som vi vill (Projektets namn, bekostnad, status, m.m.) finns tillgängliga för oss att använda när vi släpper ut HTML. Inte bara det, men vi ser namnen som vi måste referera till kolumner i XSL. Till exempel, Vi referera till projektets Status som "Project_x005F_x0020_Name".

Vid denna punkt, Vi avgår från Heathers blogg och dessa jättar axlar, Jag lägger min egen lite.

ContentQueryMain.xsl

ANMÄRKNING: När du gör ändringar i såväl ContentQueryMain.xsl som ItemStyle.xsl, du behöver kontrollera filerna igen innan du ser effekten av dina ändringar.

För grid-making, MOSS använder två olika XSL-filer för att producera resultat vi ser från en CQWP. Att generera den föregående stycke av produktionen, vi ändrade ItemStyle.xsl. MOSS faktiskt använder en annan XSL-fil, ContentQueryMain.xsl att i samband med ItemStyle.xsl att generera de HTML-. Som namnet antyder, ContentQueryMain.xsl är den "viktigaste" XSL som styr det totala flödet av översättning. Det gà ¥ r igenom alla Funna objekt och skickar dem en i taget till mallar i ItemStyle.xsl. Vi ska ändra ItemStyle.xsl för att generera öppen <tabell> tag innan du släpper ut den första raden med data och stängning <tabell> tag efter avger den sista raden. Åstadkomma detta, ContentQueryMain.xsl är modifierad för att skicka två parametrar till våra "grid" mallen i ItemStyle.xsl, "sista raden" och "aktuella raden". ItemStyle.xsl använder dessa villkorligt avge de nödvändiga taggarna.

Med Heather Solomons teknik, Vi hittar ContentQueryMain.xsl. Det är beläget på samma plats som ItemStyle.xsl. Denna skärmdump bör hjälpa:

bild

Vi måste göra följande ändringar:

  • Ändra en xsl-mall, "CallItemTemplate" som åberopar faktiskt vår rutnät mall i ItemStyle.xsl. Vi kommer att skicka två parametrar till mallen rutnät så att det får de uppgifter som den behöver för att generera villkorligt öppning och stängning <tabell> Märken.
  • Ändra en annan bit av ContentQueryMain.xsl som kallar den "CallItemTemplate" att passera en "LastRow" parametern så att LastRow kan överföras till vår rutnät mall.

Leta upp mallen heter "OuterTemplate.CallItemTemplate" identifieras av strängen:

  <XSL:mall Namn="OuterTemplate.CallItemTemplate">

Ersätta hela mallen som följer:

  <XSL:mall Namn="OuterTemplate.CallItemTemplate">
    <XSL:param Namn="CurPosition" />

    <!--
      Lägg till "-LastRow" parametern.
      Vi använder det bara när objekt stil passet i är "Rutnät".
    -->
    <XSL:param Namn="LastRow" />

    <XSL:Välj>
      <XSL:När Testa="@Style = "NewsRollUpItem"">
        <XSL:tillämpa-mallar Välj="." läge="itemstyle">
          <XSL:med-param Namn="EditMode" Välj="$cbq_iseditmode" />
        </XSL:tillämpa-mallar>
      </XSL:När>
      <XSL:När Testa="@Style = "NewsBigItem"">
        <XSL:tillämpa-mallar Välj="." läge="itemstyle">
          <XSL:med-param Namn="CurPos" Välj="$CurPosition" />
        </XSL:tillämpa-mallar>
      </XSL:När>
      <XSL:När Testa="@Style = "NewsCategoryItem"">
        <XSL:tillämpa-mallar Välj="." läge="itemstyle">
          <XSL:med-param Namn="CurPos" Välj="$CurPosition" />
        </XSL:tillämpa-mallar>
      </XSL:När>

      <!--
              Passera nuvarande position och lastrow till Grid itemstyle.xsl mallen.
              ItemStyle.xsl kommer att använda som att släppa ut öppen och stänga <tabell> Märken.
      -->
      <XSL:När Testa="@Style = "Rutnät"">
        <XSL:tillämpa-mallar Välj="." läge="itemstyle">
          <XSL:med-param Namn="CurPos" Välj="$CurPosition" />
          <XSL:med-param Namn="Senaste" Välj="$LastRow" />
        </XSL:tillämpa-mallar>
      </XSL:När>

      <XSL:Annars>
        <XSL:tillämpa-mallar Välj="." läge="itemstyle">
        </XSL:tillämpa-mallar>
      </XSL:Annars>
    </XSL:Välj>
  </XSL:mall>

Kommentarerna beskriva syftet med ändringarna.

Självklart, "OuterTemplate.CallItemTemplate" kallas sig från en annan mall. Leta upp mallen genom att söka efter denna textsträng:

<XSL:mall Namn="OuterTemplate.Body">

Bläddra igenom instruktionerna i OuterTemplate.Body och infoga parametern LastRow som följer (visas som en kommentar i kursiv stil):

<XSL:call-template Namn="OuterTemplate.CallItemTemplate">
  <XSL:med-param Namn="CurPosition" Välj="$CurPosition" />
  <!-- Infoga parametern LastRow. -->
  <XSL:med-param Namn="LastRow" Välj="$LastRow"/>
</XSL:call-template>

Efter allt detta, Vi har äntligen saker korrekt inställt så att våra ItemStyle.xsl kan avge <tabell> Taggar på rätt plats.

ItemStyle.Xsl

ANMÄRKNING: Igen, checka in ItemStyle.xsl efter att göra några ändringar så att du ser effekten av dessa förändringar.

Vi har två uppgifter här:

  • Ersätta hela rutnät mallen. Du kan klistra in underifrån.
  • Lägg till några rappakalja utanför mallens definition som gör "formatcurrency" mall att arbeta. (Du kan berätta att jag har ett svagt handtag på XSL).

Första, nära toppen av ItemStyle.xsl, Lägg till följande rad:

  <!-- Vissa rappakalja som gör det möjligt för oss att visa USA. valuta. -->
  <XSL:decimal-format Namn="personal" siffran="D" />

  <XSL:mall Namn="Standard" match="*" läge="itemstyle">

Obs att jag lagt det direkt innan de <XSL:mallens namn = "förvald" …> definition.

Nästa, gå tillbaka till vår rutnät mall. Ersätta hela rutnät mallen med koden nedan. Det är grundligt kommenterade, men tveka inte att maila mig eller lämna kommentarer på min blogg om du har frågor.

  <XSL:mall Namn="Rutnät" match="Rad[@Style = "Rutnät"]" läge="itemstyle">

    <!--
      ContentMain.xsl passerar CurPos och sista.
      Vi använder dessa villkorligt avge öppen och stänga <tabell> Märken.
    -->
    <XSL:param Namn="CurPos" />
    <XSL:param Namn="Senaste" />

    <!-- Följande variabler är oförändrad från den standard ItemStyle.xsl -->
    <XSL:variabel Namn="SafeImageUrl">
      <XSL:call-template Namn="OuterTemplate.GetSafeStaticUrl">
        <XSL:med-param Namn="UrlColumnName" Välj=""ImageUrl""/>
      </XSL:call-template>
    </XSL:variabel>
    <XSL:variabel Namn="SafeLinkUrl">
      <XSL:call-template Namn="OuterTemplate.GetSafeLink">
        <XSL:med-param Namn="UrlColumnName" Välj=""LinkUrl""/>
      </XSL:call-template>
    </XSL:variabel>
    <XSL:variabel Namn="DisplayTitle">
      <XSL:call-template Namn="OuterTemplate.GetTitle">
        <XSL:med-param Namn="Avdelning" Välj="@Title"/>
        <XSL:med-param Namn="UrlColumnName" Välj=""LinkUrl""/>
      </XSL:call-template>
    </XSL:variabel>
    <XSL:variabel Namn="LinkTarget">
      <XSL:om Testa="@OpenInNewWindow = "True"" >_blank</XSL:om>
    </XSL:variabel>

    <!--
      Här definierar vi en variabel, "tableStart".  Detta innehåller den HTML som vi använder för att definiera öppnandet av tabellen som kolumnetiketterna.  Observera att om CurPos = 1, den innehåller HTML i en CDATA-tagg.
      Annars, Det är tomt.

      Värdet på tableStart är emited varje gång ItemStyle kallas via ContentQueryMain.xsl.
    -->
    <XSL:variabel Namn="tableStart">
      <XSL:om Testa="$CurPos = 1">
        <![CDATA[
        <tabellkantlinjen = 1>
          <TR bgcolor = "blå">
            <TD><font color = "vit"><b>Projektets namn</b></teckensnitt></TD>
            <TD align = "rätt"><font color = "vit"><b>Komplett datum</b></teckensnitt></TD>
            <TD align = "rätt"><font color = "vit"><b>Budget</b></teckensnitt></TD>
            <TD align = "rätt"><font color = "vit"><b>Faktiska utgifter</b></teckensnitt></TD>
            <TD><font color = "vit"><b>Övergripande Status</b></teckensnitt></TD>
          </TR>
        ]]>
      </XSL:om>
    </XSL:variabel>

    <!--
      En annan variabel, tableEnd helt enkelt definierar avslutandet tabell tag.

      Som med tableStart, Det är alltid emited.  Detta är anledningen till dess vไrde tilldelas villkorligt baserat på huruvida vi har antagits den sista raden av ContentQueryMain.xsl.
    -->
    <XSL:variabel Namn="tableEnd">
      <XSL:om Testa="$CurPos = $Last">
        <![CDATA[ </tabell> ]]>
      </XSL:om>
    </XSL:variabel>

    <!--
      Släpper alltid ut innehållet i tableStart.  Om detta inte är den första raden som skickas till oss av ContentQueryMain.xsl, då vi vet sitt värde att vara tom.

      Avaktivera utgång fly eftersom när tableStart det inte tomma, den innehåller faktiska HTML som vi vill ska återges i webbläsaren.  Om vi inte berättar utgång XSL-tolken att avaktivera fly, Det kommer att generera sånt"&LT;tabell&gt;" i stället för"<tabell>".
    -->
    <XSL:värdet av Välj="$tableStart" Inaktivera-utdata-fly="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:värdet av Välj="@Project_x005F_x0020_Name"/>
      </TD>

      <TD justera="rätt">
        <XSL:värdet av Välj="@Project_x005F_x0020_End_x005F_x0020_Date"/>
      </TD>

      <TD justera="rätt">
        <XSL:call-template Namn="FormatCurrency">
          <XSL:med-param Namn="värde" 
Välj="@Project_x005F_x0020_Budget"></XSL:med-param> </XSL:call-template> </TD> <TD justera="rätt"> <XSL:call-template Namn="FormatCurrency"> <XSL:med-param Namn="värde" Välj="@Project_x005F_x0020_Expenses">
</XSL:med-param> </XSL:call-template> </TD> <TD> <XSL:värdet av Välj="@Project_x005F_x0020_Status"/> </TD> <!-- Följande är bortkommenterad förklara saker. Men, föra den tillbaka och sånt det in i en <TD> att se dess effekt. --> <!-- <DIV id = "linkitem" Class = "element"> <XSL:om testa = "stränglängd($SafeImageUrl) != 0"> <div class = "image-området-left"> <ett href = "{$SafeLinkUrl}" Target = "{$LinkTarget}"> <IMG class = "image-fast bredd" src = "{$SafeImageUrl}"
Alt = "{@ImageUrlAltText}"/> </en> </div> </XSL:om> <div class = "länk-objekt"> <XSL:call-template
Name="OuterTemplate.CallPresenceStatusIconTemplate"/> <ett href = "{$SafeLinkUrl}"
Target = "{$LinkTarget}" title = "{@LinkToolTip}"> <XSL:värde-välja = "$DisXSLyTitle" /> </en> <div class = "Beskrivning"> <XSL:värdet av select="@Description" /> </div> </div> </div>
--> </TR> <!-- Avger avslutandet tabell tag. Om vi inte på den sista raden, Detta kommer att vara tom. --> <XSL:värdet av Välj="$tableEnd" Inaktivera-utdata-fly="Ja"/> </XSL:mall> <XSL:mall Namn="FormatCurrency"> <XSL:param Namn="värde" Välj="0" /> <XSL:värdet av Välj='format-nummer($värde, "$DDD,DDD,DDD.DD", "personal")' /> </XSL:mall>

Standard WSS/MOSS Data posten skärmar stöder inte CSS-listrutor (eller andra intra-meddelande)

UPPDATERING (04/2008): Denna stora bloggpost visar en bra javascript-baserade strategi för detta problem: http://webborg.blogspot.com/2008/04/add-functions-and-events-to-sharepoint.html

UPPDATERING II: (04/2008): Denna bloggpost ser lovande ut samt: http://www.cleverworkarounds.com/2008/03/13/free-mosswss-2007-web-part-hide-controls-via-javascript/

Flera gånger i veckan, om inte dagligen, forumanvändare beskriva ett krav som normalt skulle uppfyllas via CSS-listrutor. Till exempel, Jag har två nedrullningsbara kontroller:

  • Lista över amerikanska. staterna
  • Lista över amerikanska. städer.

Som ansvarig UI leverantörer, Vi vill att det ska fungera så här:

  • Paul väljer en U.S. staten från drop-down.
  • Detta orsakar städerna nedrullningsbara att filtrera endast de städer som tillhör det markerade läget.
  • Paul väljer en stad från filtrerade listan.

Det finns inget out-of-the-box stöd för denna funktion. I själva verket, Det finns ingen OOB stöd för någon form av direkt intra-form kommunikation. Detta inkluderar programmässigt gömmer sig/aktivera/inaktivera fält som svar på ändringar i någon annanstans i formuläret.

Det verkliga målet för denna artikel till att beskriva möjliga lösningar och dessa är alternativ jag vet dem:

  1. Utveckla en anpassad kolumntyp. Som custom-kolumn-utvecklare, du har full kontroll över världen"" som den anpassade kolumnen. Du kan implementera en cascading droppa-ned så.
  2. Överväg att använda arbetsflödet. I vissa fall, vill du automatiskt tilldela ett värde till fält baserat på en annan fältvärden. I detta fall, normalt skulle du försöka använda en beräknad kolumn, men några gånger, det inte att bara få jobbet gjort. SharePoint Designer arbetsflöde är en relativt administrera-vänliga alternativ att släppa i koden och visual studio. Om du går den vägen, vara medveten om den fråga som ställdes av denna artikel (http://paulgalvin.spaces.live.com/blog/cns!CC1EDB3DAA9B8AA!405.entry).
  3. Händelsehanterare: Som arbetsflödet, Detta är en efter-the-faktum lösning. Händelsehanteraren är en .NET församling (C#, VB.NET) till vilka SharePoint passerar kontroll. Objektet du utveckla har tillgång till data i listan (och hela objektmodellen) och kan göra alla nödvändiga beräkningar.
  4. Använda SharePoint Designer för att skapa anpassade formulär. Jag har direkt erfarenhet med detta synsätt, but I hear they are doing good things with NewForm.aspx these days 🙂
  5. Rulla dina egna ASP.NET data inresa funktion (som en fristående webbsida eller som en webbdel) och i stället använda som.

Om någon vet andra och bättre alternativ, posta en kommentar och jag ska uppdatera kroppen av detta inlägg.

<slutet />

Technorati Tags:

Skapa stapeldiagram i SharePoint

Översikt:

(UPPDATERING 12/04/07: Lagt till en annan intressant resurs i slutet som länkar till en annan blogg som behandlar detta via en mycket intressant webbdel)

Denna bloggpost beskriver hur du skapar ett diagram i SharePoint. Detta fungerar i både WSS och MOSS miljöer som det bara beror på datavywebbdelen.

Den övergripande strategin är följande:

  1. Skapa en lista eller ett dokumentbibliotek som innehåller de data du vill rita grafer.
  2. Placera tillhörande dokumentbiblioteket / anpassad lista på en sida och konvertera den till en datavywebbdel (DVWP).
  3. Ändra den DVWP XSL för att generera HTML som visas som ett diagram.

Affärsscenario / Setup:

Jag har skapat en anpassad lista med kolumnen standard och en ytterligare kolumn, "Status". Denna modeller (mycket förenklat) "tillstånd för utgift" scenario där titeln representerar projektet och Status ett värde från listan över:

  • Föreslås
  • I processen
  • Avstannat

Målet är att producera ett interaktivt horisontella stapeldiagram som visar dessa statuskoder.

Jag har fylls listan och det ser ut så här:

bild

Skapa datavywebbdelen:

Skapa en DVWP genom att lägga till den anpassade listan till en sida (sida i mitt fall) och följ instruktionerna Här (http://paulgalvin.spaces.live.com/blog/cns!1CC1EDB3DAA9B8AA!395.entry).

Förutom att helt enkelt skapa en DVWP, Vi måste också ange egenskapen personsökning att visa alla tillgängliga rader. För mig, Detta ser ut så här:

bild

Vid denna punkt, Jag stänger alltid SPD och webbläsaren. Jag sedan öppna åter sidan med webbläsaren. Detta undviker misstag mucking upp del Webblayout på sidan.

Ändra XSLT:

Nu är det dags att ändra XSLT.

Jag använda alltid visual studio för detta. (Se Här för en viktig anmärkning om intellisense som kommer hjälpa dig mycket).

Jag skapar ett tomt projekt lägga till fyra nya filer (ersätta orden "Original" och "ny" i förekommande fall):

  • Original.XSLT
  • New.XSLT
  • Ursprungliga Params.xml
  • Nya Params.xml

I mitt fall, Det ser ut så här:

bild

Ändra webbdelen och kopiera params och XSL till det "ursprungliga" version i Visual Studio.

Målet är att orsaka XSL: att omvandla de resultat vi får tillbaka från DVWP frågan till HTML som visas som ett diagram.

I detta syfte, Det bidrar till att först överväga hur HTML-koden ska se ut innan vi blir förvirrade av vansinne som är känd som "XSL". (Att vara tydlig, Följande är bara ett exempel; inte skriva eller klistra in visual studio. Jag ger ett fullt slag som utgångspunkt för att senare på uppskrivning). Följande exempel diagram återges enligt HTML omedelbart efter:

Exempel stapeldiagram

Motsvarande HTML:

<HTML>
<organ>
<Center>
<tabell bredd = 80%>
<TR><TD><Center>Horisontella stapeldiagram</TD></TR>
<TR>
<TD align = "center">
<Table border = "1" bredd = 80%>
<TR>
<TD bredd = 10%>Öppna</TD>
<TD><tabell cellpadding ="0" CellSpacing ="0" border = 0 bredd = 50%><TR bgcolor = röd><TD>&nbsp;</TD></TR></tabell></TD>
</TR>
<TR>
<TD bredd = 10%>Stängt</TD>
<TD><tabell cellpadding ="0" CellSpacing ="0" border = 0 bredd = 25%><TR bgcolor = röd><TD>&nbsp;</TD></TR></tabell></TD>
</TR>
<TR>
<TD bredd = 10%>Avstannat</TD>
<TD><tabell cellpadding ="0" CellSpacing ="0" border = 0 bredd = 25%><TR bgcolor = röd><TD>&nbsp;</TD></TR></tabell></TD>
</TR>
</tabell>
</TD>
</TR>
</tabell>
</organ>
</HTML>

Jag använde en död enkel metod att skapa min barer genom att ange bakgrundsfärgen på en rad i "röd".

Den take-away här är detta: I slutet, allt vi gör är att skapa HTML med rader och kolumner.

Mallen XSLT:

Jag har kopierat den XSLT som genererar ett horisontellt stapeldiagram. Det är ganska väl kommenterade så jag inte kommer lägga mycket här utom dessa anteckningar:

  • Jag började med standard-XSL som SharePoint Designer gav mig när jag först skapade DVWP.
  • Jag kunde skära ner detta från SPD: s 657 linjer för att 166 linjerna.
  • Jag röra inte runt med parametrar XML-filen (som är separat från XSL och du vet vad jag menar när du går till ändra DVWP sig; Det finns två filer kan du ändra). Men, för att förenkla det, Jag tog bort nästan alla av dem från XSL. Detta innebär att om du vill göra använda av dessa parametrar, du behöver bara lägga till deras varierande definitioner tillbaka till XSL. Det blir lätt eftersom du har de ursprungliga XSL varierande definitionerna i din visual studio-projekt.
  • Du borde kunna kopiera och klistra in detta direkt i din visual studio-projekt. Sedan, ta bort mina samtal och sätt dina egna samtal till "ShowBar".
  • Nedrullningen verk genom att skapa en <en href> Gillar det här: http://server/List?FilterField1=fieldname&FilterValue1=actualFilterValue. Denna teknik kan vara av värde i andra sammanhang. Först, Jag trodde jag skulle behöva följa en mer komplex format: http://server/List/AllItems.aspx?View={guid}&FilterField1=blah&FilterValue1=blah, men i min omgivning som inte är nödvändig. Listans URL skickas till oss med SharePoint så detta är ganska lätt att generalisera.

Här är det:

<XSL:Stylesheet version="1.0" Uteslut-resultat-prefix="rs z o s ddwrt dt msxsl" 
xmlns:msxsl="urna:schemas-microsoft-com:XSLT" xmlns:XSL="http://www.w3.org/ 1999/XSL/Transform"
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="urna:schemas-microsoft-com:Office" xmlns:s="UUID:BDC6E3F0-6DA3-11D1-A2A3-00AA00C14882"
xmlns:DT="UUID:C2F41010-65B3 - 11d 1-A29F-00AA00C14882" xmlns:rs="urna:schemas-microsoft-com:raduppsättningen" xmlns:z="#RowsetSchema"
xmlns:ddwrt2="urna:FrontPage:inre"
> <XSL:utgång metoden="HTML" strecksatsen="Nej" /> <XSL:decimal-format NaN="" /> <XSL:param Namn="ListUrlDir"></XSL:param> <!-- Jag behöver detta för att stödja en drill-down. --> <XSL:mall match="/" 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 Namn="dvt_StyleName">Tabell</XSL:variabel> <XSL:variabel Namn="Rader" Välj="/dsQueryResponse/rader/rad" /> <XSL:variabel Namn="dvt_RowCount" Välj="greve($Rader)" /> <XSL:variabel Namn="IsEmpty" Välj="$dvt_RowCount = 0" /> <XSL:variabel Namn="dvt_IsEmpty" Välj="$dvt_RowCount = 0" /> <XSL:Välj> <XSL:När Testa="$dvt_IsEmpty"> Det finns inga data till diagram!<br/> </XSL:När> <XSL:Annars> <!-- De intressanta saker börjar här. Vi behöver definiera ett par variabler för varje rad i grafen: Totalt antal träffar och procent av totala. --> <XSL:variabel Namn="totalProposed" Välj="greve(/dsQueryResponse/rader/rad[normalisera-space(@Status) = "Föreslås"])" /> <XSL:variabel Namn="percentProposed" Välj="$totalProposed div $dvt_RowCount" /> <XSL:variabel Namn="totalInProcess" Välj="greve(/dsQueryResponse/rader/rad[normalisera-space(@Status) = "Pågår"])" /> <XSL:variabel Namn="percentInProcess" Välj="$totalInProcess div $dvt_RowCount" /> <XSL:variabel Namn="totalStalled" Välj="greve(/dsQueryResponse/rader/rad[normalisera-space(@Status) = "Kört fast"])" /> <XSL:variabel Namn="percentStalled" Välj="$totalStalled div $dvt_RowCount" /> <!-- Vi definierar våra HTML-tabellen här. Jag upplåning från några standard SharePoint stilar här att göra det konsekvent. Jag tror att det kommer att hedra ändringar i global css filen samt tema åsidosätter. --> <tabell bredd="100%" CellSpacing="0" CellPadding="2" stil="gränsen-höger: 1 fast #C0C0C0; Border-bottom: 1 fast #C0C0C0; Border-vänster-style: solid; gränsen-vänster-bredd: 1; Border-top-style: solid; Border-top-bredd: 1;"> <TR> <TD justera="Center"> <tabell gränsen="1" bredd="100%"> <!-- För varje status som vi vill diagram, Vi kallar den "ShowBar" mall. Vi passerar det: 1. En etikett för raden. Detta förvandlas till en hyperlänk. 2. Procenten (variabel från ovan). 3. Det faktiska fältnamnet av koden från den underliggande listan. Detta behöver inte matcha visningsetikett. 4. Värdet i fältet matchade för #3. 5. Totala poster i denna statuskod (inte totalsumman av alla statuskoder). Den avger en <TR></TR> och horisontella stapeldiagram linjen. Vi kallar den här mallen för varje statuskod vi vill visa. --> <XSL:call-template Namn="ShowBar"> <XSL:med-param Namn="BarDisplayLabel" Välj=""Föreslås""/> <XSL:med-param Namn="BarPercent" Välj="$percentProposed"/> <XSL:med-param Namn="QueryFilterFieldName" Välj=""Status""/> <XSL:med-param Namn="QueryFilterFieldValue" Välj=""Föreslås""/> <XSL:med-param Namn="TotalItems" Välj="$totalProposed"></XSL:med-param> </XSL:call-template> <XSL:call-template Namn="ShowBar"> <XSL:med-param Namn="BarDisplayLabel" Välj=""Kört fast""/> <XSL:med-param Namn="BarPercent" Välj="$percentStalled"/> <XSL:med-param Namn="QueryFilterFieldName" Välj=""Status""/> <XSL:med-param Namn="QueryFilterFieldValue" Välj=""Kört fast""/> <XSL:med-param Namn="TotalItems" Välj="$totalStalled"></XSL:med-param> </XSL:call-template> <XSL:call-template Namn="ShowBar"> <XSL:med-param Namn="BarDisplayLabel" Välj=""I-processen"/> <XSL:med-param Namn="BarPercent" Välj="$percentInProcess"/> <XSL:med-param Namn="QueryFilterFieldName" Välj=""Status""/> <XSL:med-param Namn="QueryFilterFieldValue" Välj=""I-processen"/> <XSL:med-param Namn="TotalItems" Välj="$totalInProcess"></XSL:med-param> </XSL:call-template> </tabell> </TD> </TR> </tabell> </XSL:Annars> </XSL:Välj> </XSL:mall> <!-- Den här mallen fungerar Visa enskilda rader i stapeldiagrammet. Du kommer förmodligen göra det mesta av din tweaking här. --> <XSL:mall Namn="ShowBar"> <XSL:param Namn="BarDisplayLabel" /> <!-- etikett för att Visa --> <XSL:param Namn="BarPercent"/> <!-- Procent av totala. --> <XSL:param Namn="QueryFilterFieldName"/> <!-- Används för att hoppa till frågan & filtret --> <XSL:param Namn="QueryFilterFieldValue"/> <!-- Används för att hoppa till frågan & filtret --> <XSL:param Namn="TotalItems" /> <!-- Total beräkning av denna barlabel --> <TR> <!-- Bar etikett själv. --> <TD klass="MS-formbody" bredd="30%"> <!-- Denna nästa uppsättning uttalanden bygger en frågesträng som tillåter oss att detaljgranska ned till en filtrerad vy av underliggande data. Vi göra använda av några saker här: 1. Vi kan passera FilterField1 och FilterValue1 till en lista för att filtrera en kolumn. 2. SharePoint passerar en nyckelparameter till oss, ListUrlDir som pekar på den underliggande listan som denna DVWP "kör". Inte XSL-kul? --> <XSL:texten Inaktivera-utdata-fly="Ja"> <![CDATA[<a href ="]]></XSL:texten> <XSL:värdet av Välj="$ListUrlDir"/> <XSL:texten Inaktivera-utdata-fly="Ja"><![CDATA[?FilterField1 =]]></XSL:texten> <XSL:värdet av Välj="$QueryFilterFieldName"/> <XSL:texten Inaktivera-utdata-fly="Ja"><![CDATA[&FilterValue1 =]]></XSL:texten> <XSL:värdet av Välj="$QueryFilterFieldValue"/> <XSL:texten Inaktivera-utdata-fly="Ja"><![CDATA[">]]></XSL:texten> <XSL:värdet av Välj="$BarDisplayLabel"/> <XSL:texten Inaktivera-utdata-fly="Ja"><![CDATA[</en>]]></XSL:texten> <!-- Den nästa bit visar några siffror i formatet: "(totalt / % av den totala)" --> (<XSL:värdet av Välj="$TotalItems"/> / <!-- Detta skapar en fin procent etikett för oss. Tack, Microsoft! --> <XSL:call-template Namn="percentformat"> <XSL:med-param Namn="procent" Välj="$BarPercent"/> </XSL:call-template>) </TD> <!-- Slutligen, avger en <TD> tag för bar sig.--> <TD> <tabell CellPadding="0" CellSpacing="0" gränsen="0" bredd="{runda($BarPercent * 100)+1}%"> <TR bgcolor="röd"> <XSL:texten Inaktivera-utdata-fly="Ja"><![CDATA[&nbsp;]]></XSL:texten> </TR> </tabell> </TD> </TR> </XSL:mall> <!-- Detta tas direkt från vissa XSL som jag hittade i en MS-mall. --> <XSL:mall Namn="percentformat"> <XSL:param Namn="procent"/> <XSL:Välj> <XSL:När Testa="format-nummer($procent, '#,##0%;-#,##0%')= "NaN"">0%</XSL:När> <XSL:Annars> <XSL:värdet av Välj="format-nummer($procent, '#,##0%;-#,##0%')" /> </XSL:Annars> </XSL:Välj> </XSL:mall> </XSL:Stylesheet>

Resultaten:

XSL från ovan genererar denna graf:

bild

Detaljgranska ned till underliggande data genom att klicka på statuskoden:

bild

Avslutande tankar:

Detta kan generaliseras?

Jag älskar detta grafritande koncept, men jag hatar att jag måste gå in och göra så mycket hand-kodning. Jag har gett en liten tanke till huruvida det kan generaliseras och jag är optimistisk, men jag är också lite rädd att det kan finnas en tegelvägg någonstans längs den väg som inte erbjuder någon verk-runt omkring. Om någon har några bra idéer på detta, notera i kommentarerna eller maila mig.

Vertikala diagram:

Detta är ett horisontellt stapeldiagram. Det är säkert möjligt att skapa en lodrät graf. Vi behöver bara ändra HTML. Jag skulle börja på samma sätt: Skapa en HTML-återgivning av en vertikal stapeldiagram och sedan räkna ut hur man få det via XSL. Om någon är intresserad av att, Jag skulle kunna övertalas att prova och träna på kinks. Om någon redan har gjort det, låt mig veta så länkar jag gärna till din blogg 🙂

Jag tror att utmaningen med en vertikal graf är att etiketterna för grafen är svårare att hantera, men absolut inte omöjligt.

Fältet Namn Gotcha:

Det finns åtminstone två saker att se upp för med ditt namn.

Första, ett namn med en utrymme har avbrottstecken i XSL. Detta kommer troligen vara en fråga här:

        <XSL:variabel Namn="totalProposed" 
Välj="greve(/dsQueryResponse/rader/rad[normalisera-space(@Status) = "Föreslås"])" />

Om din "Status" kolumn heter faktiskt "statuskod" då måste du referera till den som "Status_x0020_Code":

   <XSL:variabel Namn="totalProposed" 
Välj="greve(/dsQueryResponse/rader/rad[normalisera-space(@Status_x0020_Code) = "Föreslås"])" />

Andra, och jag är lite otydlig på detta, men du måste också vara på alerten för fältet namn ändras. Om du ger ditt område "statuskod" och senare på, döp om den till "AFE Status", det interna namnet"" ändrar inte. Det interna namnet kommer "statuskod" och måste refereras som "Status_x0020_Code". "Andra resurser" Länkar hjälpa diagnostisera och korrigera denna typ av problem.

Om färgen:

Jag plockade "röd" eftersom det är tilltalande för mig just nu. Det skulle inte vara en stor sak att visa olika färger för att ge mer än bara en visuell beskrivning av ett antal, men att också ge en användbar KPI. Till exempel, om andelen "avstannat" AFES är > 10% då Visa det röda, annars visas det i svart. Användning <XSL:Välj> att uppnå detta.

Andra resurser:

Glad omvandla!

<slutet />

Prenumerera på min blogg!

Technorati Tags: , , , , , ,

Presentera OM Data Via en anpassad lista (eller, Ännu en annan OM Data Displayor [liksom YACC, men olika])

Idag, Jag tillbringade en handfull timmar spåra orsaken bakom meddelandet "kolumnnamnet som du har angett används redan eller reserverade. Välja ett annat namn."

Kolumnen i fråga kunde skapas, tas bort och återskapas i en annan miljö, så jag visste att det inte var ett reserverat namn. Men, Jag inte kunde helt enkelt hitta kolumnen någonstans via standard SharePoint-användargränssnittet alla webbplatser i webbplatssamlingen.

Jag postat till MSDN forum här och den okuvliga Andrew Woodward pekade mig i riktning mot underliggande objekt modelldata.

Jag gick till CodePlex hitta några verktyg som skulle hjälpa mig peer i underliggande OM data och hjälpa mig hitta problem.

Jag försökte flera verktyg och de var väldigt cool och intressant men i slutändan, UI var inte tillräckligt bra för mitt syfte. Jag kritiserar inte dem på något sätt, men klart verktyg-skaparna hade inte mitt problem i åtanke när de skapade sina UI :). De flesta människor tycks vara att investera en hel del tid och kraft på att skapa arbetsstation / klientprogram som ger trädet visningar, Högerklicka på snabbmenyer och så vidare. Detta är trevligt och alla, men det är en hel del arbete att skapa en top-of-the-line användarupplevelse som också är mycket flexibel.

Jag behövde verkligen ett svar på detta problem. Det slog mig att om jag kunde få alla webbplatskolumner i webbplatssamling till en anpassad lista, Jag kunde filtrera, sortera och skapa vyer som skulle hjälpa mig att hitta denna förment befintlig kolumn (vilket den gjorde, BTW). Jag gick vidare och gjorde det och en timme eller två senare, hade alla mina webbplatskolumner laddat in en anpassad lista med gruppering, sortering och så vidare. Jag hittade mitt svar fem minuter senare.

Om och när jag lyckats ta över världen, Jag tror jag kommer dekret att alla SharePoint verktyg leverantörer måste allvarligt överväga beläggningsarbeten deras modell objektdata i en anpassad lista. På så sätt, Jag har makt Om du vill söka någon vill sätt jag (begränsad, Självklart, av standard sharepoint-funktioner).