Categorie Archieven: SharePoint ontwikkeling

Pas op breken veranderingen naar ItemStyle.xsl

Ik werkte met ItemStyle.xsl om het uiterlijk van een webonderdeel Inhoudsquery en recht over lunchtijd aanpassen, Ik maakte een breken wijzigen aan de xsl. Ik wist niet dat het, maar dit had verstrekkende gevolgen in de gehele siteverzameling. Ik ging voor de lunch en bij mijn terugkeer, merkte dit bericht verschijnen in een bos van plaatsen:

Onvermogend voor dit webonderdeel weergeven. U kunt het probleem oplossen, deze webpagina openen in een Windows SharePoint Services-compatibele HTML-editor zoals Microsoft Office SharePoint Designer. Als het probleem aanhoudt, Neem contact op met uw webserverbeheerder.

Ik de schuld van de client (niet realiserend nog dat het was mijn schuld op dit punt) maar uiteindelijk zag dat visuele studio intellisense was waarschuwing mij welk mij had verkeerd ingedeelde XSL. Ik gecorrigeerd en alles begon te werken.

Verdomde voorzichtig bij het werken met ItemStyle.xsl (en een van de wereldwijde XSL-bestanden) — breken ze treft vele artefacten in de siteverzameling.

<einde />

Content Query Web deel resultaten weergegeven in een raster / Tabel

Overzicht en doelstelling

Out of the box, MOSS’ Webonderdeel Inhoudsquery (CQWP) de resultaten worden in een lijstindeling weergegeven, vergelijkbaar met zoekresultaten. Het is ook mogelijk om de resultaten in een grid-formaat weergeven (dwz. HTML-tabelindeling). Raster formaten zijn beter in bepaalde omstandigheden. Beschrijf ik hoe om te bereiken dat effect in dit artikel.

Bedrijfsscenario

Ik heb gewerkt met een cliënt op de uitrol van een ondernemingsbreed MOSS. Wij hebben hun taxonomie ontworpen zodanig dat projecten eerste klassenburgers in de hiërarchie zijn en hun eigen site van het hoogste niveau hebben. Projectmanagers handhaven een singleton lijst van projectsamenvattingsgegevens, zoals de titel van, begroting, verwachte Voltooiingsdatum, resterende begroting en andere velden resumétype. Door "singleton" Ik bedoel een aangepaste SharePoint-lijst gegarandeerd bevatten slechts één item. Simplistisch, het ziet er als volgt:

afbeelding

De technische aanpak is veel hetzelfde als beschreven Hier (http://paulgalvin.spaces.live.com/blog/cns!1CC1EDB3DAA9B8AA!447.entry). De CQWP maakt gebruik van een XSL-transformatie voor het uitzenden van HTML voor de browser weer te geven.

Ik altijd het resultaat voordat duiken in de XSL omdat XSL een nachtmerrie is voor ogen. Hier is mijn gewenste resultaat:

afbeelding

HTML als dit genereert dat resultaat:

<HTML>
 <lichaam>
 <Center>
 <tabel grens= 1>

<!-- Etiketten-->
 <tr bgcolor= blauw>
 <TD><lettertype Kleur= wit><b>Naam van het project</b></lettertype></TD>
 <TD uitlijnen= rechts><lettertype Kleur= wit><b>Datum voltooid</b></lettertype></TD>
 <TD uitlijnen= rechts><lettertype Kleur= wit><b>Begroting</b></lettertype></TD>
 <TD uitlijnen= rechts><lettertype Kleur= wit><b>Werkelijke kosten</b></lettertype></TD>
 <TD><lettertype Kleur= wit><b>Algemene Status</b></lettertype></TD>
 </tr>

<tr>
 <TD>Boren computerlokaal.</TD>
 <TD uitlijnen= rechts>02/01/08</TD>
 <TD uitlijnen= rechts>22,500.00</TD>
 <TD uitlijnen= rechts>19,000.00</TD>
 <TD>In uitvoering</TD>
 </tr>

<tr>
 <TD>Bepaling servers voor SQL Upgrade</TD>
 <TD uitlijnen= rechts>04/01/08</TD>
 <TD uitlijnen= rechts>7,500.00</TD>
 <TD uitlijnen= rechts>0.00</TD>
 <TD>Gepland</TD>
 </tr>

</tabel>
 </Center>
 </lichaam>
</HTML>

Aanpak

Als volgt te werk als u wilt maken het raster:

  1. Identificatie van de bestanddelen van het raster (rijen en kolommen).
  2. Definiëren en maken noodzakelijk sitekolommen.
  3. Maak sub sites voor de projecten en het singleton lijsten.
  4. De CQWP aan een webpagina toevoegen en configureren om te zoeken naar uw lijsten.
  5. De CQWP van XML naar het verzamelen van de aanvullende kolommen wijzigen.
  6. De XSL voor het genereren van een tabel wijzigen.

I 'm gonna concentreren op nummer zes. Getallen tot en met 4 zijn rechttoe-rechtaan en iets dat elke gebruiker CQWP heeft al gedaan. Nummer vijf is goed gedocumenteerd door anderen met inbegrip van dit volledig scherm-schot beladen artikel van MSDN Hier (http://msdn2.microsoft.com/en-us/library/bb897399.aspx) en Heather Solomon's blog Hier (http://www.heathersolomon.com/blog/articles/CustomItemStyle.aspx).

Moeren en bouten

Beginnen en uit te voeren stappen 1 tot en met 5 vanaf de MSDN-documentatie en Heather Solomon artikel.

Op dit punt, u kunt uw CQWP aan de pagina hebt toegevoegd en u hebt uw <CommonViewFields> zo nodig geconfigureerd.

De gebruikelijke stappen uit te voeren, Ik krijg deze tussentijdse resultaten:

1. Een inhoudstype maken, een templatized aangepaste lijst voor dat inhoudstype en twee sites. Hier wordt het type inhoud:

afbeelding

Hier is de structuur van de site:

afbeelding

2. De CQWP na het maken van mijn project subsites en het singleton project samenvatting lijsten toevoegen:

afbeelding

3. Voeg de aanvullende informatie die ik wil via de <CommonViewFields>:

        <eigenschap naam="CommonViewFields" type="tekenreeks">Project_x0020_Name;Project_x0020_Expenses;Project_x0020_Status;Project_x0020_Start_x0020_Date;Project_x0020_End_x0020_Date;Project_x0020_Budget</eigenschap>

Merk op dat ik moest houden de eigenschapsvelden op één lijn of het zou niet werken (CQWP zou vertellen me dat de query heeft geen resultaten opgeleverd).

4. Op dit punt, we klaar om te gaan dan het MSDN-artikel en tik op over Heather Solomon's artikel. Haar stappen beginnen in de buurt van stap #5 een aangepaste maken / unghosted versie van ItemStyle.xsl. Ik volg Heather's advies, door stap omhoog 11 en krijg deze tussentijdse resultaten:

4.1: Mijn XSL-sjabloon als volgt de naam:

<XSL:Sjabloonnaam = "Grid" overeenkomen met = "rij[@Style = 'Raster']" modus = "itemstyle">

Ik wijzigen ook iets haar voorgesteld <XSL:for-each …> door het toevoegen van een <BR /> label voor een schonere:

    <XSL:for-each Selecteer="@*">
      P:<XSL:waarde-van Selecteer="naam()" /><BR/>
    </XSL:for-each>

4.2: Ik wijzigen het webonderdeel, Ga naar uiterlijk en selecteer mijn "Grid" stijl:

afbeelding

De wijziging door te voeren en hier is het resultaat:

afbeelding

Uit het bovenstaande kunnen we zien dat de velden die we willen (Naam van het project, kosten, status, etc) beschikbaar zijn voor ons om te gebruiken wanneer we de HTML-code uitstoten. Niet alleen dat, maar we zien de namen waaraan we moeten verwijzen naar die kolommen in de XSL. Bijvoorbeeld, We verwijzen naar de statusdatum van het Project als "Project_x005F_x0020_Name".

Op dit punt, We vertrekken van Heather's blog en van de schouders van deze reuzen, Ik voeg mijn eigen beetje.

ContentQueryMain.xsl

OPMERKING: Wanneer u wijzigingen aanbrengt aan zowel ContentQueryMain.xsl als ItemStyle.xsl, u moet controleren dat deze bestanden terug in voordat u het effect van uw wijzigingen zien.

Voor doeleinden van het raster maken, MOSS maakt gebruik van twee verschillende XSL-bestanden voor de productie van de resultaten die we van een CQWP zien. Voor het genereren van de vorige bit van output, We bewerkt ItemStyle.xsl. MOSS daadwerkelijk gebruik maakt van een andere XSL-bestand, ContentQueryMain.xsl om in combinatie met ItemStyle.xsl voor het genereren van de HTML-code. Zoals de naam al impliceert, ContentQueryMain.xsl is de belangrijkste"" XSL waarmee de totale stroom van vertaling. Het doorlopen van alle gevonden items en geeft ze één voor één aan sjablonen in ItemStyle.xsl. We zullen wijzigen ItemStyle.xsl voor het genereren van de open <tabel> Label vóór dat de eerste rij van de gegevens en de afronding <tabel> Label na de laatste rij uitstoten. Om dit te bereiken, ContentQueryMain.xsl is aangepast om twee parameters doorgeven aan onze "grid" sjabloon in ItemStyle.xsl, "laatste rij" en "huidige rij". ItemStyle.xsl maakt gebruik van deze voorwaardelijk uitstoten de nodige codes.

Met behulp van Heather Solomon techniek, Wij zoeken ContentQueryMain.xsl. Het is gelegen in de dezelfde plaats als ItemStyle.xsl. Dit schermschot moet helpen:

afbeelding

We moeten de volgende wijzigingen aanbrengen:

  • Een XSL-sjabloon wijzigen, "CallItemTemplate" dat roept eigenlijk onze raster sjabloon in ItemStyle.xsl. We zullen twee parameters doorgeven aan de Grid-sjabloon, zodat het de vereiste gegevens hebben zal voor het genereren van voorwaardelijk openen en sluiten <tabel> Tags.
  • Een ander stukje van ContentQueryMain.xsl waarin de "CallItemTemplate wijzigen" geschiedde het een "LastRow" met de parameter dus dat LastRow kan worden doorgegeven aan onze raster sjabloon.

Zoek de sjabloon met de naam "OuterTemplate.CallItemTemplate" geïdentificeerd door de tekenreeks:

  <XSL:sjabloon naam="OuterTemplate.CallItemTemplate">

De hele sjabloon als volgt vervangen:

  <XSL:sjabloon naam="OuterTemplate.CallItemTemplate">
    <XSL:param naam="CurPosition" />

    <!--
      De "LastRow toevoegen" met de parameter.
      We alleen gebruiken wanneer het item stijl pass in zich "Grid".
    -->
    <XSL:param naam="LastRow" />

    <XSL:Kies>
      <XSL:Wanneer test="@Style = 'NewsRollUpItem'">
        <XSL:apply-templates Selecteer="." modus="itemstyle">
          <XSL:met-param naam="EditMode" Selecteer="$cbq_iseditmode" />
        </XSL:apply-templates>
      </XSL:Wanneer>
      <XSL:Wanneer test="@Style = 'NewsBigItem'">
        <XSL:apply-templates Selecteer="." modus="itemstyle">
          <XSL:met-param naam="CurPos" Selecteer="$CurPosition" />
        </XSL:apply-templates>
      </XSL:Wanneer>
      <XSL:Wanneer test="@Style = 'NewsCategoryItem'">
        <XSL:apply-templates Selecteer="." modus="itemstyle">
          <XSL:met-param naam="CurPos" Selecteer="$CurPosition" />
        </XSL:apply-templates>
      </XSL:Wanneer>

      <!--
              Huidige positie en lastrow doorgeven aan de Grid itemstyle.xsl sjabloon.
              ItemStyle.xsl gebruik dat het uitzenden van de open en sluiten <tabel> Tags.
      -->
      <XSL:Wanneer test="@Style = 'Raster'">
        <XSL:apply-templates Selecteer="." modus="itemstyle">
          <XSL:met-param naam="CurPos" Selecteer="$CurPosition" />
          <XSL:met-param naam="Laatste" Selecteer="$LastRow" />
        </XSL:apply-templates>
      </XSL:Wanneer>

      <XSL:anders>
        <XSL:apply-templates Selecteer="." modus="itemstyle">
        </XSL:apply-templates>
      </XSL:anders>
    </XSL:Kies>
  </XSL:sjabloon>

De opmerkingen beschrijving van het doel van de wijzigingen.

Natuurlijk, de OuterTemplate.CallItemTemplate"" zelf wordt aangeroepen vanuit een andere sjabloon. Die sjabloon vinden door te zoeken naar deze tekenreeks:

<XSL:sjabloon naam="OuterTemplate.Body">

Blader door de instructies in OuterTemplate.Body en de parameter LastRow bijvoegen (weergegeven als een commentaar in cursief):

<XSL:oproep-sjabloon naam="OuterTemplate.CallItemTemplate">
  <XSL:met-param naam="CurPosition" Selecteer="$CurPosition" />
  <!-- De LastRow parameter invoegen. -->
  <XSL:met-param naam="LastRow" Selecteer="$LastRow"/>
</XSL:oproep-sjabloon>

Na dit alles, We hebben eindelijk dingen correct ingesteld zodat onze ItemStyle.xsl kunnen uitstoten <tabel> Tags op de juiste plaats.

ItemStyle.Xsl

OPMERKING: Weer, check in ItemStyle.xsl na wijzigingen zodat u het effect van die wijzigingen zien.

We hebben hier twee taken:

  • Vervang de gehele Grid-sjabloon. U kunt kopiëren/plakken uit de onderstaande lijst.
  • Sommige mumbo jumbo buiten de definitie van de sjabloon waarmee "formatcurrency toevoegen" sjabloon om te werken. (U kunt vertellen dat ik heb een ijle greep op XSL).

Eerste, in de buurt van de top van ItemStyle.xsl, Voeg deze regel toe:

  <!-- Sommige mumbo jumbo waarmee we kunnen U.S weergeven. valuta. -->
  <XSL:decimaal-formaat naam="personeel" cijfers="D" />

  <XSL:sjabloon naam="Standaard" wedstrijd="*" modus="itemstyle">

Opmerking dat ik toegevoegd het direct vóór de <XSL:Sjabloonnaam = "standaard" …> definitie.

Volgende, Ga terug naar onze raster sjabloon. De gehele Grid sjabloon vervangen door de onderstaande code. Het is grondig toegelicht, maar aarzel dan niet om me e-mail of reacties op mijn blog als u vragen hebt.

  <XSL:sjabloon naam="Raster" wedstrijd="Rij[@Style = 'Raster']" modus="itemstyle">

    <!--
      ContentMain.xsl gaat CurPos en laatste.
      We deze gebruiken om voorwaardelijk uitstoten het openen en sluiten <tabel> Tags.
    -->
    <XSL:param naam="CurPos" />
    <XSL:param naam="Laatste" />

    <!-- De volgende variabelen zijn tussentijds niet zijn gewijzigd van de standaard ItemStyle.xsl -->
    <XSL:variabele naam="SafeImageUrl">
      <XSL:oproep-sjabloon naam="OuterTemplate.GetSafeStaticUrl">
        <XSL:met-param naam="UrlColumnName" Selecteer="'ImageUrl'"/>
      </XSL:oproep-sjabloon>
    </XSL:variabele>
    <XSL:variabele naam="SafeLinkUrl">
      <XSL:oproep-sjabloon naam="OuterTemplate.GetSafeLink">
        <XSL:met-param naam="UrlColumnName" Selecteer="'LinkUrl'"/>
      </XSL:oproep-sjabloon>
    </XSL:variabele>
    <XSL:variabele naam="DisplayTitle">
      <XSL:oproep-sjabloon naam="OuterTemplate.GetTitle">
        <XSL:met-param naam="Titel" Selecteer="@Title"/>
        <XSL:met-param naam="UrlColumnName" Selecteer="'LinkUrl'"/>
      </XSL:oproep-sjabloon>
    </XSL:variabele>
    <XSL:variabele naam="LinkTarget">
      <XSL:Als test="@OpenInNewWindow = 'True'" >_blank</XSL:Als>
    </XSL:variabele>

    <!--
      Hier definiëren we een variabele, "tableStart".  Dit bevat de HTML-code die we gebruiken om te definiëren van de opening van de tabel, alsmede de kolomlabels.  Merk op dat als CurPos = 1, het bevat de HTML-code in een CDATA-tag.
      Anders, het is leeg.

      De waarde van tableStart is emited telkens wanneer ItemStyle wordt aangeroepen via ContentQueryMain.xsl.
    -->
    <XSL:variabele naam="tableStart">
      <XSL:Als test="$CurPos = 1">
        <![CDATA[
        <tabelrand = 1>
          <TR bgcolor = "blauw">
            <TD><tekstkleur = "wit"><b>Naam van het project</b></lettertype></TD>
            <TD align = "rechts"><tekstkleur = "wit"><b>Datum voltooid</b></lettertype></TD>
            <TD align = "rechts"><tekstkleur = "wit"><b>Begroting</b></lettertype></TD>
            <TD align = "rechts"><tekstkleur = "wit"><b>Werkelijke kosten</b></lettertype></TD>
            <TD><tekstkleur = "wit"><b>Algemene Status</b></lettertype></TD>
          </tr>
        ]]>
      </XSL:Als>
    </XSL:variabele>

    <!--
      Een andere variabele, tableEnd gewoon definieert de afsluitende tag tabel.

      Zoals met tableStart, het is altijd emited.  Dit is de reden waarom de waarde is toegewezen voorwaardelijk op basis van de vraag of we de laatste rij met ContentQueryMain.xsl heb zijn aangenomen.
    -->
    <XSL:variabele naam="tableEnd">
      <XSL:Als test="$CurPos = $Last">
        <![CDATA[ </tabel> ]]>
      </XSL:Als>
    </XSL:variabele>

    <!--
      Altijd het uitzenden van de inhoud van tableStart.  Als dit niet de eerste rij doorgegeven aan ons door ContentQueryMain.xsl, dan weten we de waarde leeg zal worden.

      Uitschakelen uitvoer ontsnappen omdat wanneer tableStart het niet leeg, Het omvat werkelijke HTML die we willen worden weergegeven door de browser.  Als we niet vertellen uitvoer de XSL-parser uitschakelen ontsnappen, zal het genereren van dingen zoals"&lt;tabel&gt;" in plaats van"<tabel>".
    -->
    <XSL:waarde-van Selecteer="$tableStart" uitschakelen-uitvoer-ontsnappen="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:waarde-van Selecteer="@Project_x005F_x0020_Name"/>
      </TD>

      <TD uitlijnen="recht">
        <XSL:waarde-van Selecteer="@Project_x005F_x0020_End_x005F_x0020_Date"/>
      </TD>

      <TD uitlijnen="recht">
        <XSL:oproep-sjabloon naam="FormatCurrency">
          <XSL:met-param naam="waarde" 
Selecteer="@Project_x005F_x0020_Budget"></XSL:met-param> </XSL:oproep-sjabloon> </TD> <TD uitlijnen="recht"> <XSL:oproep-sjabloon naam="FormatCurrency"> <XSL:met-param naam="waarde" Selecteer="@Project_x005F_x0020_Expenses">
</XSL:met-param> </XSL:oproep-sjabloon> </TD> <TD> <XSL:waarde-van Selecteer="@Project_x005F_x0020_Status"/> </TD> <!-- Alle van de volgende handelingen is uitgecommentarieerd te verduidelijken dingen. Echter, het terug te brengen en dat soort dingen in een <TD> om het effect te zien. --> <!-- <div id = "linkitem" klasse = "post"> <XSL:Als test = "tekenreeks-lengte($SafeImageUrl) != 0 "> <div class = & quoSafeImageUrl-links "> <een href = "{$SafeLinkUrl}" target = "{$LinkTarget}"> <img klasse = "afbeelding-fixed-width" src = "{$SafeImageUrl}"
ALT = "{@ImageUrlAltText}"/> </een> </div> </XSL:Als> <div class = "link-item"> <XSL:oproep-sjabloon
name="OuterTemplate.CallPresenceStatusIconTemplate"/> <een href = "{$SafeLinkUrl}"
target = "{$LinkTarget}" titel = "{@LinkToolTip}"> <XSL:Selecteer waarde-van "$DispXSLTitle" = /> </een> <div class = "omschrijving"> <XSL:waarde-van select="@Description" /> </div> </div> </div>
--> </tr> <!-- Uitstoten de afsluitende tag tabel. Als we niet op de laatste rij, Dit is leeg. --> <XSL:waarde-van Selecteer="$tableEnd" uitschakelen-uitvoer-ontsnappen="Ja"/> </XSL:sjabloon> <XSL:sjabloon naam="FormatCurrency"> <XSL:param naam="waarde" Selecteer="0" /> <XSL:waarde-van Selecteer='getalnotatie($waarde, "$DDD,DDD,DDD.DD", "personeel")' /> </XSL:sjabloon>

Standaard WSS/MOSS gegevens invoerschermen ondersteunen geen trapsgewijze Drop-downs (of andere intra-in de mededeling van)

UPDATE (04/2008): Deze geweldige blog entry toont een goede javascript gebaseerde aanpak van dit probleem: http://webborg.blogspot.com/2008/04/add-functions-and-events-to-sharepoint.html

UPDATE II: (04/2008): Deze blog entry ziet er veelbelovend zo goed: http://www.cleverworkarounds.com/2008/03/13/free-mosswss-2007-web-part-hide-controls-via-javascript/

Meerdere malen per week, Als niet dagelijks, forumgebruikers beschrijven een eis die gewoonlijk zou worden voldaan via trapsgewijze drop-downs. Bijvoorbeeld, Ik heb twee besturingselementen van vervolgkeuzelijst:

  • Lijst van U.S. Staten
  • Lijst van U.S. steden.

Als verantwoordelijk UI aanbieders, We wilt werken als dit:

  • Paul selecteert een U.S. staat uit de drop-down.
  • Dit zorgt ervoor dat de steden vervolgkeuzelijst om te filteren alleen die steden die deel uitmaken van de geselecteerde status.
  • Paul kiest dit gefilterde lijst een stad.

Er is geen out-of-the-box ondersteuning voor deze functie. Eigenlijk, Er is geen OOB ondersteuning voor elk soort directe intra-vorm mededeling. Dit omvat programmatisch verbergen/activeren/deactiveren velden in reactie op veld veranderingen elders op het formulier.

Het echte doel van dit artikel om te beschrijven mogelijke oplossingen en deze zijn de opties aangezien ik ken ze:

  1. Ontwikkelen van een aangepaste kolomtype. Als een aangepaste-kolom-ontwikkelaar, u hebt volledige controle over de wereld"" van die aangepaste kolom. U kunt implementeren een trapsgewijze keuzelijst die manier.
  2. Overweeg het gebruik van de werkstroom. In sommige gevallen, u wilt een waarde automatisch aan veld op basis van de waarde van een ander veld toewijzen. In dit geval, u zou normaal probeert te gebruiken een berekende kolom, maar sommige tijden, het krijgen gewoon niet de klus te klaren. SharePoint Designer workflow is een relatief beheren-vriendelijk alternatief voor het laten vallen naar beneden in de code en visual studio. Als je deze route te gaan, zich bewust zijn van de kwestie die in dit artikel (http://paulgalvin.spaces.live.com/blog/cns!CC1EDB3DAA9B8AA!405.entry).
  3. Gebeurtenis-handlers: Als de werkstroom, Dit is een oplossing na-de-feit. De gebeurtenis-handler is een .NET-assembly (C#, VB.NET) naar welke SharePoint wordt de controle overgedragen. Het object dat u ontwikkelen heeft toegang tot de gegevens van de lijst (en het hele objectmodel) en elke benodigde berekening kunt doen.
  4. SharePoint Designer gebruiken om aangepaste vermelding formulieren te maken. Ik heb geen directe ervaring met deze aanpak, maar ik hoor ze doen goede dingen met NewForm.aspx deze dagen 🙂
  5. Uw eigen ASP.NET-gegevensfunctie vermelding roll (Als een zelfstandige webpagina of als een webonderdeel) en dat in plaats daarvan gebruiken.

Als iemand andere en/of betere opties weet, post een reactie en ik zal updaten de tekst van dit bericht.

<einde />

Technorati Tags:

Bar Grafieken maken in SharePoint

Overzicht:

(UPDATE 12/04/07: Een andere interessante bron toegevoegd aan het einde te koppelen aan een andere blog dat dit via een zeer interessante webonderdeel adressen)

Deze blog entry wordt beschreven hoe u een staafdiagram in SharePoint. Dit werkt in zowel WSS en MOSS omgevingen zoals het hangt alleen af van het webonderdeel voor gegevensweergave.

De algemene aanpak is als volgt:

  1. Maken van een lijst of documentbibliotheek die de gegevens bevat die u wilt grafiek.
  2. Plaats de bijbehorende documentbibliotheek / aangepaste lijst naar een pagina en het omzetten in een webonderdeel voor gegevensweergave (DVWP).
  3. De DVWP de XSL voor het genereren van HTML-code als een grafiek toont wijzigen.

Bedrijfsscenario / Setup:

Ik heb een aangepaste lijst met de standaard titelkolom en één extra kolom, 'Status'. Deze modellen (zeer simplistisch) "vergunning voor kosten" scenario waar de titel het project en de Status van een waarde uit de lijst met vertegenwoordigt:

  • Voorgesteld
  • In proces
  • Vastgelopen

De doelstelling is het produceren van een interactieve horizontale staafgrafiek waarin deze statuscodes.

Ik heb de lijst gevuld en het ziet er als volgt:

afbeelding

Webonderdeel Gegevensweergave maken:

De DVWP door de aangepaste lijst toe te voegen aan een pagina maken (pagina van de site in mijn geval) en volg de instructies Hier (http://paulgalvin.spaces.live.com/blog/cns!1CC1EDB3DAA9B8AA!395.entry).

Naast de DVWP eenvoudig te maken, We moeten ook het wisselbestand instelt zodat alle beschikbare rijen. Voor mij, Dit ziet er iets als dit:

afbeelding

Op dit punt, Ik sluiten altijd EPD en de browser. Ik open vervolgens opnieuw de pagina met behulp van de browser. Dit voorkomt het per ongeluk mucken het web deel lay-out op de pagina.

Het XSLT-bestand wijzigen:

Het is nu tijd om het XSLT-bestand wijzigen.

Ik altijd gebruikt u visual studio hiervoor. (Zie Hier voor een belangrijke opmerking over intellisense die u een hoop helpen zal).

Ik maak een leeg project vier nieuwe bestanden toevoegen (vervangen van de woorden "origineel" en "New" in voorkomend geval):

  • Original.XSLT
  • New.XSLT
  • Originele Params.xml
  • Nieuwe Params.xml

In mijn geval, het ziet er als volgt:

afbeelding

Het webonderdeel wijzigen en kopiëren de params en XSL naar de origineel"" versie in Visual Studio.

Het doel hier is om te veroorzaken de XSL te transformeren de resultaten die we terug uit de query DVWP in HTML maakt als een grafiek.

Te dien einde, het helpt om eerst overwegen hoe de HTML-code eruit moet komen te zien voordat we krijgen verward door de waanzin die bekend als "XSL staat". (Om duidelijk te zijn, het volgende is gewoon een voorbeeld; niet deze typen of kopiëren/plakken in visuele studio. Ik verstrek een volledige slag vertrekpunt voor die verderop in de write-up). De volgende steekproef grafiek wordt weergegeven volgens de HTML-code direct na:

Proef Bar Graph

Overeenkomstige HTML:

<HTML>
<lichaam>
<Center>
<tabel breedte = 80%>
<tr><TD><Center>Horizontale staafgrafiek</TD></tr>
<tr>
<TD align = "center">
<tabelrand = "1" breedte = 80%>
<tr>
<TD breedte = 10%>Open</TD>
<TD><tabel-cellpadding ="0" Cellspacing ="0" border = 0 breedte = 50%><TR bgcolor = rood><TD>&nbsp;</TD></tr></tabel></TD>
</tr>
<tr>
<TD breedte = 10%>Gesloten</TD>
<TD><tabel-cellpadding ="0" Cellspacing ="0" border = 0 breedte = 25%><TR bgcolor = rood><TD>&nbsp;</TD></tr></tabel></TD>
</tr>
<tr>
<TD breedte = 10%>Vastgelopen</TD>
<TD><tabel-cellpadding ="0" Cellspacing ="0" border = 0 breedte = 25%><TR bgcolor = rood><TD>&nbsp;</TD></tr></tabel></TD>
</tr>
</tabel>
</TD>
</tr>
</tabel>
</lichaam>
</HTML>

Ik gebruikte een dode eenvoudig benadering van mijn bars maken door het instellen van de achtergrondkleur van een rij 'Red'.

De take-away hier is dit: In het einde, alles wat we doen is het creëren van HTML met rijen en kolommen.

Sjabloon XSLT:

Ik heb de XSLT die een horizontale staafgrafiek genereert gekopieerd. Het is vrij goed commentaar dus ik zal niet veel hier met uitzondering van deze nota's toevoegen:

  • Ik begon met de standaard XSL die SharePoint Designer gaf me toen ik voor het eerst de DVWP gemaakt.
  • Ik was in staat om te bezuinigen dit uit de SPD 657 lijnen te 166 lijnen.
  • Ik prutsen niet met de parameters XML-bestand (die losstaat van de XSL en je weet wat ik bedoel als je naar de DVWP zelf wijzigen; Er zijn twee bestanden die u kunt wijzigen). Echter, om te vereenvoudigen het, Ik bijna alle van hen verwijderen uit de XSL. Dit betekent dat als je wilt om gebruik van deze parameters, u hoeft hun variabele definities opnieuw toevoegen aan de XSL. Dat zal gemakkelijk zijn aangezien zul je de oorspronkelijke XSL-variabele definities in uw visual studio-project.
  • U moet zitten kundig voor kopieer en plak deze direct in uw visual studio-project. Vervolgens, Verwijder mijn oproepen en plaats uw eigen oproepen naar "ShowBar".
  • De drill down werken door het creëren van een <een href> Als dit: http://server/List?FilterField1=fieldname&FilterValue1=actualFilterValue. Deze techniek kan worden van waarde in andere contexten. Op het eerste, Ik dacht dat ik zou moeten voldoen aan een meer complexe indeling: http://server/List/AllItems.aspx?View={guid}&FilterField1=blah&FilterValue1=blah, maar in mijn omgeving dat is niet nodig. De lijst-URL wordt doorgegeven aan ons door SharePoint dus dit is vrij eenvoudig om te generaliseren.

Hier is het:

<XSL:Stylesheet Versie="1.0" uitsluiten-resultaat-voorvoegsels="RS z o s ddwrt dt msxsl" 
xmlns:msxsl="urn: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="urn:schemas-microsoft-com:Office" xmlns:s="uuid:BDC6E3F0-6DA3-11D1-A2A3-00AA00C14882"
xmlns:DT="uuid:C2F41010-65B3-11 d 1-A29F-00AA00C14882" xmlns:RS="urn:schemas-microsoft-com:rijenset" xmlns:z="#RowsetSchema"
xmlns:ddwrt2="urn:FrontPage:interne"
> <XSL:uitvoer methode="HTML" streepje="niet" /> <XSL:decimaal-formaat NaN="" /> <XSL:param naam="ListUrlDir"></XSL:param> <!-- Mij nood zulks ter ondersteuning van een drill-down. --> <XSL:sjabloon wedstrijd="/" xmlns:SharePoint="Microsoft.SharePoint.WebControls"
xmlns:__designer=http://schemas.microsoft.com/WebParts/v2/DataView/designer xmlns:ASP="http://schemas.Microsoft.com/ASPNET/20"
> <XSL:variabele naam="dvt_StyleName">Tabel</XSL:variabele> <XSL:variabele naam="Rijen" Selecteer="/dsQueryResponse/rijen/rij" /> <XSL:variabele naam="dvt_RowCount" Selecteer="Graaf($Rijen)" /> <XSL:variabele naam="IsEmpty" Selecteer="$dvt_RowCount = 0" /> <XSL:variabele naam="dvt_IsEmpty" Selecteer="$dvt_RowCount = 0" /> <XSL:Kies> <XSL:Wanneer test="$dvt_IsEmpty"> Er zijn geen gegevens aan grafiek!<BR/> </XSL:Wanneer> <XSL:anders> <!-- De interessante dingen begint hier. We moeten definiëren een paar variabelen voor elke rij in de grafiek: totale aantal items en percent van totaal. --> <XSL:variabele naam="totalProposed" Selecteer="Graaf(/dsQueryResponse/rijen/rij[normaliseren-ruimte(@Status) = 'Voorgesteld'])" /> <XSL:variabele naam="percentProposed" Selecteer="$totalProposed div $dvt_RowCount" /> <XSL:variabele naam="totalInProcess" Selecteer="Graaf(/dsQueryResponse/rijen/rij[normaliseren-ruimte(@Status) = 'In proces'])" /> <XSL:variabele naam="percentInProcess" Selecteer="$totalInProcess div $dvt_RowCount" /> <XSL:variabele naam="totalStalled" Selecteer="Graaf(/dsQueryResponse/rijen/rij[normaliseren-ruimte(@Status) = 'Geblokkeerd'])" /> <XSL:variabele naam="percentStalled" Selecteer="$totalStalled div $dvt_RowCount" /> <!-- We definiëren hier onze HTML-tabel. Ik ben lenen van sommige standaard SharePoint stijlen hier om er consistente. Ik denk dat het zal eer wijzigingen in het globale css bestand evenals thema overschrijft. --> <tabel Breedte="100%" Cellspacing="0" cellpadding="2" stijl="grens-recht: 1 Solid # C0C0C0; border-bottom: 1 Solid # C0C0C0; Border-links-style: solide; grens-links-breedte: 1; border-top-style: solide; border-top-width: 1;"> <tr> <TD uitlijnen="Center"> <tabel grens="1" Breedte="100%"> <!-- Voor elke status die we willen grafiek, Wij noemen het "ShowBar" sjabloon. We passeren het: 1. Een label voor de rij. Dit wordt omgezet in een hyperlink. 2. Het percentage (variabele van boven). 3. Het veld werkelijke naam van de code van de onderliggende lijst. Dit hoeft niet overeenkomt met het label weergeven. 4. Veldwaarde afgestemd voor #3. 5. Totale items van deze statuscode (niet het eindtotaal van alle statuscodes). Het straalt een <tr></tr> en de horizontale staafgrafiek lijn. We noemen deze sjabloon voor elke statuscode die we wilt weergeven. --> <XSL:oproep-sjabloon naam="ShowBar"> <XSL:met-param naam="BarDisplayLabel" Selecteer="'Voorgesteld'"/> <XSL:met-param naam="BarPercent" Selecteer="$percentProposed"/> <XSL:met-param naam="QueryFilterFieldName" Selecteer="'Status'"/> <XSL:met-param naam="QueryFilterFieldValue" Selecteer="'Voorgesteld'"/> <XSL:met-param naam="TotalItems" Selecteer="$totalProposed"></XSL:met-param> </XSL:oproep-sjabloon> <XSL:oproep-sjabloon naam="ShowBar"> <XSL:met-param naam="BarDisplayLabel" Selecteer="'Geblokkeerd'"/> <XSL:met-param naam="BarPercent" Selecteer="$percentStalled"/> <XSL:met-param naam="QueryFilterFieldName" Selecteer="'Status'"/> <XSL:met-param naam="QueryFilterFieldValue" Selecteer="'Geblokkeerd'"/> <XSL:met-param naam="TotalItems" Selecteer="$totalStalled"></XSL:met-param> </XSL:oproep-sjabloon> <XSL:oproep-sjabloon naam="ShowBar"> <XSL:met-param naam="BarDisplayLabel" Selecteer="'In proces'"/> <XSL:met-param naam="BarPercent" Selecteer="$percentInProcess"/> <XSL:met-param naam="QueryFilterFieldName" Selecteer="'Status'"/> <XSL:met-param naam="QueryFilterFieldValue" Selecteer="'In proces'"/> <XSL:met-param naam="TotalItems" Selecteer="$totalInProcess"></XSL:met-param> </XSL:oproep-sjabloon> </tabel> </TD> </tr> </tabel> </XSL:anders> </XSL:Kies> </XSL:sjabloon> <!-- Deze sjabloon doet het werk van afzonderlijke regels in het staafdiagram weergeven. U zal waarschijnlijk niet de meeste van uw tweaken hier. --> <XSL:sjabloon naam="ShowBar"> <XSL:param naam="BarDisplayLabel" /> <!-- Label weergeven --> <XSL:param naam="BarPercent"/> <!-- Percentage van totaal. --> <XSL:param naam="QueryFilterFieldName"/> <!-- Gebruikt om de query naar & filter --> <XSL:param naam="QueryFilterFieldValue"/> <!-- Gebruikt om de query naar & filter --> <XSL:param naam="TotalItems" /> <!-- totale telling van dit barlabel --> <tr> <!-- De bar label zelf. --> <TD klasse="MS-formbody" Breedte="30%"> <!-- Deze volgende reeks verklaringen bouwt een queryreeks dat ons toelaat om boor neer aan een gefilterde weergave van de onderliggende gegevens. We maken gebruik van een paar dingen hier: 1. We kunt FilterField1 en FilterValue1 doorgeven aan een lijst te filteren op een kolom. 2. SharePoint is een belangrijke parameter doorgeven aan ons, ListUrlDir die naar de onderliggende lijst waartegen deze DVWP verwijst "draait". Is niet XSL-leuk? --> <XSL:tekst uitschakelen-uitvoer-ontsnappen="Ja"> <![CDATA[<een href ="]]></XSL:tekst> <XSL:waarde-van Selecteer="$ListUrlDir"/> <XSL:tekst uitschakelen-uitvoer-ontsnappen="Ja"><![CDATA[?FilterField1 =]]></XSL:tekst> <XSL:waarde-van Selecteer="$QueryFilterFieldName"/> <XSL:tekst uitschakelen-uitvoer-ontsnappen="Ja"><![CDATA[&FilterValue1 =]]></XSL:tekst> <XSL:waarde-van Selecteer="$QueryFilterFieldValue"/> <XSL:tekst uitschakelen-uitvoer-ontsnappen="Ja"><![CDATA[">]]></XSL:tekst> <XSL:waarde-van Selecteer="$BarDisplayLabel"/> <XSL:tekst uitschakelen-uitvoer-ontsnappen="Ja"><![CDATA[</een>]]></XSL:tekst> <!-- De volgende bits toont enkele getallen in de notatie: "(totaal / % totaal)" --> (<XSL:waarde-van Selecteer="$TotalItems"/> / <!-- Dit creëert een mooie percentage label voor ons. Bedankt, Microsoft! --> <XSL:oproep-sjabloon naam="percentformat"> <XSL:met-param naam="procent" Selecteer="$BarPercent"/> </XSL:oproep-sjabloon>) </TD> <!-- Tot slot, uitstoten een <TD> tag voor de bar zelf.--> <TD> <tabel cellpadding="0" Cellspacing="0" grens="0" Breedte="{ronde($BarPercent * 100)+1}%"> <tr bgcolor="rood"> <XSL:tekst uitschakelen-uitvoer-ontsnappen="Ja"><![CDATA[&nbsp;]]></XSL:tekst> </tr> </tabel> </TD> </tr> </XSL:sjabloon> <!-- Dit is rechtstreeks overgenomen uit sommige XSL ik in een sjabloon MS gevonden. --> <XSL:sjabloon naam="percentformat"> <XSL:param naam="procent"/> <XSL:Kies> <XSL:Wanneer test="getalnotatie($procent, '#,##0%;-#,##0%')= 'NaN'">0%</XSL:Wanneer> <XSL:anders> <XSL:waarde-van Selecteer="getalnotatie($procent, '#,##0%;-#,##0%')" /> </XSL:anders> </XSL:Kies> </XSL:sjabloon> </XSL:Stylesheet>

De resultaten:

De XSL van bovenaf genereert deze grafiek:

afbeelding

Boor neer aan de onderliggende gegevens door te klikken op de statuscode:

afbeelding

Gedachten sluiten:

Dit kan worden gegeneraliseerd?

Ik hou van deze grafische concept, maar ik haat het feit dat ik moet gaan en doen zo veel hand-codering. Ik heb een beetje denken aan of het kan worden gegeneraliseerd gegeven en ik ben optimistisch, maar ik ben ook een beetje bang dat er mogelijk een bakstenen muur ergens langs het pad dat zal niet een werk-around bieden. Als iedereen heeft een aantal goede ideeën op dit, Maak een notitie in de commentaren of e-mail me.

Verticale grafieken:

Dit is een horizontale staafgrafiek. Het is zeker mogelijk een verticale grafiek maken. We moeten alleen de HTML-code wijzigen. Ik zou start op de dezelfde manier: Maak een HTML-weergave van een verticale staafdiagram en vervolgens erachter te komen hoe om die via XSL. Als iemand geïnteresseerd in die is, Ik kan worden overgehaald om uitproberen en werken uit the kinks. Als iemand heeft dat al gedaan, laat het me weten en ik leg graag een link naar uw blog 🙂

Ik denk dat dat de uitdaging met een verticale grafiek is dat de labels voor de grafiek moeilijker zijn te beheren, maar zeker niet onmogelijk.

Veld naam Gotcha's:

Er zijn ten minste twee dingen om uit te kijken voor met uw veldnamen.

Eerste, de naam van een veld met een spatie moet worden ontsnapte in de XSL. Waarschijnlijk zal dit een probleem hier:

        <XSL:variabele naam="totalProposed" 
Selecteer="Graaf(/dsQueryResponse/rijen/rij[normaliseren-ruimte(@Status) = 'Voorgesteld'])" />

Als uw Status"" kolom heet eigenlijk "Status Code" dan moet u verwijzen naar het als "Status_x0020_Code":

   <XSL:variabele naam="totalProposed" 
Selecteer="Graaf(/dsQueryResponse/rijen/rij[normaliseren-ruimte(@ Status_x0020_Code) = 'Voorgesteld'])" />

Tweede, en ik ben een beetje vaag op dit, maar je moet ook op de waarschuwing voor de veldnaam wordt dan gewijzigd. Als u de naam van het veld "Status Code" en later op, Hernoem het naar "AFE Status", de interne naam"" verandert niet. De interne naam zal nog steeds worden "Status Code" en moet worden verwezen als "Status_x0020_Code". De "andere middelen" links kan helpen opsporen en corrigeren van dit soort probleem.

Over die kleur:

Ik pakte "rood" omdat het is prettig voor mij op dit moment. Het zou niet een big deal voor het weergeven van verschillende kleuren zodat er meer dan slechts een visuele beschrijving van een getal, maar ook om een nuttige KPI. Bijvoorbeeld, Als het percentage van de "vastgelopen" AFE van is > 10% dan Toon het rode, anders laten zien in het zwart. Gebruik <XSL:Kies> om dit te bereiken.

Andere bronnen:

Gelukkig transformeren!

<einde />

Abonneren op mijn blog!

Huidige OM gegevens Via een aangepaste lijst (of, Nog een andere OM gegevens Displayor [Als YACC, maar verschillende])

Vandaag, Ik heb een handvol uur opsporen van de oorzaak achter het bericht "de naam van de kolom die u hebt ingevoerd is al in gebruik of voorbehouden. Kies een andere naam."

De kolom in kwestie kan worden gemaakt, verwijderd en opnieuw gemaakt in een andere omgeving, dus ik wist dat het niet een gereserveerde naam. Echter, Gewoon kon ik niet vinden de kolom overal via de standaard SharePoint-gebruikersinterface op elke site in de siteverzameling.

Ik gepost op MSDN forums hier en de ontembare Andrew Woodward wees me in de richting van het onderliggende object modelgegevens.

Ik ging naar codeplex om te zoeken naar enkele tools die me helpen te zou peer in de onderliggende OM gegevens en help me de moeite zoeken.

Ik probeerde verschillende tools en zij waren erg cool en interessant maar in het einde, de UI was goed genoeg voor mijn doel niet. Ik ben niet kritiseren van hen geenszins, maar duidelijk de hulpprogramma-makers niet heb mijn probleem in gedachten wanneer ze hun UI gemaakt :). De meeste mensen lijken te investeren een behoorlijke hoeveelheid tijd en inspanning in het creëren van werkstation / clienttoepassingen die bieden een boom uitzicht, Klik en ga zo maar door met de rechtermuisknop contextmenu 's. Deze zijn leuk en alle, maar wel een heleboel werk te maken van een top-of-the-line gebruikerservaring dat is ook zeer flexibel.

Ik echt nodig een oplossing voor dit probleem. Het kwam aan me dat als ik alle sitekolommen in de siteverzameling in een aangepaste lijst krijgen kon, Ik kan filteren, sorteren en weergaven maken die zou mij helpen vinden deze zogenaamd bestaande kolom (die het deed, BTW). Ik ging door en deed dat en een uur of twee later, had mijn sitekolommen geladen in een aangepaste lijst met grouping, sorteren enzovoort. Mij stichten mijn bescheid vijf minuten later.

Als en wanneer ik met succes over de hele wereld nemen, Ik denk dat ik zal decreet dat alle aanbieders van de hulpmiddelen van de SharePoint serieus moeten overwegen verhardingen hun modelgegevens object in een aangepaste lijst. Op die manier, Ik heb de macht Als u wilt zoeken een wil manier waarop ik (beperkt, Natuurlijk, door standaard sharepoint-functies).