კატეგორია არქივი: SharePoint განვითარების

ფრთხილად უკანასკნელი ცვლილებების ItemStyle.xsl

ვმუშაობდი ItemStyle.xsl სახის სახე ინფორმაციის შეკითხვის ვებ ნაწილი და მარჯვენა შესახებ სადილი დრო, I made a breaking change to the xsl. I didn’t realize it, but this had far reaching effects throughout the site collection. I went off to lunch and upon my return, შენიშნა ამ გზავნილის გამოჩენა რამოდენიმე ადგილები:

შეუძლებელია არ არიან ამ ვებ ნაწილი. იმისათვის, რომ პრობლემების პრობლემა, გახსნა ამ ვებ გვერდზე, Windows SharePoint Services-თავსებადი HTML რედაქტორი, როგორიცაა Microsoft Office SharePoint დიზაინერი. თუ პრობლემა გამეორდება, მიმართეთ თქვენი ვებ სერვერზე ადმინისტრატორს.

I დაადანაშაულა კლიენტს (არ ხვდებიან, ჯერ კიდევ, რომ ეს იყო ჩემი ბრალი, ამ ეტაპზე) but eventually noticed that visual studio intellisense was warning me that I had malformed XSL. I corrected it and everything started working.

იყავით darned ფრთხილად, როდესაც მუშაობა ItemStyle.xsl (და ნებისმიერ გლობალურ XSL ფაილი) — არღვევს მათ გავლენას ახდენს მრავალი ნიმუშებს ამ საიტზე კოლექციაში.

<ბოლოს />

ჩვენების ინფორმაციის შეკითხვის ვებ ნაწილი შედეგები Grid / მაგიდის

მიმოხილვა და მიზანი

იმ ყუთში, Moss’ ინფორმაციის შეკითხვის ვებ ნაწილი (CQWP) მონიტორები მისი შედეგები სიაში ფორმატში, similar to search results. It is also possible to display the results in a grid format (i.e. HTML მაგიდის ფორმატში). Grid formats are better in some circumstances. I describe how to achieve that effect in this article.

ბიზნეს სცენარი

I have worked with a client on an enterprise-wide MOSS rollout. We have designed their taxonomy such that projects are first class citizens in the hierarchy and have their own top level site. Project managers maintain a singleton list of project summary information, როგორიცაა სათაური, ბიუჯეტი, მოსალოდნელია დასრულების თარიღი, remaining budget and other summary type fields. By "singleton" I mean a custom SharePoint list guaranteed to contain only one item. Simplistically, როგორც ჩანს, ამ:

იმიჯი

ტექნიკური მიდგომა ბევრად იგივე, როგორც ეს აღწერილია აქ (http://paulgalvin.spaces.live.com/blog/cns!1CC1EDB3DAA9B8AA!447.entry). The CQWP uses an XSL transform to emit HTML for the browser to render.

I always envision the result before diving into the XSL because XSL is a nightmare. Here’s my desired result:

იმიჯი

HTML მსგავსი ქმნის, რომ შედეგი:

<html>
 <სხეულის>
 <ცენტრი>
 <მაგიდა სასაზღვრო= 1>

<!-- Labels ->
 <tr bgcolor= Blue>
 <td><font ფერი= თეთრი><>პროექტის დასახელება</></font></td>
 <td უერთდებიან= უფლება><font ფერი= თეთრი><>დასრულება თარიღი</></font></td>
 <td უერთდებიან= უფლება><font ფერი= თეთრი><>ბიუჯეტი</></font></td>
 <td უერთდებიან= უფლება><font ფერი= თეთრი><>ფაქტობრივი ხარჯი</></font></td>
 <td><font ფერი= თეთრი><>სრული სტატუსი</></font></td>
 </tr>

<tr>
 <td>ხელახალი მავთულები კომპიუტერული ოთახი.</td>
 <td უერთდებიან= უფლება>02/01/08</td>
 <td უერთდებიან= უფლება>22,500.00</td>
 <td უერთდებიან= უფლება>19,000.00</td>
 <td>გრძელდება</td>
 </tr>

<tr>
 <td>დებულება სერვერებზე SQL განახლება</td>
 <td უერთდებიან= უფლება>04/01/08</td>
 <td უერთდებიან= უფლება>7,500.00</td>
 <td უერთდებიან= უფლება>0.00</td>
 <td>იგეგმება</td>
 </tr>

</მაგიდა>
 </ცენტრი>
 </სხეულის>
</html>

მიდგომა

დაიცავით ამ ნაბიჯებს, რათა შეიქმნას ქსელის:

  1. იდენტიფიცირება კომპონენტების ქსელის (რიგები / სვეტები).
  2. განსაზღვრავს და შექმნას აუცილებელი საიტი სვეტები.
  3. შექმენით ქვე საიტები პროექტები და სინგლეტონი სიები.
  4. დამატება CQWP რომ ვებ გვერდზე და კონფიგურირება მოძიება შენი სიები.
  5. შეცვლა CQWP-ს XML შეგროვება up დამატებითი სვეტები.
  6. შეცვლა XSL წარმოქმნის მაგიდა.

I’m going to concentrate on number six. Numbers one through four are straight-forward and something that any CQWP user has already done. Number five has been well-documented by others including this exhaustive screen-shot laden article from MSDN აქ (http://msdn2.microsoft.com/en-us/library/bb897399.aspx) და Heather სოლომონის წაკითხვა აქ (http://www.heathersolomon.com/blog/articles/CustomItemStyle.aspx).

კაკალი და ჭანჭიკები

დასაწყისი და გადადგას ნაბიჯები, ერთი მეშვეობით ხუთი მიხედვით MSDN დოკუმენტაცია და Heather სოლომონ სტატია.

ამ ეტაპზე, თქვენ დაემატა თქვენს CQWP გვერდზე და თქვენ თქვენი <CommonViewFields> კონფიგურაცია, როგორც საჭიროა.

შემდეგ ჩვეულ ნაბიჯები, მე ამ შუალედური შედეგები:

1. შექმნა ინფორმაციის ტიპი, a templatized custom list for that content type and two sites. Here is the content type:

იმიჯი

აქ არის საიტი სტრუქტურა:

იმიჯი

2. დამატება CQWP შექმნის შემდეგ ჩემი პროექტი subsites და სინგლეტონი პროექტის შემაჯამებელი სიები:

იმიჯი

3. დამატება დამატებითი ინფორმაცია მინდა მეშვეობით <CommonViewFields>:

        <ქონების სახელი="CommonViewFields" ტიპის="სიმებიანი">Project_x0020_Name;Project_x0020_Expenses;Project_x0020_Status;Project_x0020_Start_x0020_Date;Project_x0020_End_x0020_Date;Project_x0020_Budget</ქონების>

შენიშვნა, რომ უნდა შევინარჩუნოთ ყველა ქონების სფეროები ერთ ხაზს, ან საერთოდ არ იმუშავებს (CQWP რომ მითხრა, რომ შეკითხვის დაბრუნდა არ არის პროდუქცია).

4. ამ ეტაპზე, we’re ready to move beyond the MSDN article and flip on over to Heather Solomon’s article. Follow her steps starting near step #5 რათა შეიქმნას ადრინდელს / unghosted version of ItemStyle.xsl. I follow Heather’s advice, მდე მეშვეობით ნაბიჯი 11 და მიიღოს ამ შუალედური შედეგები:

4.1: დაარქვით ჩემს XSL template შემდეგი რედაქციით:

<XSL:template name="Grid" match="Row[@Style=’Grid’]" mode="itemstyle">

მე ასევე ოდნავ შეცვალოს მისი ვარაუდით <XSL:for-თითოეული …> დამატებით <br /> tag უზრუნველყოს სუფთა ჩამონათვალი:

    <XSL:for-თითოეული შერჩევა="@ *">
      P:<XSL:ღირებულების შესახებ შერჩევა="სახელი()" /><br/>
    </XSL:for-თითოეული>

4.2: შევცვალო ვებ ნაწილი, go to appearance and select my "Grid" სტილი:

იმიჯი

მიმართვა ცვლილება და აი, შედეგიც:

იმიჯი

ჩვენ ვხედავთ, ზემოთ რომ სფეროებში ჩვენ გვინდა (პროექტის დასახელება, ხარჯზე, სტატუსი, და ა.შ.) are available for us to use when we emit the HTML. Not only that, but we see the names by which we must reference those columns in the XSL. მაგალითად, we reference Project Status as "Project_x005F_x0020_Name".

ამ ეტაპზე, ჩვენ დატოვება Heather ს ბლოგი და shoulders ამ გიგანტი, მე დამატება ჩემი საკუთარი ცოტა.

ContentQueryMain.xsl

შენიშვნა: როდესაც ცვლილებების ორივე ContentQueryMain.xsl აგრეთვე ItemStyle.xsl, თქვენ უნდა შეამოწმოს იმ ფაილებს უკან ადრე ხედავთ ეფექტი თქვენი ცვლილებები.

იყიდება ქსელის მიღების მიზნით, MOSS uses two different XSL files to produce the results we see from a CQWP. To generate the previous bit of output, we modified ItemStyle.xsl. MOSS actually uses another XSL file, ContentQueryMain.xsl to in conjunction with ItemStyle.xsl to generate its HTML. As its name implies, ContentQueryMain.xsl is the "main" XSL that controls the overall flow of translation. It iterates through all the found items and passes them one by one to templates in ItemStyle.xsl. We’ll modify ItemStyle.xsl to generate the open <მაგიდა> tag ადრე ასხივებენ პირველი რიგის მონაცემები და დახურვის <მაგიდა> tag after emitting the last row. To accomplish this, ContentQueryMain.xsl is modified to pass two parameters to our "grid" template in ItemStyle.xsl, "last row" and "current row". ItemStyle.xsl uses these to conditionally emit the necessary tags.

გამოყენება Heather სოლომონ ტექნიკურად, we locate ContentQueryMain.xsl. It is located in the same place as ItemStyle.xsl. This screen shot should help:

იმიჯი

ჩვენ უნდა მოვახერხოთ, შემდეგი სახის ცვლილებები:

  • შეცვლა XSL template, "CallItemTemplate" that actually invokes our Grid template in ItemStyle.xsl. We will pass two parameters to the Grid template so that it will have the data it needs to conditionally generate opening and closing <მაგიდა> tags.
  • Modify another bit of ContentQueryMain.xsl that calls the "CallItemTemplate" to pass it a "LastRow" პარამეტრების ისე, რომ LastRow შეიძლება გადაეცემა ჩვენი ქსელის შაბლონი.

Locate the template named "OuterTemplate.CallItemTemplate" განსაზღვრული სიმებიანი:

  <XSL:template სახელი="OuterTemplate.CallItemTemplate">

ჩანაცვლება მთელი template შემდეგი რედაქციით:

  <XSL:template სახელი="OuterTemplate.CallItemTemplate">
    <XSL:შეჩერება სახელი="CurPosition" />

    <!--
      Add the "LastRow" პარამეტრების.
      We only use it when the item style pass in is "Grid".
    -->
    <XSL:შეჩერება სახელი="LastRow" />

    <XSL:აირჩიოს>
      <XSL:როდესაც ტესტი="@ სტილი = 'NewsRollUpItem "">
        <XSL:ვრცელდება-თარგები შერჩევა="." რეჟიმი="itemstyle">
          <XSL:with-param სახელი="EditMode" შერჩევა="$cbq_iseditmode" />
        </XSL:ვრცელდება-თარგები>
      </XSL:როდესაც>
      <XSL:როდესაც ტესტი="@ სტილი = 'NewsBigItem "">
        <XSL:ვრცელდება-თარგები შერჩევა="." რეჟიმი="itemstyle">
          <XSL:with-param სახელი="CurPos" შერჩევა="$CurPosition" />
        </XSL:ვრცელდება-თარგები>
      </XSL:როდესაც>
      <XSL:როდესაც ტესტი="@ სტილი = 'NewsCategoryItem "">
        <XSL:ვრცელდება-თარგები შერჩევა="." რეჟიმი="itemstyle">
          <XSL:with-param სახელი="CurPos" შერჩევა="$CurPosition" />
        </XSL:ვრცელდება-თარგები>
      </XSL:როდესაც>

      <!--
              უღელტეხილის მიმდინარე პოზიცია და lastrow to Grid itemstyle.xsl template.
              ItemStyle.xsl გამოიყენებს, რომ გადასცემს ღია და დახურვის <მაგიდა> tags.
      -->
      <XSL:როდესაც ტესტი="@ სტილი = 'Grid "">
        <XSL:ვრცელდება-თარგები შერჩევა="." რეჟიმი="itemstyle">
          <XSL:with-param სახელი="CurPos" შერჩევა="$CurPosition" />
          <XSL:with-param სახელი="ბოლო" შერჩევა="$LastRow" />
        </XSL:ვრცელდება-თარგები>
      </XSL:როდესაც>

      <XSL:წინააღმდეგ შემთხვევაში>
        <XSL:ვრცელდება-თარგები შერჩევა="." რეჟიმი="itemstyle">
        </XSL:ვრცელდება-თარგები>
      </XSL:წინააღმდეგ შემთხვევაში>
    </XSL:აირჩიოს>
  </XSL:template>

კომენტარები აღწერს მიზნით ცვლილებები.

რა თქმა უნდა, the "OuterTemplate.CallItemTemplate" is itself called from another template. Locate that template by searching for this text string:

<XSL:template სახელი="OuterTemplate.Body">

გადახვევა მეშვეობით ინსტრუქციები OuterTemplate.Body და ჩადეთ LastRow პარამეტრების შემდეგი რედაქციით (ნაჩვენებია კომენტარის კურსივით):

<XSL:ზარის template სახელი="OuterTemplate.CallItemTemplate">
  <XSL:with-param სახელი="CurPosition" შერჩევა="$CurPosition" />
  <!-- ჩადეთ LastRow პარამეტრების. -->
  <XSL:with-param სახელი="LastRow" შერჩევა="$LastRow"/>
</XSL:ზარის template>

მას შემდეგ, რაც ეს ყველაფერი, ჩვენ საბოლოოდ არ რამ შეიქმნა სათანადოდ ისე, რომ ჩვენი ItemStyle.xsl შეიძლება გადასცემს <მაგიდა> tags at უფლება ადგილი.

ItemStyle.Xsl

შენიშვნა: ისევ, შემოწმება ItemStyle.xsl მიღების შემდეგ რაიმე ცვლილება ისე, რომ ხედავთ ეფექტი ის ცვლილებები.

ჩვენ გვყავს ორი ამოცანა აქ:

  • Replace the entire Grid template. You can copy/paste from below.
  • Add some mumbo jumbo outside the template definition that enables "formatcurrency" template to work. (თქვენ შეგიძლიათ თქვათ, რომ მე tenuous სახელური XSL).

პირველი, უახლოეს დაბრუნება of ItemStyle.xsl, დაამატოთ ეს ხაზი:

  <!-- ზოგიერთი mumbo jumbo, რომელიც საშუალებას გვაძლევს ცარიელია U.S. ვალუტის. -->
  <XSL:ათობითი ფორმატის სახელი="პერსონალის" ციფრი="D" />

  <XSL:template სახელი="სტანდარტული" ემთხვევა="*" რეჟიმი="itemstyle">

შენიშვნა, რომ მე დასძინა, რომ უშუალოდ <XSL:template name="Default" …> definition.

შემდეგი, go back to our Grid template. Replace the entire Grid template with the code below. It is thoroughly commented, but don’t hesitate to email me or leave comments on my blog if you have questions.

  <XSL:template სახელი="Grid" ემთხვევა="Row[@ სტილი = 'Grid "]" რეჟიმი="itemstyle">

    <!--
      ContentMain.xsl passes CurPos and Last.
      We use these to conditionally emit the open and closing <მაგიდა> tags.
    -->
    <XSL:შეჩერება სახელი="CurPos" />
    <XSL:შეჩერება სახელი="ბოლო" />

    <!-- The following variables are unmodified from the standard ItemStyle.xsl -->
    <XSL:ცვლადი სახელი="SafeImageUrl">
      <XSL:ზარის template სახელი="OuterTemplate.GetSafeStaticUrl">
        <XSL:with-param სახელი="UrlColumnName" შერჩევა="'ImageUrl'"/>
      </XSL:ზარის template>
    </XSL:ცვლადი>
    <XSL:ცვლადი სახელი="SafeLinkUrl">
      <XSL:ზარის template სახელი="OuterTemplate.GetSafeLink">
        <XSL:with-param სახელი="UrlColumnName" შერჩევა="'LinkUrl'"/>
      </XSL:ზარის template>
    </XSL:ცვლადი>
    <XSL:ცვლადი სახელი="DisplayTitle">
      <XSL:ზარის template სახელი="OuterTemplate.GetTitle">
        <XSL:with-param სახელი="სათაური" შერჩევა="@Title"/>
        <XSL:with-param სახელი="UrlColumnName" შერჩევა="'LinkUrl'"/>
      </XSL:ზარის template>
    </XSL:ცვლადი>
    <XSL:ცვლადი სახელი="LinkTarget">
      <XSL:თუ ტესტი="@OpenInNewWindow = 'True'" >_blank</XSL:თუ>
    </XSL:ცვლადი>

    <!--
      Here we define a variable, "tableStart".  This contains the HTML
      that we use to define the opening of the table as well as the column
      labels.  Note that if CurPos = 1, it includes the HTML in a CDATA tag.
      Otherwise, it will be empty.

      The value of tableStart is emited every time ItemStyle is called via
      ContentQueryMain.xsl.
    -->
    <XSL:ცვლადი სახელი="tableStart">
      <XSL:თუ ტესტი="$CurPos = 1">
        <![CDATA[
        <table border=1>
          <tr bgcolor="blue">
            <td><font color="white"><ბ>პროექტის დასახელება</ბ></font></td>
            <td align="right"><font color="white"><ბ>დასრულება თარიღი</ბ></font></td>
            <td align="right"><font color="white"><ბ>ბიუჯეტი</ბ></font></td>
            <td align="right"><font color="white"><ბ>ფაქტობრივი ხარჯი</ბ></font></td>
            <td><font color="white"><ბ>სრული სტატუსი</ბ></font></td>
          </tr>
        ]]>
      </XSL:თუ>
    </XSL:ცვლადი>

    <!--
      Another variable, tableEnd simply defines the closing table tag.

      As with tableStart, it's always emited.  This is why its value is
      assigned conditionally based upon whether we've been passed the last
      row by ContentQueryMain.xsl.
    -->
    <XSL:ცვლადი სახელი="tableEnd">
      <XSL:თუ ტესტი="$CurPos = $Last">
        <![CDATA[ </მაგიდა> ]]>
      </XSL:თუ>
    </XSL:ცვლადი>

    <!--
      Always emit the contents of tableStart.  If this is not the first
      row passed to us by ContentQueryMain.xsl, then we know its value
      will be blank.

      Disable output escaping because when tableStart it not blank, ეს
      .  თუ
      , it will generate
      stuff like "&ლ;მაგიდა&gt;" instead of "<მაგიდა>".
    -->
    <XSL:ღირებულების შესახებ შერჩევა="$tableStart" გაუქმდება და გამოშვების-აფარებს="დიახ"/>


    <tr>
      <!--
      P:Project_x005F_x0020_Name
      :Project_x005F_x0020_End_x005F_x0020_Date
      :Project_x005F_x0020_Budget
      :Project_x005F_x0020_Expenses
      :Project_x005F_x0020_Status
      -->
      <td>
        <XSL:ღირებულების შესახებ შერჩევა="@ Project_x005F_x0020_Name"/>
      </td>

      <td უერთდებიან="უფლება">
        <XSL:ღირებულების შესახებ შერჩევა="@ Project_x005F_x0020_End_x005F_x0020_Date"/>
      </td>

      <td უერთდებიან="უფლება">
        <XSL:ზარის template სახელი="formatcurrency">
          <XSL:with-param სახელი="ღირებულება" 
შერჩევა="@ Project_x005F_x0020_Budget"></XSL:with-param> </XSL:ზარის template> </td> <td უერთდებიან="უფლება"> <XSL:ზარის template სახელი="formatcurrency"> <XSL:with-param სახელი="ღირებულება" შერჩევა="@ Project_x005F_x0020_Expenses">
</XSL:with-param> </XSL:ზარის template> </td> <td> <XSL:ღირებულების შესახებ შერჩევა="@ Project_x005F_x0020_Status"/> </td> <!-- ყველა ქვემოთ კომენტარში აღნიშნავს, რომ ნათელი რამ. თუმცა, მოუტანს მას უკან და პერსონალი მას <td> სანახავად მისი         . --> <!-- <div id="linkitem" class="item"> <XSL:if test="string-length($SafeImageUrl) != 0"> <div class="image-area-left"> <a href="{$SafeLinkUrl}" target="{$LinkTarget}"> <img class="image-fixed-width" src="{$SafeImageUrl}"
alt="{@ ImageUrlAltText}"/> </a> </div> </XSL:თუ> <div class="link-item"> <XSL:ზარის template
name="OuterTemplate.CallPresenceStatusIconTemplate"/> <a href="{$SafeLinkUrl}"
target="{$LinkTarget}" title="{@ LinkToolTip}"> <XSL:value-of select="$DisplayTitle"/> </a> <div class="description"> <XSL:value-of select="@Description" /> </div> </div> </div>
--> </tr> <!-- გადასცემს დახურვის მაგიდა tag. თუ ჩვენ არ ვართ ბოლო ზედიზედ, ეს იქნება ცარიელი. --> <XSL:ღირებულების შესახებ შერჩევა="$tableEnd" გაუქმდება და გამოშვების-აფარებს="დიახ"/> </XSL:template> <XSL:template სახელი="formatcurrency"> <XSL:შეჩერება სახელი="ღირებულება" შერჩევა="0" /> <XSL:ღირებულების შესახებ შერჩევა='ფორმატი ნომერი($ღირებულება, "$DDD,DDD,DDD.DD", "staff")' /> </XSL:template>

სტანდარტული WSS / MOSS მონაცემთა შეყვანის დაფები მხარს არ უჭერს კასკადური Drop ზარალი (ან სხვა შიდა მხრიდან კომუნიკაცია)

განახლების (04/2008): ეს დიდი წაკითხვა შესვლის გვიჩვენებს კარგი javascript დაფუძნებული მიდგომა ამ პრობლემის: http://webborg.blogspot.com/2008/04/add-functions-and-events-to-sharepoint.html

განახლების II: (04/2008): ეს ბლოგი შესვლის გამოიყურება ჰპირდება ასევე: http://www.cleverworkarounds.com/2008/03/13/free-mosswss-2007-web-part-hide-controls-via-javascript/

რამდენიმე კვირაში, თუ არა ყოველდღე, forum users describe a requirement that would normally be met via cascading drop-downs. მაგალითად, მე ორი ჩამოსაშლელი კონტროლი:

  • ჩამონათვალი U.S. ქვეყნების
  • ჩამონათვალი U.S. ქალაქებში.

როგორც პასუხისმგებელი UI პროვაიდერები, ჩვენ გვსურს მუშაობას მსგავსი:

  • პოლ ირჩევს U.S. state from the drop-down.
  • This causes the cities drop-down to filter only those cities that belong to the selected state.
  • პოლ ირჩევს ქალაქის ამ გაფილტრული სია.

There is no out-of-the-box support for this feature. სინამდვილეში, there is no OOB support for any kind of direct intra-form communication. This includes programmatically hiding/enabling/disabling fields in response to field changes elsewhere on the form.

რეალური მიზანი ამ მუხლის აღწერს შესაძლო გადაწყვეტილებების და ეს ვარიანტი, როგორც ვიცი მათ:

  1. Develop a custom column type. As a custom-column-developer, you have full control over the "world" of that custom column. You can implement a cascading drop-down that way.
  2. Consider using workflow. In some cases, you want to automatically assign a value to field based on another field’s value. ამ შემთხვევაში, ჩვეულებრივ ცდილობენ გამოიყენონ გათვლილი სვეტი, მაგრამ ზოგიერთი ჯერ, it just won’t get the job done. SharePoint Designer workflow is a relatively administer-friendly alternative to dropping down into code and visual studio. If you go this route, უნდა იცოდეს საკითხი მიმართა ამ მუხლის (http://paulgalvin.spaces.live.com/blog/cns!CC1EDB3DAA9B8AA!405.entry).
  3. თარიღის ელფოსტის: მომწონს workflow, this is an after-the-fact solution. Your event handler is a .NET assembly (C #, VB.NET) to which SharePoint passes control. The object you develop has access to the data of the list (და მთელი ობიექტი მოდელი) და შეიძლება რაიმე საჭირო გაანგარიშებით.
  4. Use SharePoint Designer to create custom entry forms. I don’t have direct experience with this approach, but I hear they are doing good things with NewForm.aspx these days 🙂
  5. Roll თქვენი ASP.NET მონაცემთა შეყვანის ფუნქცია (როგორც ცალკე ვებ გვერდზე ან როგორც ვებ ნაწილი) და გამოყენება, რომ ნაცვლად.

თუ ვინმეს იცის სხვა და / ან უკეთესი ვარიანტები, გთხოვთ კომენტარის და მე განაახლებს ორგანოს ჩანაწერი.

<ბოლოს />

პროგრამები Tags:

შექმნა ბარი გრაფიკის SharePoint

მიმოხილვა:

(განახლების 12/04/07: დაამატა კიდევ ერთი საინტერესო რესურსი ბოლომდე აკავშირებს კიდევ ერთი დღიურში, რომ ეხება ეს გავლით ძალიან საინტერესო ვებ ნაწილი)

This blog entry describes how to create a bar graph in SharePoint. This works in both WSS and MOSS environments as it only depends upon the data view web part.

საერთო მიდგომა ასეთია:

  1. შექმნა სია ან დოკუმენტის ბიბლიოთეკა, რომელიც შეიცავს მონაცემთა გსურთ გრაფაში.
  2. მოათავსეთ ასოცირებული დოკუმენტის ბიბლიოთეკა / საბაჟო სიაში გადატანა გვერდზე და გარდაქმნას იგი და მონაცემთა ხედი ვებ ნაწილი (DVWP).
  3. შეცვლა DVWP ნახვა XSL გენერირება HTML, რომელიც აჩვენებს, როგორც გრაფაში.

ბიზნეს სცენარი / Setup:

მე შევქმენი საბაჟო სიაში სტანდარტული სათაური სვეტი და ერთი დამატებითი სვეტი, "Status". This models (ძალიან simplistically) an "Authorization For Expense" სცენარი, სადაც ტიტული წარმოადგენს პროექტს და სტატუსი ღირებულება სიიდან:

  • ინიციატივით გამოდის
  • მიმდინარეობს
  • შეფერხდა

მიზანია აწარმოოს ინტერაქტიული ჰორიზონტალური ბარი გრაფაში, რომელიც აჩვენებს ამ სტატუსის კოდები.

მე დასახლებული სიაში და იგი ასე გამოიყურება:

იმიჯი

მონაცემთა ანკეტის ვებ ნაწილი:

შექმნა DVWP დამატებით საბაჟო სიაში გვერდი (საიტი გვერდზე ჩემს შემთხვევაში) და მითითებებს აქ (http://paulgalvin.spaces.live.com/blog/cns!1CC1EDB3DAA9B8AA!395.entry).

გარდა იმისა, რომ უბრალოდ ქმნის DVWP, we also need to set the paging property to show all available rows. ჩემთვის, ამ გამოიყურება მსგავსი რამ:

იმიჯი

ამ ეტაპზე, I always close SPD and the browser. I then re-open the page using the browser. This avoids accidentally mucking up the web part layout on the page.

შეცვლა XSLT:

ეს ახლა შეცვალოს XSLT.

I always use visual studio for this. (აგრეთვე აქ მნიშვნელოვანი შენიშვნა შესახებ Intellisense, რაც ხელს შეუწყობს თქვენ ბევრი).

შევქმნა ცარიელი გარემონტებული ოთხი ახალი ფაილი (replacing the words "Original" and "New" საჭიროების შემთხვევაში):

  • Original.xslt
  • New.xslt
  • ორიგინალური Params.xml
  • ახალი Params.xml

ჩემს შემთხვევაში, როგორც ჩანს, ამ:

იმიჯი

Modify the web part and copy the params and XSL to the "Original" მობილური ვიზუალური სტუდია.

ობიექტური აქ გამოიწვიოს XSL ტრანსფორმაციის შედეგები არ მივიღებთ უკან DVWP შეკითხვის შევიდა HTML, რომ უწევს როგორც გრაფაში.

ამ მიზნით, it helps to first consider what the HTML should look like before we get confused by the insanity that is known as "XSL". (იმისათვის რომ ნათელი, შემდეგ უბრალოდ მაგალითი; don’t type it or copy/paste into visual studio. I provide a full blow starting point for that later in the write-up). The following sample graph is rendered as per the HTML immediately following:

Sample Bar Graph

შესაბამისი HTML:

<html>
<სხეულის>
<ცენტრი>
<მაგიდა ტელეკომპანია 80%>
<tr><td><ცენტრი>ჰორიზონტალური ბარი დიაგრამა</td></tr>
<tr>
<td align="center">
<table border="1" ტელეკომპანია 80%>
<tr>
<td width = 10%>გახსნა</td>
<td><მაგიდა cellpadding ="0" cellspacing ="0" border = 0 width = 50%><tr bgcolor = red><td>&nbsp;</td></tr></მაგიდა></td>
</tr>
<tr>
<td width = 10%>დახურვის</td>
<td><მაგიდა cellpadding ="0" cellspacing ="0" border = 0 width = 25%><tr bgcolor = red><td>&nbsp;</td></tr></მაგიდა></td>
</tr>
<tr>
<td width = 10%>შეფერხდა</td>
<td><მაგიდა cellpadding ="0" cellspacing ="0" border = 0 width = 25%><tr bgcolor = red><td>&nbsp;</td></tr></მაგიდა></td>
</tr>
</მაგიდა>
</td>
</tr>
</მაგიდა>
</სხეულის>
</html>

I used a dead simple approach to creating my bars by setting the background color of a row to "red".

მიიღოს-მოშორებით აქ არის ეს: და ბოლოს, ყველა ვაკეთებთ ქმნის HTML ერთად რიგები და სვეტები.

თარგი XSLT:

I’ve copied the XSLT that generates a horizontal bar graph. It’s fairly well commented so I won’t add much here except for these notes:

  • I დაიწყო სტანდარტულ XSL, რომ SharePoint დიზაინერი მომცა, როდესაც მე პირველად შეიქმნა DVWP.
  • მე შეძლო დაჭრა ეს ქვემოთ SPD-ს 657 ხაზები 166 lines.
  • მე არ არეულობას გარშემო პარამეტრების ფაილში (რაც ცალკე XSL და თქვენ იცით რას ვგულისხმობ, როცა წასვლა ცვლილებები DVWP თავად; არსებობს ორი ფაილი თქვენ შეგიძლიათ). თუმცა, გამარტივების მიზნით იგი, I did remove nearly all of them from the XSL. This means that if you want to make use of those parameters, you just need to add their variable definitions back to the XSL. That will be easy since you will have the original XSL variable definitions in your visual studio project.
  • You ought to be able to copy and paste this directly into your visual studio project. მაშინ, remove my calls and insert your own calls to "ShowBar".
  • საბურღი ქვემოთ მუშაობს შექმნით <კონფერენცია> მსგავსი: http://server/List?FilterField1=fieldname&FilterValue1=actualFilterValue. This technique may be of value in other contexts. თავიდან, ვფიქრობდი უნდა შეესაბამებოდეს უფრო რთული ფორმატში: http://server/List/AllItems.aspx?View={guid}&FilterField1=blah&FilterValue1=blah, but in my environment that is not necessary. The List’s URL is passed to us by SharePoint so this is quite easy to generalize.

აქ:

<XSL:სტილების მობილური="1.0" გამორიცხავს-შედეგზე ინდექსები="რს ჩ o s ddwrt dt msxsl" 
xmlns:msxsl="urn:სქემები-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:ვერხვი="http://schemas.microsoft.com/ASPNET/20" xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime"
xmlns:o="urn:სქემები-microsoft-com:ოფისში" xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"
xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:რს="urn:სქემები-microsoft-com:rowset" xmlns:ჩ="#RowsetSchema"
xmlns:ddwrt2="urn:ფორუმი:შიდა"
> <XSL:გამომავალი მეთოდი="html" აბზაცის="წლის" /> <XSL:ათობითი ფორმატის NaN="" /> <XSL:შეჩერება სახელი="ListUrlDir"></XSL:შეჩერება> <!-- მე უნდა ამ მხარდასაჭერად საბურღი-down. --> <XSL:template ემთხვევა="/" xmlns:SharePoint="Microsoft.SharePoint.WebControls"
xmlns:__designer=http://schemas.microsoft.com/WebParts/v2/DataView/designer xmlns:ვერხვი="http://schemas.microsoft.com/ASPNET/20"
> <XSL:ცვლადი სახელი="dvt_StyleName">მაგიდის</XSL:ცვლადი> <XSL:ცვლადი სახელი="რიგები" შერჩევა="/dsQueryResponse / რიგები / სკანდალი" /> <XSL:ცვლადი სახელი="dvt_RowCount" შერჩევა="ითვლიან($რიგები)" /> <XSL:ცვლადი სახელი="IsEmpty" შერჩევა="$dvt_RowCount = 0" /> <XSL:ცვლადი სახელი="dvt_IsEmpty" შერჩევა="$dvt_RowCount = 0" /> <XSL:აირჩიოს> <XSL:როდესაც ტესტი="$dvt_IsEmpty"> არ არსებობს მონაცემები, რომ გრაფაში!<br/> </XSL:როდესაც> <XSL:წინააღმდეგ შემთხვევაში> <!-- საინტერესო პერსონალის იწყება აქ. ჩვენ უნდა განვსაზღვროთ წყვილი ცვლადების თითოეული ზედიზედ გრაფაში: საერთო რაოდენობა           . --> <XSL:ცვლადი სახელი="totalProposed" შერჩევა="ითვლიან(/dsQueryResponse / რიგები / სკანდალი[ნორმალიზება სივრცე(@ სტატუსი) = 'ინიციატივით გამოდის "])" /> <XSL:ცვლადი სახელი="percentProposed" შერჩევა="$totalProposed div $ dvt_RowCount" /> <XSL:ცვლადი სახელი="totalInProcess" შერჩევა="ითვლიან(/dsQueryResponse / რიგები / სკანდალი[ნორმალიზება სივრცე(@ სტატუსი) = 'მიმდინარეობს "])" /> <XSL:ცვლადი სახელი="percentInProcess" შერჩევა="$totalInProcess div $ dvt_RowCount" /> <XSL:ცვლადი სახელი="totalStalled" შერჩევა="ითვლიან(/dsQueryResponse / რიგები / სკანდალი[ნორმალიზება სივრცე(@ სტატუსი) = 'ჩიხშია "])" /> <XSL:ცვლადი სახელი="percentStalled" შერჩევა="$totalStalled div $ dvt_RowCount" /> <!-- ჩვენ დავაფიქსირეთ ჩვენი HTML მაგიდა აქ. მე სესხების ზოგიერთი სტანდარტული           . მე ვფიქრობ, რომ პატივს მიაგებს           . --> <მაგიდა სიგანე="100%" cellspacing="0" cellpadding="2" სტილი="სასაზღვრო უფლება: 1 მყარი # C0C0C0; სასაზღვრო ბოლოში: 1 მყარი # C0C0C0; სასაზღვრო მარცხენა სტილი: მყარი; სასაზღვრო მარცხენა სიგანე: 1; სასაზღვრო ყველაზე სტილი: მყარი; სასაზღვრო ყველაზე სიგანე: 1;"> <tr> <td უერთდებიან="ცენტრი"> <მაგიდა სასაზღვრო="1" სიგანე="100%"> <!-- ყოველი მდგომარეობა, რომ ჩვენ გვინდა გრაფაში, we call the "ShowBar" template. ჩვენ გაიაროს ეს: 1. Label for ზედიზედ. ეს გადაკეთდა ჰიპერბმულის. 2. პროცენტი (ცვლადი ზემოდან). 3. ფაქტობრივი სფეროში სახელით კოდი ძირითადი სია. ეს                      . 4. საველე ღირებულება შეესაბამება არცერთი for #3. 5. სულ ნივთები ამ სტატუსის კოდი (არ გრანდიოზული საერთო ყველა                      ). ეს emits <tr></tr> და ჰორიზონტალური ბარი გრაფაში ხაზი. ჩვენ მოვუწოდებთ ამ template თითოეული სტატუსი კოდი გვინდა, ნახატის. --> <XSL:ზარის template სახელი="ShowBar"> <XSL:with-param სახელი="BarDisplayLabel" შერჩევა=""შემოთავაზებული""/> <XSL:with-param სახელი="BarPercent" შერჩევა="$percentProposed"/> <XSL:with-param სახელი="QueryFilterFieldName" შერჩევა=""სტატუსი""/> <XSL:with-param სახელი="QueryFilterFieldValue" შერჩევა=""შემოთავაზებული""/> <XSL:with-param სახელი="TotalItems" შერჩევა="$totalProposed"></XSL:with-param> </XSL:ზარის template> <XSL:ზარის template სახელი="ShowBar"> <XSL:with-param სახელი="BarDisplayLabel" შერჩევა=""შეჩერებულია""/> <XSL:with-param სახელი="BarPercent" შერჩევა="$percentStalled"/> <XSL:with-param სახელი="QueryFilterFieldName" შერჩევა=""სტატუსი""/> <XSL:with-param სახელი="QueryFilterFieldValue" შერჩევა=""შეჩერებულია""/> <XSL:with-param სახელი="TotalItems" შერჩევა="$totalStalled"></XSL:with-param> </XSL:ზარის template> <XSL:ზარის template სახელი="ShowBar"> <XSL:with-param სახელი="BarDisplayLabel" შერჩევა=""მიმდინარეობს '"/> <XSL:with-param სახელი="BarPercent" შერჩევა="$percentInProcess"/> <XSL:with-param სახელი="QueryFilterFieldName" შერჩევა=""სტატუსი""/> <XSL:with-param სახელი="QueryFilterFieldValue" შერჩევა=""მიმდინარეობს '"/> <XSL:with-param სახელი="TotalItems" შერჩევა="$totalInProcess"></XSL:with-param> </XSL:ზარის template> </მაგიდა> </td> </tr> </მაგიდა> </XSL:წინააღმდეგ შემთხვევაში> </XSL:აირჩიოს> </XSL:template> <!-- ეს თარგი აკეთებს მუშაობის ჩვენებისას ინდივიდუალური ხაზები ბარი გრაფაში. თქვენ ალბათ ყველაზე თქვენი tweaking აქ. --> <XSL:template სახელი="ShowBar"> <XSL:შეჩერება სახელი="BarDisplayLabel" /> <!-- ეტიკეტების რათა ნახოთ --> <XSL:შეჩერება სახელი="BarPercent"/> <!-- პროცენტი. --> <XSL:შეჩერება სახელი="QueryFilterFieldName"/> <!-- გამოიყენება გადასვლა შეკითხვის & გავფილტროთ --> <XSL:შეჩერება სახელი="QueryFilterFieldValue"/> <!-- გამოიყენება გადასვლა შეკითხვის & გავფილტროთ --> <XSL:შეჩერება სახელი="TotalItems" /> <!-- საერთო რაოდენობა ამ barlabel --> <tr> <!-- ბარი ეტიკეტების თავად. --> <td კლასი="ms-formbody" სიგანე="30%"> <!-- ეს მომდევნო კომპლექტი განცხადებები აშენებს მოთხოვნის სტრიქონი, რომელიც საშუალებას აძლევს           . ჩვენ გამოიყენოს რამდენიმე რამ აქ: 1. ჩვენ შეგვიძლია გაივლის FilterField1 და FilterValue1 to სია, რათა გავფილტროთ წლის სვეტი. 2. SharePoint გადის გასაღები პარამეტრების ჩვენთვის, ListUrlDir that points to the underlying list against which this DVWP is "running". არ არის XSL fun? --> <XSL:ტექსტი გაუქმდება და გამოშვების-აფარებს="დიახ"> <![CDATA[<ტექნიკური კონფერენცია"]]></XSL:ტექსტი> <XSL:ღირებულების შესახებ შერჩევა="$ListUrlDir"/> <XSL:ტექსტი გაუქმდება და გამოშვების-აფარებს="დიახ"><![CDATA[?FilterField1 =]]></XSL:ტექსტი> <XSL:ღირებულების შესახებ შერჩევა="$QueryFilterFieldName"/> <XSL:ტექსტი გაუქმდება და გამოშვების-აფარებს="დიახ"><![CDATA[&FilterValue1 =]]></XSL:ტექსტი> <XSL:ღირებულების შესახებ შერჩევა="$QueryFilterFieldValue"/> <XSL:ტექსტი გაუქმდება და გამოშვების-აფარებს="დიახ"><![CDATA[">]]></XSL:ტექსტი> <XSL:ღირებულების შესახებ შერჩევა="$BarDisplayLabel"/> <XSL:ტექსტი გაუქმდება და გამოშვების-აფარებს="დიახ"><![CDATA[</a>]]></XSL:ტექსტი> <!-- მომდევნო ცოტა ერთგვარი ნომრები ფორმატში: "(სულ / % მთლიანი)" --> (<XSL:ღირებულების შესახებ შერჩევა="$TotalItems"/> / <!-- ეს ქმნის ლამაზი პროცენტის წარწერა ჩვენთვის. მადლობა, Microsoft! --> <XSL:ზარის template სახელი="percentformat"> <XSL:with-param სახელი="პროცენტი" შერჩევა="$BarPercent"/> </XSL:ზარის template>) </td> <!-- და ბოლოს, გადასცემს <td> tag for ბარი თავად.--> <td> <მაგიდა cellpadding="0" cellspacing="0" სასაზღვრო="0" სიგანე="{გარშემო($BarPercent * 100)+1}%"> <tr bgcolor="წითელი"> <XSL:ტექსტი გაუქმდება და გამოშვების-აფარებს="დიახ"><![CDATA[&nbsp;]]></XSL:ტექსტი> </tr> </მაგიდა> </td> </tr> </XSL:template> <!-- ეს არის აღებული უშუალოდ ზოგიერთი XSL I ნაპოვნი MS template. --> <XSL:template სახელი="percentformat"> <XSL:შეჩერება სახელი="პროცენტი"/> <XSL:აირჩიოს> <XSL:როდესაც ტესტი="ფორმატი ნომერი($პროცენტი, "# # # 0%;-#,##0%')= 'NaN "">0%</XSL:როდესაც> <XSL:წინააღმდეგ შემთხვევაში> <XSL:ღირებულების შესახებ შერჩევა="ფორმატი ნომერი($პროცენტი, "# # # 0%;-#,##0%')" /> </XSL:წინააღმდეგ შემთხვევაში> </XSL:აირჩიოს> </XSL:template> </XSL:სტილების>

შედეგები:

XSL ზემოდან წარმოშობს ამ გრაფაში:

იმიჯი

საბურღი ქვემოთ ძირითადი მონაცემები დაჭერით სტატუსი კოდი:

იმიჯი

დასკვნითი ფიქრები:

შეიძლება თუ არა ეს იყოს გენერალიზებული?

მე მიყვარს ეს graphing კონცეფცია, but I hate the fact that I have to go in and do so much hand-coding. I’ve given a little thought to whether it can be generalized and I’m optimistic, but I’m also a little fearful that there may be a brick wall somewhere along the path that won’t offer any work-around. If anyone has some good ideas on this, გთხოვთ აღინიშნა კომენტარი ან მომაწოდეთ.

ვერტიკალური გრაფიკის:

This is a horizontal bar graph. It’s certainly possible to create a vertical graph. We just need to change the HTML. I would start the same way: Create an HTML representation of a vertical bar graph and then figure out how to get that via XSL. If anyone is interested in that, I could be persuaded to try it out and work out the kinks. If someone has already done that, please let me know and I’ll gladly link to your blog 🙂

მე ვფიქრობ, რომ პრობლემას ვერტიკალური გრაფაში არის, რომ ეტიკეტები გრაფაში უფრო ძნელი მართვა, მაგრამ რა თქმა უნდა არა შეუძლებელი.

საველე სახელი GOTCHA ნახვა:

არსებობს მინიმუმ ორი რამ მოსაძებნად გარეთ თქვენი საველე სახელები.

პირველი, a field name with a space has to be escaped in the XSL. This will probably be an issue here:

        <XSL:ცვლადი სახელი="totalProposed" 
შერჩევა="ითვლიან(/dsQueryResponse / რიგები / სკანდალი[ნორმალიზება სივრცე(@ სტატუსი) = 'ინიციატივით გამოდის "])" />

If your "Status" column is actually named "Status Code" then you need to reference it as "Status_x0020_Code":

   <XSL:ცვლადი სახელი="totalProposed" 
შერჩევა="ითვლიან(/dsQueryResponse / რიგები / სკანდალი[ნორმალიზება სივრცე(@ Status_x0020_Code) = 'ინიციატივით გამოდის "])" />

მეორე, და მე ცოტა საეჭვო ამ, but you also need to be on the alert for field name changes. If you name your field "Status Code" და შემდეგ მოგვიანებით, rename it to "AFE Status", the "internal name" does not change. The internal name will still be "Status Code" and must be referenced as "Status_x0020_Code". The "other resources" კავშირები შეიძლება დაეხმაროს დიაგნოსტიკა და შეასწორეთ სახის პრობლემა.

შესახებ, რომ ფერი:

I picked "red" because it’s pleasing to me at the moment. It would not be a big deal to show different colors so as to provide more than just a visual description of a number, but to also provide a useful KPI. მაგალითად, if the percentage of "stalled" AFE-ის არის > 10% შემდეგ აჩვენებს, წითელი, otherwise show it in black. გამოყენება <XSL:აირჩიოს> მიზნის მისაღწევად.

სხვა რესურსები:

ბედნიერი ტრანსფორმირების!

<ბოლოს />

გამოწერა ჩემი დღიური!

დღევანდელი მონაცემებით ვია OM საბაჟო სია (ან, მორიგი OM მონაცემთა Displayor [ისევე როგორც YACC, მაგრამ განსხვავებული])

დღეს, I spent a handful of hours tracking down the root cause behind the message "The column name that you entered is already in use or reserved. Choose another name."

სვეტი შეეძლოთ შეიქმნება, ამოღებულია და ხელახლა შექმნილი კიდევ ერთი გარემოს, so I knew it wasn’t a reserved name. თუმცა, I simply couldn’t find the column anywhere via the standard SharePoint user interface at any site in the site collection.

I posted to MSDN forums here and the indomitable ანდრია ვუდვორდს pointed me in the direction of the underlying object model data.

I went off to codeplex to find some tools that would help me peer into the underlying OM data and help me locate the trouble.

I tried several tools and they were very cool and interesting but in the end, the UI wasn’t good enough for my purpose. I’m not criticizing them by any means, მაგრამ მკაფიოდ ინსტრუმენტი მიმღები პირები არ მაქვს პრობლემა გათვალისწინებით, როდესაც მათ შექმნეს UI :). Most people seem to be investing a fair amount of time and effort in creating workstation / კლიენტს განაცხადების რომელიც უზრუნველყოფს ხე views, right-click context menus and so forth. These are nice and all, მაგრამ ბევრი მუშაობა, რათა შეიქმნას დაბრუნება-of-the-ხაზი მომხმარებლის, გამოცდილება, რომელიც ასევე ძალიან მოქნილი.

მე ნამდვილად საჭიროა პასუხი ამ პრობლემის. ეს მოხდა ჩემთან, რომ თუ მე ვერ ყველა საიტი სვეტის ადგილზე კოლექცია შევიდა საბაჟო სია, მე ვერ გავფილტროთ, დასალაგებლად და შექმნას ჩვენებები, რომელიც დამეხმარება ვინ სავარაუდოდ არსებული სვეტი (რაც ეს მოხდა, BTW). I went ahead and did that and an hour or two later, იყო ყველა ჩემი საიტი სვეტები ჩაიტვირთება საბაჟო სიაში დაჯგუფება, sorting and so forth. I found my answer five minutes later.

თუ და როდესაც მე წარმატებით აღება მსოფლიოში, I think I will decree that all SharePoint tools providers must seriously consider surfacing their object model data in a custom list. That way, მე მაქვს ძალა ამის ძებნას არანაირად მინდა (შეზღუდული, რა თქმა უნდა, სტანდარტული SharePoint თვისებები).