Бар се уште е прилично висок за да се прошири Мос

Денес, I was working with a client and describing how to modify the content query web part and display additional bits of information from a content type.

"First, you configure the CQWP to connect to its data sources, then you export it to your workstation, modify <CommonViewFields>, upload, remove the original and now it’s ‘primed’ to display those other columns. Следна, open up SharePoint designer, navigate to the site collection root and locate ItemStyle.xsl. Copy one of the templates as a useful starting point. Go back and modify the CQWP to make use of this new template. Конечно, modify the template to render your new fields! (Don’t forget to check it back in so that other users can see the results)."

It’s all quite clear to me (and most of us SharePoint developer types) what’s going on and how it’s quite nice, навистина, that the data retrieval aspects of the CQWP are so well-separate from the data presentation aspects. Но, it’s not so easy to explain, is it?

<крај />

Technorati Тагови: ,

Покажи Содржина Пребарување Веб Дел Резултати во мрежа / Табела

Преглед и цел

Надвор од кутијата, Мос’ Содржината Пребарување Веб Дел (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>

<!-- Етикети ->
 <tr bgcolor= Сина>
 <td><фонт боја= Бело><б>Име на проектот</б></фонт></td>
 <td усогласување на= Право><фонт боја= Бело><б>Заврши Датум</б></фонт></td>
 <td усогласување на= Право><фонт боја= Бело><б>Буџет</б></фонт></td>
 <td усогласување на= Право><фонт боја= Бело><б>Крај на трошоците</б></фонт></td>
 <td><фонт боја= Бело><б>Целокупната состојба</б></фонт></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. Креирате под-сајтови за проекти и Singleton листи.
  4. Додадете CQWP на веб страница и конфигурирајте го да пребарувате за вашиот листи.
  5. Менувате XML на CQWP да собере дополнителни колони.
  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) и блог Хедер Соломон тука (http://www.heathersolomon.com/blog/articles/CustomItemStyle.aspx).

Ореви и завртки

Започнете и спроведување чекори едно преку пет, како за на MSDN документација и член Хедер Соломон.

Во овој момент, сте ги додале на вашиот CQWP на страница и имате <CommonViewFields> конфигуриран како што е потребно.

По вообичаените чекори, Јас се добијат овие средно резултати:

1. Креирај типот на содржина, a templatized custom list for that content type and two sites. Here is the content type:

сликата

Тука е сајт структура:

сликата

2. Додадете CQWP по создавањето на мојот проект под-сајтови и Singleton проект резиме листи:

сликата

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 дефиниција како што следува:

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

Јас исто така, малку менувате нејзиниот предложи <XSL:за секој- …> со додавање на <Br /> ознака за да се обезбеди почиста оглас:

    <XSL:за секој- изберете="@ *">
      P:<XSL:вредност на изберете="име()" /><BR/>
    </XSL:за секој->

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".

Во овој момент, ќе заминеме од блог Хедер и од рамениците на овие гиганти, Додадам моето малку.

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 after emitting the last row. To accomplish this, ContentQueryMain.xsl is modified to pass two parameters to our "grid" дефиниција во ItemStyle.xsl, "last row" and "current row". ItemStyle.xsl uses these to conditionally emit the necessary tags.

Користење на техника Хедер Соломон, we locate ContentQueryMain.xsl. It is located in the same place as ItemStyle.xsl. This screen shot should help:

сликата

Ние треба да направите следниве промени:

  • Менување на дефиниција XSL, "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 <маса> тагови.
  • Modify another bit of ContentQueryMain.xsl that calls the "CallItemTemplate" to pass it a "LastRow" параметар, така што LastRow може да се пренесат на нашите Решетка дефиниција.

Locate the template named "OuterTemplate.CallItemTemplate" идентификувани од страна на низа:

  <XSL:дефиниција име="OuterTemplate.CallItemTemplate">

Замени целата дефиниција како што следува:

  <XSL:дефиниција име="OuterTemplate.CallItemTemplate">
    <XSL:престанат име="CurPosition" />

    <!--
      Add the "LastRow" параметар.
      We only use it when the item style pass in is "Grid".
    -->
    <XSL:престанат име="LastRow" />

    <XSL:изберете>
      <XSL:кога тест="@ Style = "NewsRollUpItem"">
        <XSL:применува-шаблони изберете="." владата="itemstyle">
          <XSL:со-Парам име="EditMode" изберете="$cbq_iseditmode" />
        </XSL:применува-шаблони>
      </XSL:кога>
      <XSL:кога тест="@ Style = "NewsBigItem"">
        <XSL:применува-шаблони изберете="." владата="itemstyle">
          <XSL:со-Парам име="CurPos" изберете="$CurPosition" />
        </XSL:применува-шаблони>
      </XSL:кога>
      <XSL:кога тест="@ Style = "NewsCategoryItem"">
        <XSL:применува-шаблони изберете="." владата="itemstyle">
          <XSL:со-Парам име="CurPos" изберете="$CurPosition" />
        </XSL:применува-шаблони>
      </XSL:кога>

      <!--
              Помине моментална позиција и lastrow да Мрежните itemstyle.xsl дефиниција.
              ItemStyle.xsl ќе ја користат таа да се емитуваат на отворено и затворање <маса> тагови.
      -->
      <XSL:кога тест="@ Style = "Мрежа"">
        <XSL:применува-шаблони изберете="." владата="itemstyle">
          <XSL:со-Парам име="CurPos" изберете="$CurPosition" />
          <XSL:со-Парам име="Последно" изберете="$LastRow" />
        </XSL:применува-шаблони>
      </XSL:кога>

      <XSL:во спротивно>
        <XSL:применува-шаблони изберете="." владата="itemstyle">
        </XSL:применува-шаблони>
      </XSL:во спротивно>
    </XSL:изберете>
  </XSL:дефиниција>

Коментари опише целта на промени.

Се разбира, the "OuterTemplate.CallItemTemplate" is itself called from another template. Locate that template by searching for this text string:

<XSL:дефиниција име="OuterTemplate.Body">

Движете се низ инструкциите во OuterTemplate.Body и вметнете ја параметар LastRow како што следува (прикажани како коментар во закосени букви):

<XSL:повик-дефиниција име="OuterTemplate.CallItemTemplate">
  <XSL:со-Парам име="CurPosition" изберете="$CurPosition" />
  <!-- Вметнете ја параметар LastRow. -->
  <XSL:со-Парам име="LastRow" изберете="$LastRow"/>
</XSL:повик-дефиниција>

По сето ова, ние конечно работите се постави правилно, така што нашите ItemStyle.xsl можат да емитуваат <маса> тагови на вистинското место.

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. (Можете да кажете дека имам слаб рачка на XSL).

Прва, во близина на врвот на ItemStyle.xsl, додадете оваа линија:

  <!-- Некои mumbo џамбо што ни овозможува да се прикаже U.S. валута. -->
  <XSL:децимална формат име="персонал" цифрениот="D" />

  <XSL:дефиниција име="Стандардно" одговара="*" владата="itemstyle">

Имајте на ум дека јас се додава непосредно пред <XSL:template name="Default" …> дефиниција.

Следна, go back to our Grid template. Replace the entire Grid template with the code below. It is thoroughly commented, но немојте да се двоумите да ми пишете или оставете коментари на мојот блог, ако имате прашања.

  <XSL:дефиниција име="Решетка" одговара="Ред[@ Style = "Мрежа"]" владата="itemstyle">

    <!--
      ContentMain.xsl поминува CurPos и ​​Последен.
      Ние ги користиме овие да се условно емитуваат на отворено и затворање <маса> тагови.
    -->
    <XSL:престанат име="CurPos" />
    <XSL:престанат име="Последно" />

    <!-- Следниве променливи се немодифицирана од стандардниот ItemStyle.xsl -->
    <XSL:променлива име="SafeImageUrl">
      <XSL:повик-дефиниција име="OuterTemplate.GetSafeStaticUrl">
        <XSL:со-Парам име="UrlColumnName" изберете=""ImageUrl""/>
      </XSL:повик-дефиниција>
    </XSL:променлива>
    <XSL:променлива име="SafeLinkUrl">
      <XSL:повик-дефиниција име="OuterTemplate.GetSafeLink">
        <XSL:со-Парам име="UrlColumnName" изберете=""LinkUrl""/>
      </XSL:повик-дефиниција>
    </XSL:променлива>
    <XSL:променлива име="DisplayTitle">
      <XSL:повик-дефиниција име="OuterTemplate.GetTitle">
        <XSL:со-Парам име="Наслов" изберете="@ Наслов"/>
        <XSL:со-Парам име="UrlColumnName" изберете=""LinkUrl""/>
      </XSL:повик-дефиниција>
    </XSL:променлива>
    <XSL:променлива име="LinkTarget">
      <XSL:ако тест="@ OpenInNewWindow = 'точно'" >_blank</XSL:ако>
    </XSL:променлива>

    <!--
      Еве ние се дефинира променлива, "tableStart".  Таа содржи HTML
      .  Имајте на ум дека ако CurPos = 1, тоа вклучува HTML во таг CDATA.
      Во спротивно, таа ќе биде празна.

      Вредноста на tableStart е emited секој пат ItemStyle се вика преку
      .
    -->
    <XSL:променлива име="tableStart">
      <XSL:ако тест="$CurPos = 1">
        <![CDATA[
        <маса границата = 1>
          <tr bgcolor="blue">
            <td><font color="white"><б>Име на проектот</б></фонт></td>
            <td align="right"><font color="white"><б>Заврши Датум</б></фонт></td>
            <td align="right"><font color="white"><б>Буџет</б></фонт></td>
            <td align="right"><font color="white"><б>Крај на трошоците</б></фонт></td>
            <td><font color="white"><б>Целокупната состојба</б></фонт></td>
          </tr>
        ]]>
      </XSL:ако>
    </XSL:променлива>

    <!--
      Уште една променлива, tableEnd едноставно дефинира затворање табелата таг.

      Како и со tableStart, тоа е секогаш emited.  Ова е причината зошто неговата вредност е
      .
    -->
    <XSL:променлива име="tableEnd">
      <XSL:ако тест="$CurPos = $ Минатата">
        <![CDATA[ </маса> ]]>
      </XSL:ако>
    </XSL:променлива>

    <!--
      Секогаш емитуваат на содржината на tableStart.  Ако ова не е прв
      , тогаш знаеме неговата вредност
      .

      Оневозможи излез избега, бидејќи кога tableStart не го полето празно, тоа
      .  Ако
      , it will generate
      stuff like "&lt;маса&GT;" instead of "<маса>".
    -->
    <XSL:вредност на изберете="$tableStart" disable-излез-бегство="Да"/>


    <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:повик-дефиниција име="formatcurrency">
          <XSL:со-Парам име="вредност" 
изберете="@ Project_x005F_x0020_Budget"></XSL:со-Парам> </XSL:повик-дефиниција> </td> <td усогласување на="право"> <XSL:повик-дефиниција име="formatcurrency"> <XSL:со-Парам име="вредност" изберете="@ Project_x005F_x0020_Expenses">
</XSL:со-Парам> </XSL:повик-дефиниција> </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}"/> </на> </div> </XSL:ако> <div class="link-item"> <XSL:повик-дефиниција
name="OuterTemplate.CallPresenceStatusIconTemplate"/> <a href="{$SafeLinkUrl}"
target="{$LinkTarget}" title="{@ LinkToolTip}"> <XSL:value-of select="$DisplayTitle"/> </на> <div class="description"> <XSL:value-of select="@Description" /> </div> </div> </div>
--> </tr> <!-- Емитуваат на завршната табела таг. Ако ние не сме на последниот ред, ова ќе биде празна. --> <XSL:вредност на изберете="$tableEnd" disable-излез-бегство="Да"/> </XSL:дефиниција> <XSL:дефиниција име="formatcurrency"> <XSL:престанат име="вредност" изберете="0" /> <XSL:вредност на изберете="формат-број($вредност, "$DDD,ДДД,DDD.DD", "staff")" /> </XSL:дефиниција>

Стандард WSS / Мос внес на податоци екрани не поддржуваат Cascading зависници-падови (или други интра-од комуникацијата)

Ажурирање (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. cities.

As responsible UI providers, we want it to operate like this:

  • Paul selects a U.S. state from the drop-down.
  • This causes the cities drop-down to filter only those cities that belong to the selected state.
  • Paul selects a city from this filtered list.

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.

The real objective of this article to to describe possible solutions and these are the options as I know them:

  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. Во овој случај, you would normally try to use a calculated column, but some times, 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, be aware of the issue addressed by овој член (http://paulgalvin.spaces.live.com/blog/cns!CC1EDB3DAA9B8AA!405.entry).
  3. Event handlers: Like 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 (and the whole object model) и можат да прават сите потребни пресметка.
  4. Use SharePoint Designer to create custom entry forms. I don’t have direct experience with this approach, но слушам дека прават добри работи со NewForm.aspx овие денови 🙂
  5. Се тркалаат свој ASP.NET податоци влез функција (како самостојна веб-страница или како веб дел) и ја користат таа наместо.

Ако некој знае други и / или подобри опции, Ве молиме да објавувате коментар и јас ќе се ажурира на телото на овој пост.

<крај />

Technorati Тагови:

Yes/No (наога) филтрирање во содржина барањето Веб Дел

To filter for a query for the Yes/No check box entitled "PG Milestone", конфигурирате CQWP вака:

сликата

Ова е уште еден од оние очигледни-еднаш-ти-знам-тоа, но тешко-да-најдам-на-одговор-на прашања: Како да се филтрираат на Да / Не наога користење на содржината на Барањето веб дел.

Првиот резултати од пребарувањето I find using the search term "filter yes/no content query web part" е рамен од погрешно, па мислев дека сум го стави ова до таму и види дали може да го замени неправилна резултат во типичен резултатите од пребарувањето.

Тоа е сосема лесно: True values = "1" and false values do not equal "1" (прилично ретро, всушност).

Во примерот погоре, I created site column of type "Yes/No (квадратчето)" named "PG Milestone". I added it to a doc library, подигнале неколку документи, Поставете ја вредноста за неколку и тестирани тоа.

<крај />

Креирај Бар графики во 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, која покажува како графика.

Бизнис сценарио / Подесување:

Имам креирано сопствен листа со стандардот Наслов колона и еден дополнителен колона, "Status". This models (Многу simplistically) an "Authorization For Expense" сценарио, каде што насловот го претставува проектот и статус вредност од листата на:

  • Предложени
  • Во Процес
  • Квадрирање

Целта е да се произведе интерактивна хоризонтална бар графикон кој го покажува овие статусот кодови.

Имам населени листата и тоа би изгледало вака:

сликата

Креирај Data View Веб Дел:

Создаде 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" верзија во Visual Studio.

Целта тука е да се предизвика 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 ширина = 10%>Отворете</td>
<td><маса ќелии: ="0" пополнувањето ="0" border = 0 width = 50%><tr bgcolor = црвена><td>&nbsp;</td></tr></маса></td>
</tr>
<tr>
<td ширина = 10%>Затворена</td>
<td><маса ќелии: ="0" пополнувањето ="0" border = 0 width = 25%><tr bgcolor = црвена><td>&nbsp;</td></tr></маса></td>
</tr>
<tr>
<td ширина = 10%>Квадрирање</td>
<td><маса ќелии: ="0" пополнувањето ="0" border = 0 width = 25%><tr bgcolor = црвена><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:

  • Почнав со стандардната XSL дека SharePoint Designer ми даде кога јас прв пат создадоа DVWP.
  • Јас бев во можност да се намали оваа надолу од СПД 657 линии за 166 lines.
  • Јас не збрка околу со параметрите XML датотека (кој е одделен од 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".
  • На разбивка работи со создавање на <a href> вака: 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" исклучи-резултат-префикси="rs, со грејс z о е DDWRT dt msxsl" 
xmlns:msxsl="затрупано:шеми-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:на="затрупано:шеми-Microsoft-COM:канцеларија" xmlns:на="UUID:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"
xmlns:dt="UUID:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs, со грејс="затрупано:шеми-Microsoft-COM:rowset" xmlns:од="#RowsetSchema"
xmlns:ddwrt2="затрупано:Насловна:внатрешна"
> <XSL:излез метод="html" алинеја="не" /> <XSL:децимална формат NaN="" /> <XSL:престанат име="ListUrlDir"></XSL:престанат> <!-- Сакам тоа да ја поддржи вежба-долу. --> <XSL:дефиниција одговара="/" xmlns:SharePoint="Microsoft.SharePoint.WebControls"
xmlns:__designer=http://schemas.microsoft.com/WebParts/v2/DataView/designer xmlns:asp="HTTP://schemas.microsoft.com/ASPNET/20"
> <XSL:променлива име="dvt_StyleName">Табела</XSL:променлива> <XSL:променлива име="Редови" изберете="/dsQueryResponse / Редови / Row" /> <XSL:променлива име="dvt_RowCount" изберете="смета($Редови)" /> <XSL:променлива име="IsEmpty" изберете="$dvt_RowCount = 0" /> <XSL:променлива име="dvt_IsEmpty" изберете="$dvt_RowCount = 0" /> <XSL:изберете> <XSL:кога тест="$dvt_IsEmpty"> Нема податоци за графикон!<BR/> </XSL:кога> <XSL:во спротивно> <!-- На интересни нешта започнува тука. Ние треба да се дефинираат еден пар на варијабли за секој ред во графиконот: вкупниот број           . --> <XSL:променлива име="totalProposed" изберете="смета(/dsQueryResponse / Редови / Row[нормализираат-простор(@ Статус) = 'Предлог "])" /> <XSL:променлива име="percentProposed" изберете="$totalProposed div $ dvt_RowCount" /> <XSL:променлива име="totalInProcess" изберете="смета(/dsQueryResponse / Редови / Row[нормализираат-простор(@ Статус) = 'Во Процес "])" /> <XSL:променлива име="percentInProcess" изберете="$totalInProcess div $ dvt_RowCount" /> <XSL:променлива име="totalStalled" изберете="смета(/dsQueryResponse / Редови / Row[нормализираат-простор(@ Статус) = 'Возастој "])" /> <XSL:променлива име="percentStalled" изберете="$totalStalled div $ dvt_RowCount" /> <!-- Ние се дефинираат нашите HTML табела овде. Јас сум позајмување од некои стандардни           . Мислам дека тоа ќе го уважиме           . --> <маса ширина="100%" пополнувањето="0" ќелии:="2" стил="граница-десно: 1 солидна # C0C0C0; границата дното: 1 солидна # C0C0C0; граница-лево-стил: солидна; граница-лево-ширина: 1; граница-топ-стил: солидна; граница-топ-ширина: 1;"> <tr> <td усогласување на="центар"> <маса границата="1" ширина="100%"> <!-- За секој статусот што сакаме да графикон, we call the "ShowBar" дефиниција. Ние го помине: 1. А етикета за ред. Ова се претвора во хиперврска. 2. На проценти (променлива од горе). 3. Вистинската име на поле на кодот од основната листа. Овој                      . 4. Областа вредност се исти за #3. 5. Вкупно предмети од овој статус код (не големото вкупниот износ на сите                      ). Тоа емитира <tr></tr> и хоризонтална графика линија. Ние го нарекуваме овој образец за секој код за статус сакаме да ја видите. --> <XSL:повик-дефиниција име="ShowBar"> <XSL:со-Парам име="BarDisplayLabel" изберете=""Предлог""/> <XSL:со-Парам име="BarPercent" изберете="$percentProposed"/> <XSL:со-Парам име="QueryFilterFieldName" изберете=""Статус""/> <XSL:со-Парам име="QueryFilterFieldValue" изберете=""Предлог""/> <XSL:со-Парам име="TotalItems" изберете="$totalProposed"></XSL:со-Парам> </XSL:повик-дефиниција> <XSL:повик-дефиниција име="ShowBar"> <XSL:со-Парам име="BarDisplayLabel" изберете=""Возастој""/> <XSL:со-Парам име="BarPercent" изберете="$percentStalled"/> <XSL:со-Парам име="QueryFilterFieldName" изберете=""Статус""/> <XSL:со-Парам име="QueryFilterFieldValue" изберете=""Возастој""/> <XSL:со-Парам име="TotalItems" изберете="$totalStalled"></XSL:со-Парам> </XSL:повик-дефиниција> <XSL:повик-дефиниција име="ShowBar"> <XSL:со-Парам име="BarDisplayLabel" изберете=""Во процесот""/> <XSL:со-Парам име="BarPercent" изберете="$percentInProcess"/> <XSL:со-Парам име="QueryFilterFieldName" изберете=""Статус""/> <XSL:со-Парам име="QueryFilterFieldValue" изберете=""Во процесот""/> <XSL:со-Парам име="TotalItems" изберете="$totalInProcess"></XSL:со-Парам> </XSL:повик-дефиниција> </маса> </td> </tr> </маса> </XSL:во спротивно> </XSL:изберете> </XSL:дефиниција> <!-- Овој шаблон не работата за прикажување на индивидуалните линии во бар графикон. Најверојатно ќе направи поголемиот дел од вашето tweaking овде. --> <XSL:дефиниција име="ShowBar"> <XSL:престанат име="BarDisplayLabel" /> <!-- етикетата за да се покаже --> <XSL:престанат име="BarPercent"/> <!-- Проценти од вкупно. --> <XSL:престанат име="QueryFilterFieldName"/> <!-- Се користи за да скокнат до пребарување & филтер --> <XSL:престанат име="QueryFilterFieldValue"/> <!-- Се користи за да скокнат до пребарување & филтер --> <XSL:престанат име="TotalItems" /> <!-- вкупно пребројувањето на овој barlabel --> <tr> <!-- Бар етикета себе. --> <td класа="MS-formbody" ширина="30%"> <!-- Ова следниот сет на изјавите гради на барањето кој им овозможува на           . Ние се направи употреба на неколку работи тука: 1. Ние може да помине FilterField1 и FilterValue1 на листата за филтрирање на колона. 2. SharePoint поминува клучен параметар за нас, ListUrlDir that points to the underlying list against which this DVWP is "running". Не XSL забава? --> <XSL:текст disable-излез-бегство="Да"> <![CDATA[<a href ="]]></XSL:текст> <XSL:вредност на изберете="$ListUrlDir"/> <XSL:текст disable-излез-бегство="Да"><![CDATA[?FilterField1 =]]></XSL:текст> <XSL:вредност на изберете="$QueryFilterFieldName"/> <XSL:текст disable-излез-бегство="Да"><![CDATA[&FilterValue1 =]]></XSL:текст> <XSL:вредност на изберете="$QueryFilterFieldValue"/> <XSL:текст disable-излез-бегство="Да"><![CDATA[">]]></XSL:текст> <XSL:вредност на изберете="$BarDisplayLabel"/> <XSL:текст disable-излез-бегство="Да"><![CDATA[</на>]]></XSL:текст> <!-- На следната малку покажува некои броеви во формат: "(вкупно / % од вкупните)" --> (<XSL:вредност на изберете="$TotalItems"/> / <!-- Ова создава убаво проценти етикета за нас. Благодарение, Мајкрософт! --> <XSL:повик-дефиниција име="percentformat"> <XSL:со-Парам име="проценти" изберете="$BarPercent"/> </XSL:повик-дефиниција>) </td> <!-- Конечно, испуштаат <td> ознака за бар себе.--> <td> <маса ќелии:="0" пополнувањето="0" границата="0" ширина="{коло($BarPercent * 100)+1}%"> <tr bgcolor="црвена"> <XSL:текст disable-излез-бегство="Да"><![CDATA[&nbsp;]]></XSL:текст> </tr> </маса> </td> </tr> </XSL:дефиниција> <!-- Тоа се зема директно од некои XSL го најдов во дефиниција МСП. --> <XSL:дефиниција име="percentformat"> <XSL:престанат име="проценти"/> <XSL:изберете> <XSL:кога тест="формат-број($проценти, "#, # # 0%;-#,##0%")= 'На Nan">0%</XSL:кога> <XSL:во спротивно> <XSL:вредност на изберете="формат-број($проценти, "#, # # 0%;-#,##0%")" /> </XSL:во спротивно> </XSL:изберете> </XSL:дефиниција> </XSL:интерфејс>

Резултатите:

На XSL од горе генерира овој графикон:

сликата

Разбивка на основните податоци со кликнување на статусот кодот:

сликата

Склучување на мисли:

Ова може да се генерализира?

Ја сакам оваа графики концепт, 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 / Редови / Row[нормализираат-простор(@ Статус) = 'Предлог "])" />

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

   <XSL:променлива име="totalProposed" 
изберете="смета(/dsQueryResponse / Редови / Row[нормализираат-простор(@ 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:изберете> да се оствари ова.

Други ресурси:

Среќен трансформирање!

<крај />

Да се ​​претплатите на мојот блог!

SharePoint не обезбедува “Кој има пристап” Извештаи

Ажурирање 01/28/08: Овој проект CodePlex разгледува ова прашање: http://www.codeplex.com/AccessChecker. I have not used it, но тоа изгледа ветувачки, ако ова е прашање што треба да се обрати во вашата околина.

Ажурирање 11/13/08: Joel Oleson Напишав многу добар пост на поголема сигурност за управување со прашањето овде: HTTP://www.sharepointjoel.com / Листи / мислења / Post.aspx?List=0cd1a63d-183c-4fc2-8320-ba5369008acb&ID = 113. It links to a number of other useful resources.

Форум корисници и клиенти често прашам едно прашање долж овие линии: "How do I generate a list of all users with access to a site" or "How can I automatically alert all users with access to list about changes made to the list?"

There is no out of the box solution for this. If you think about it for a moment, тоа не е тешко да се разбере зошто.

SharePoint security is very flexible. There are at least four major categories of users:

  • Анонимни корисници.
  • SharePoint корисници и групи.
  • Active Directory Users.
  • Форми засновани автентикација (FBA) корисници.

Флексибилност значи дека од безбедносен аспект, any given SharePoint site will be dramatically different from another. In order to generate an access list report, некој треба да се утврди начинот на кој сајт е обезбедено, query multiple different user profile repositories and then present it in a useful fashion. That’s a hard problem to solve generically.

Како се организации кои се занимаваат со овој? I’d love to hear from you in comments or e-mail.

</крајот>

Мос ми кажува Мој колона името е резервирана или во употреба … Но тоа не е

Ажурирање 12/04/07: Види this Microsoft KB (http://support.microsoft.com/kb/923589) за информации поврзани со.

Всушност, што се испоставува дека е, но tricksy MOSS had to make it difficult.

My customer does some development work on his MOSS site over the weekend. It’s a bit of a jumble as to what he actually did, но крајниот резултат е ова:

  • He tries to add a site column called "Quantity" and MOSS replies: "The column name that you entered is already in use or reserved. Choose another name."
  • He attempts to add it to another environment and that works. Затоа, "Quantity" is not a reserved name.
  • He tries to find an existing site column named "Quantity" in that site collection. He cannot find it.

I did some research, and even some coding, waxed philosophical and finally found that a column named Quantity did, всушност, exist. It was in the "_Hidden" group. Hence, we could not find it via the SharePoint user interface.

How did it get there? I do not know, but I have a theory (or as my wife would call it, "blah blah blah"). Некаде по должината на линијата, на fabulous forty template was added and probably activated at a site in the site collection. It was then deactivated (or the site removed). The site column, сепак, remained but in the "_Hidden" group. If someone knows better, please let me know via e-mail or post in the comments.

SharePoint was telling the truth. It’s hardly worth pointing out that that message is not as helpful as it could be. It would be nice to see that message fork into two different messages in the future: 1) Say that the column name is reserved or it is not. 2) If it’s not reserved, show the site, or at least the group, where the column name is already used.

</крајот>

Присутни на податоци преку 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. Сепак, Јас едноставно не можев да најдам на колоната насекаде преку стандардниот SharePoint кориснички интерфејс на било кој сајт во сајт за собирање.

Јас испратени до MSDN форуми тука и неукротим Ендрју Вудворд посочи мене во насока на основните објект модел на податоци.

Јас отиде да CodePlex да се најдат некои алатки кои ќе ми помогне пир во основните OM податоци и да ми помогне да се лоцира проблеми.

Се обидов неколку алатки и тие беа многу кул и интересен, но на крајот, the UI wasn’t good enough for my purpose. I’m not criticizing them by any means, но јасно ја алатката на одлуки немаат мојот проблем во умот кога тие создале нивните адаптери :). Most people seem to be investing a fair amount of time and effort in creating workstation / клиент апликации кои обезбедуваат дрво пати, 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 карактеристики).

SharePoint Designer работното прилагодено акција — Набљудување За <Поле Тај дизајнер Тип =”StringBuilder” … />

Само еден брз забелешка дека има многу важна разлика меѓу овие две дефиниции:

<FieldBind Field="InParam1" DesignerType="StringBuilder" Id="2" Text="Input parameter #1"/>

наспроти:

<FieldBind Field="InParam1" Id="2" Text="Input parameter #1"/>

Првиот покажува како оваа во СПД:

сликата

додека вториот покажува како оваа:

сликата

I’m not sure how helpful these screen shots are but I put in the effort to make them so you have to view them 🙂

На опсервација е ова: StringBuilder ви овозможува да се изгради низа (очигледно) со мешање заедно низа literals и работното податоци (via the "Add Lookup" копчето во долниот лев агол). When you use the Add Lookup button, it inserts a token in the form "[%знак%]". When SharePoint invokes your custom action, (C # кодот во мојот случај), SharePoint поминува знак себе, not the value of the token. If you use the default designer type (вториот тип), SharePoint проширува знак и поминува реалната вредност на токен за вашата акција.

StringBuilder = лошо, стандардно дизајнер тип = ДОБРО.

Се разбира, that’s not what I really mean. Just don’t try and pass a parameter to your custom action when the designer type = StringBuilder. Use the default designer type and chain a StringBuilder to it up front if you need to build complex strings in your workflow (која патем е токму она што го прави за да се создаде една динамична предмет за е-мејл акција, но тоа е тема за друг блог запис, има).

<крај />

Предвремено Работното Активирање — А не-медицински решение

Ажурирање: Погледнете го овој MSDN дискусија, особено последниот запис: http://forums.microsoft.com/MSDN/showpost.aspx?postid=2631057&siteid=1. It describes a condition that may short circuit this whole thing. На кратко, тоа може да биде едноставно како правење на најмалку една од областите задолжителни.

Јас имам еден документ библиотека која поддржува осум типови содржини.

I have a SharePoint Designer workflow that wants to calculate and assign a "reminder date" со едноставно одземање 30 дена од друга колумна, "due date". This should only happen for one of the content types, "Insurance". The business objective is to produce a KPI that shows two categories of insurance documents: "about to expire" and "expired." (Можете да прочитате повеќе за овој вид на KPI и посуштински вежба-долу тука).

I have configured the workflow to fire when a new item is created and when an item is modified. The idea is that when an insurance document is uploaded, we calculate a "warning date" based on the expiration date. A pair of views work in connection with a KPI List to highlight these conditions when users hit their home page.

Оваа стратегија не работи кога јас испратите документот.

I upload the document and I am presented with the meta data entry screen. Во овој момент, I’m already in trouble. SharePoint has already, предвреме од моја перспектива, fired the workflow. I haven’t had a chance to pick the correct content type nor assign a due date. Во исто време, the workflow does not fire when I hit the submit button at this time. There’s some built-in logic that "believes" that first submit is part of the "create" event. Така … мојата работа е отпуштен и кога станува погубен, it was passed default meta data values.

The best work-around I know of is to insert a "pause until" activity in the workflow. I have the workflow pause for 1 minute. While it’s pausing, Јас го изберете точниот тип на содржина, enter the meta data and submit. The pause completes and the workflow proceeds as needed. (Имајте на ум дека во мојата средина, timer workflow activities from SPD do not work out of the box. You may have the same trouble. Види тука за повеќе детали).

I don’t like "magic delay" work-around. What happens if the user uploads a document and the phone rings and the ensuing conversation outlasts the pause? I can make the pause longer, но јас сè уште не ми се допаѓа.

Напишав за тоа на MSDN форуми тука: http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2430725&SiteID=1