Категория Архиви: Развитие на SharePoint

Пазете се, чупене промени на ItemStyle.xsl

Аз работех с ItemStyle.xsl да персонализирате изгледа на уеб компонента на заявка за съдържание и правото за обяд, Направих чупене промяна към xsl. Аз не го осъзнават, но това е имал трайни последици в цялата колекция от сайтове. Аз мина до обяд и след завръщането ми, забелязах това съобщение, включени в един куп места:

Не може да покаже тази уеб част. За отстраняване на проблема, Отворете тази страница в съвместими с Windows SharePoint услугите HTML редактор като Microsoft Office SharePoint Designer. Ако проблемът продължава, Обърнете се към администратора на уеб сървъра.

Аз обвини клиента (не осъзнавайки все още, че това е моя вина в този момент) но накрая забелязах intellisense че visual studio е ми предупреждение че имах деформиран XSL. Аз го коригира и всичко започна да работи.

Бъде darned внимателни при работа с ItemStyle.xsl (и някой от глобалната XSL файлове) — неспазването им влияе много артефакти в колекцията от сайтове.

<край />

Показване на съдържание Web част резултатите от заявката в мрежа / Таблица

Преглед и цел

На кутията, МОС’ Заявка за съдържание уеб част (CQWP) показва резултатите от нея в списък формат, подобни на резултатите от търсенето. Също така е възможно да покажете резултатите в мрежа формат (т.е.. HTML таблица формат). Формати на мрежата са по-добре в някои обстоятелства. Ще опиша как да се постигне този ефект в тази статия.

Бизнес сценарий

Работил съм с клиент на предприятие широк Мос внедряването. Ние сме проектирали им класификация, така че проектите са първа класа граждани в йерархията и имат свои собствени връх на ниво сайт. Ръководители на проекти поддържа Сингълтън списък с обобщена информация за проекта, например заглавие, бюджет, Очаквана дата на завършване, оставащият бюджет и други сумарен тип полета. От "Сингълтън" Искам да кажа на потребителски SharePoint списък гарантирано да съдържа само един елемент. Опростенчески, Тя изглежда така:

Изображение

Техническия подход е почти същия, както е описано Тук (http://paulgalvin.spaces.live.com/blog/cns!1CC1EDB3DAA9B8AA!447.entry). CQWP използва XSL трансформация, за да излъчват HTML за браузър, за да направи.

Аз винаги си представим резултата преди да се гмурне в XSL защото XSL е кошмар. Ето моите желания резултат:

Изображение

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. Създаване на подсайтове за проектите и лъжливо списъци.
  4. Добави CQWP към web страница и да го конфигурирате за търсене за вашите списъци.
  5. Модифициране на CQWP XML, за да събират допълнителни колони.
  6. Промяна на XSL за генериране на таблица.

Аз отивам да се концентрира върху номер шест. Числата едно чрез четири са прав-напред и нещо, което вече е направено от всеки потребител, CQWP. Номер пет е била добре документирани от други включително този изчерпателен екрана изстрел натоварено статия от MSDN Тук (http://msdn2.microsoft.com/en-us/library/bb897399.aspx) и блога на Хедър Соломон Тук (http://www.heathersolomon.com/blog/articles/CustomItemStyle.aspx).

Гайки и болтове

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

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

След обичайните стъпки, Получавам тези междинни резултати:

1. Създаване на тип съдържание, шаблонирана потребителски списък за този тип съдържание и два сайтове. Тук е типа на съдържанието:

Изображение

Ето структурата на сайта:

Изображение

2. Добавете CQWP след създаването си проект подсайтове и лъжливо проект обобщени списъци:

Изображение

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. В този момент, Ние сме готови да преминете отвъд статията на MSDN and флип на Хедър Соломон статия. Следвайте си стъпки, започва близо до стъпка #5 за да създадете персонализиран / unghosted версия на ItemStyle.xsl. Аз следват Хедър съвети, нагоре през стъпка 11 и да получите тези междинни резултати:

4.1: Името ми XSL шаблон както следва:

<XSL:име на шаблон = "мрежа" съвпадение = "ред[@Style = "Мрежа"]" режим = "itemstyle">

Аз също така леко я предложи промяна <XSL:за всеки …> чрез добавяне на <BR /> етикет да предостави чист списък:

    <XSL:за всеки Изберете="@*">
      P:<XSL:стойността на Изберете="Име()" /><br/>
    </XSL:за всеки>

4.2: Модифициране на уеб част, отидете на външния вид и изберете моя "мрежа" стил:

Изображение

Прилагане на промените и тук е резултат:

Изображение

Можем да видим от по-горе, че полетата искаме (Име на проекта, разходи, статус, н) са достъпни за нас да използва, когато ние излъчваме HTML. Не само, че, но ние виждаме имената, с които ние трябва да препращат тези колони в XSL. За пример, Ние позоваване статус на проекта като "Project_x005F_x0020_Name".

В този момент, тръгва се от блога на Хедър и от раменете на тези гиганти, Аз добавя моя собствена малко.

ContentQueryMain.xsl

ЗАБЕЛЕЖКА: Когато правите промени в ContentQueryMain.xsl, както и ItemStyle.xsl, Вие трябва да проверите тези файлове обратно в преди да видите ефекта от промените.

За целите на правене на мрежа, Мос използва две различни XSL файлове, за да доведе до резултати, виждаме от CQWP. За генериране на предишния малко на продукцията, Ние промяна ItemStyle.xsl. Мос действително използва друг XSL файл, ContentQueryMain.xsl да във връзка с ItemStyle.xsl да генерирате си HTML. Както предполага неговото име, ContentQueryMain.xsl е главният"" XSL, който контролира общия поток на превод. Тя повтаря през всички елементи, намерени и ги преминава един по един да шаблони в ItemStyle.xsl. Ние ще променят ItemStyle.xsl за генериране на открито <таблица> етикет преди излъчване на първия ред от данни и затваряне <таблица> етикет след излъчване на последния ред. За да постигнем това, ContentQueryMain.xsl е променен, за да премине два параметъра на нашата "мрежа" шаблон в ItemStyle.xsl, "последния ред" и "текущ ред". ItemStyle.xsl използва тези условно излъчват необходимите Тагове.

С помощта на Хедър Соломон техника, Ние поставяме ContentQueryMain.xsl. Той се намира на същото място като ItemStyle.xsl. Този екран изстрел трябва да помогне:

Изображение

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

  • Модифициране на шаблон на xsl, "CallItemTemplate" Това всъщност се позовава ни мрежа шаблон в ItemStyle.xsl. Ние ще преминават два параметъра на шаблона на мрежата, така че той ще има данни, необходими за условно генериране на отваряне и затваряне <таблица> Тагове.
  • Промените още малко на ContentQueryMain.xsl, която призовава "CallItemTemplate" да го предаде "LastRow" параметър, така че LastRow може да бъдат прехвърлени към нашите мрежата шаблон.

Намерете шаблона на име "OuterTemplate.CallItemTemplate" идентифицирани от низ:

  <XSL:шаблон Име="OuterTemplate.CallItemTemplate">

Замени целия шаблон както следва:

  <XSL:шаблон Име="OuterTemplate.CallItemTemplate">
    <XSL:param Име="CurPosition" />

    <!--
      Добави "LastRow" параметър.
      Ние само го използвам, когато елемент стил проход в е "Мрежа".
    -->
    <XSL:param Име="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:шаблон>

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

Разбира се, "OuterTemplate.CallItemTemplate" е самата нарича от друг шаблон. Намерете този шаблон чрез търсене на този текстов низ:

<XSL:шаблон Име="OuterTemplate.Body">

Превъртете през инструкциите в OuterTemplate.Body и вмъкнете параметъра LastRow както следва (показани като коментар в курсив):

<XSL:повикване-шаблон Име="OuterTemplate.CallItemTemplate">
  <XSL:с Албена Име="CurPosition" Изберете="$CurPosition" />
  <!-- Вмъкнете параметъра LastRow. -->
  <XSL:с Албена Име="LastRow" Изберете="$LastRow"/>
</XSL:повикване-шаблон>

След всичко това, най-накрая имаме неща настроен правилно, така че да могат да излъчват нашите ItemStyle.xsl <таблица> Етикети на точното място.

ItemStyle.Xsl

ЗАБЕЛЕЖКА: Отново, Проверете в ItemStyle.xsl след като всички промени, така че да виждате ефекта от тези промени.

Тук имаме две задачи:

  • Замени цялата мрежа шаблон. Можете да копирате/паста от долу.
  • Добави някои mumbo джъмбо извън дефиницията на шаблон, който позволява "formatcurrency" шаблон за работа. (Можете да кажете, че имам слаба дръжка на XSL).

Първо, близо до горната част на ItemStyle.xsl, Добави този ред:

  <!-- Някои mumbo джъмбо, който ни позволява да покажете САЩ. валута. -->
  <XSL:десетичен формат Име="персонал" цифра="D" />

  <XSL:шаблон Име="По подразбиране" мач="*" режим="itemstyle">

Имайте предвид, че аз го добавя непосредствено преди <XSL:име на шаблон = "по подразбиране" …> дефиниция.

Следващ, върнете се към нашия мрежа шаблон. Замените шаблона на цялата мрежа с кода по-долу. Тя е добре коментира, но не се колебайте да пишете ми или оставите коментар в моя блог, ако имате въпроси.

  <XSL:шаблон Име="Мрежа" мач="Ред[@Style = "Мрежа"]" режим="itemstyle">

    <!--
      ContentMain.xsl минава CurPos и последно.
      Използваме условно излъчват отваряне и затваряне <таблица> Тагове.
    -->
    <XSL:param Име="CurPos" />
    <XSL:param Име="Последно" />

    <!-- Следващите променливи са непроменени от стандартните 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:с Албена Име="Заглавие" Изберете="@Title"/>
        <XSL:с Албена Име="UrlColumnName" Изберете=""LinkUrl""/>
      </XSL:повикване-шаблон>
    </XSL:променлива>
    <XSL:променлива Име="LinkTarget">
      <XSL:Ако тест="@OpenInNewWindow = "True"" >_blank</XSL:Ако>
    </XSL:променлива>

    <!--
      Тук ние определяме променлива, "tableStart".  Това съдържа HTML, които използваме за определяне на откриването на таблицата, както и етикетите на колоните.  Обърнете внимание, че ако CurPos = 1, Тя включва HTML в CDATA етикет.
      В противен случай, Той ще бъде празен.

      Стойността на tableStart е отделяния, всеки път, когато ItemStyle се нарича чрез ContentQueryMain.xsl.
    -->
    <XSL:променлива Име="tableStart">
      <XSL:Ако тест="$CurPos = 1">
        <![НЕЗАТВОРЕН[
        <граница на таблица = 1>
          <TR bgcolor = "синя">
            <TD><цвят на шрифта = "бяло"><б>Име на проекта</б></шрифт></TD>
            <Подравняване на TD = "право"><цвят на шрифта = "бяло"><б>Попълнете датата</б></шрифт></TD>
            <Подравняване на TD = "право"><цвят на шрифта = "бяло"><б>Бюджет</б></шрифт></TD>
            <Подравняване на TD = "право"><цвят на шрифта = "бяло"><б>Действителни разходи</б></шрифт></TD>
            <TD><цвят на шрифта = "бяло"><б>Цялостното състояние</б></шрифт></TD>
          </TR>
        ]]>
      </XSL:Ако>
    </XSL:променлива>

    <!--
      Друга променлива, tableEnd просто определя крайната маса етикет.

      Както и при tableStart, Тя винаги е отделяния.  Ето защо неговата стойност се присвоява условно въз основа на това дали сме били преминали последния ред от ContentQueryMain.xsl.
    -->
    <XSL:променлива Име="tableEnd">
      <XSL:Ако тест="$CurPos = $Last">
        <![НЕЗАТВОРЕН[ </таблица> ]]>
      </XSL:Ако>
    </XSL:променлива>

    <!--
      Винаги излъчват съдържанието на tableStart.  Ако това не е първия ред премина към нас от ContentQueryMain.xsl, след това ние знаем стойността му ще бъде празна.

      Забраняване на изход да избяга, защото когато tableStart тя не празно, Тя включва действителните HTML, които искаме да бъдат предоставени от браузъра.  Ако ние не казвайте на XSL анализатора да забраните продукция бягство, Той ще генерира неща като"&lt;таблица&gt;" Вместо това на"<таблица>".
    -->
    <XSL:стойността на Изберете="$tableStart" забрани продукция бягство="Да"/>


    <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:стойността на Изберете="@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" клас = "позиции"> <XSL:Ако тест = "-дължина на низа($SafeImageUrl) != 0"> <DIV клас = "изображение-зона-ляво"> <a href = "{$SafeLinkUrl}" TARGET = "{$LinkTarget}"> <IMG клас = "изображение-фиксирана ширина" SRC = "{$SafeImageUrl}"
ALT = "{@ImageUrlAltText}"/> </а> </DIV> </XSL:Ако> <DIV клас = "връзката-елемент"> <XSL:повикване-шаблон
name="OuterTemplate.CallPresenceStatusIconTemplate"/> <a href = "{$SafeLinkUrl}"
TARGET = "{$LinkTarget}" заглавие = "{@LinkToolTip}"> <XSL:стойността на изберете = "$DisplayTitle" /> </а> <DIV клас = "Описание"> <XSL:стойност на select="@Description" /> </DIV> </DIV> </DIV>
--> </TR> <!-- Излъчват затваряне маса етикет. Ако не сме на последния ред, Това ще бъде празно. --> <XSL:стойността на Изберете="$tableEnd" забрани продукция бягство="Да"/> </XSL:шаблон> <XSL:шаблон Име="FormatCurrency"> <XSL:param Име="стойност" Изберете="0" /> <XSL:стойността на Изберете='Форматиране на число($стойност, "$DDD,DDD,DDD. DD", "персонал")' /> </XSL:шаблон>

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

АКТУАЛИЗИРАНЕ (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/

Няколко пъти на седмица, Ако не ежедневно, форум на потребителите описва изискването, че обикновено може да бъде осъществена чрез каскадни падащите. За пример, Аз имам две контроли на падащ списък:

  • Списък на САЩ. членки
  • Списък на САЩ. Градове.

Като отговорен UI доставчици, Ние искаме това да работи като този:

  • Павел избира САЩ. държава от падащото меню.
  • Това води до градовете падащото меню да се филтрира само тези градове, които принадлежат на избрания държавата.
  • Павел избира един град от този филтриран списък.

Не е вън на на кутия поддръжка за тази функция. Всъщност, няма OOB поддръжка за всякакъв вид пряка intra-формуляр за комуникация. Това включва програмно скриване/включване/изключване полета в отговор на промени в полето някъде другаде във формуляра.

Истинската цел на тази статия за да описват възможните решения и те са опциите, както аз ги знам:

  1. Разработване на потребителски колоната тип. Като по поръчка-колона-разработчик, Вие имате пълен контрол над света"" от тази колона за избор. Можете да реализирате каскадни падащото по този начин.
  2. Помислете за използване на работен поток. В някои случаи, искате да присвои автоматично стойност поле въз основа на друго поле стойност. В този случай, обикновено ще се опита да използва изчисляема колона, но някои пъти, Тя просто няма да се свърши работата. SharePoint Designer поток е относително администриране приятелски алтернатива на отпадане надолу в код и visual studio. Ако отидете този маршрут, бъдат запознати с въпросите, разглеждани от тази статия (http://paulgalvin.spaces.live.com/blog/cns!CC1EDB3DAA9B8AA!405.entry).
  3. Манипулатори на събития: Като работен поток, Това е решение, след най факт. Вашия манипулатор на събитие е асемблиран (C#, VB.NET) към SharePoint, които минава контрол. Обектът развиете има достъп до данните от списъка (и на целия обект модел) и може да направи всички необходими изчисления.
  4. Използвайте SharePoint Designer, за да създадете потребителски формуляри. Аз нямам пряк опит с този подход, but I hear they are doing good things with NewForm.aspx these days 🙂
  5. Roll своя собствена ASP.NET данни влизане функция (като отделна уеб страница или уеб част) и употреба този вместо това.

Ако някой знае други и/или по-добри опции, Моля публикувате коментар и аз ще се актуализира на тялото на този пост.

<край />

Technorati тагове:

Създаване на лента графики в SharePoint

Общ преглед:

(АКТУАЛИЗИРАНЕ 12/04/07: Добавя друг интересен ресурс в края свързва с друг блог, който се справя с това чрез много интересен уеб част)

Този блог пост описва как да създадете графика лента в SharePoint. Това работи в WSS и Мос среди, както то само зависи от уеб компонента за изглед на данни.

Цялостния подход е както следва:

  1. Създаване на списък или библиотека с документи, която съдържа данните, които искате да се изобразят.
  2. Поставете свързания документ библиотека / потребителски списък върху една страница и да го конвертирате в уеб компонент за изглед на данни (DVWP).
  3. Модифициране на DVWP XSL, за да генерира HTML, който показва като графика.

Бизнес сценарий / Настройка:

Аз създадох персонализиран списък със стандартните заглавие на колона и една допълнителна колона, "Статус". Това модели (много опростенчески) "разрешително за сметка" сценарий, където заглавието представлява проекта и състоянието стойност от списъка на:

  • Предложени
  • В процес
  • В застой

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

Са населени списъка и то изглежда така:

Изображение

Създаване на Web част:

Създаване на DVWP чрез добавяне на списък по избор на страница (страница на сайт в моя случай) и следвайте инструкциите Тук (http://paulgalvin.spaces.live.com/blog/cns!1CC1EDB3DAA9B8AA!395.entry).

Освен просто създаване на DVWP, Ние също трябва да зададете свойството paging да покаже всички налични редове. За мен, Това изглежда нещо подобно:

Изображение

В този момент, Аз винаги затворен ЕДП и на браузъра. Аз след това повторно отваряне на страница с помощта на браузъра. Това предотвратява случайно хвърляйки на уеб част оформлението на страницата.

Промяна на XSLT:

Сега е време да промените XSLT.

Аз винаги използвам visual studio за това. (Вижте Тук за важна забележка за intellisense, които ще ви помогнат много).

Създавам празен проект добави четири нови файлове (замяна на думи "оригинал" и "Ню" по целесъобразност):

  • Original.XSLT
  • New.XSLT
  • Оригинален Params.xml
  • Нова Params.xml

В моя случай, Тя изглежда така:

Изображение

Модифициране на уеб част и копие на params и XSL към оригинала"" версия на Visual Studio.

Целта тук е да се предизвика XSL за трансформиране на резултатите, ние се върна от DVWP заявка в HTML, което прави като графика.

За тази цел, Той помага да се първо Помислете как трябва да изглежда HTML, преди ние да се бърка с безумието, че е известен като "XSL". (За да бъде ясно, по-долу е просто един пример; не го въведете или копирайте в visual studio. Аз предоставят пълен удар отправна точка за това по-късно в хвалебствена статия). Следващата графика на пробата се оказва както HTML веднага след:

Примерна лентова графика

Съответният HTML:

<HTML>
<тяло>
<център>
<маса ширина = 80 %>
<TR><TD><център>Хоризонтална стълбовидна диаграма</TD></TR>
<TR>
<Подравняване на TD = "център">
<граница на таблица = 1" ширина = 80 %>
<TR>
<TD ширина = 10 %>Отворен</TD>
<TD><таблица cellpadding ="0" CellSpacing ="0" границата = 0 ширина = 50 %><TR bgcolor = червен><TD>&nbsp;</TD></TR></таблица></TD>
</TR>
<TR>
<TD ширина = 10 %>Затворен</TD>
<TD><таблица cellpadding ="0" CellSpacing ="0" границата = 0 ширина = 25 %><TR bgcolor = червен><TD>&nbsp;</TD></TR></таблица></TD>
</TR>
<TR>
<TD ширина = 10 %>В застой</TD>
<TD><таблица cellpadding ="0" CellSpacing ="0" границата = 0 ширина = 25 %><TR bgcolor = червен><TD>&nbsp;</TD></TR></таблица></TD>
</TR>
</таблица>
</TD>
</TR>
</таблица>
</тяло>
</HTML>

Аз използван един мъртъв прост подход към създаването ми барове чрез задаване на цвета на фона на един ред в "червено".

Това ли е най-далеч тук: В края, всички ние сме правите създава HTML с редове и колони.

Шаблон XSLT:

Аз сте копирали XSLT, която генерира хоризонтална графика лента. Това е доста добре коментира, така че аз няма да добавите много тук освен тези бележки:

  • Започнах с по подразбиране XSL, че SharePoint Designer ми даде, когато създадох първи DVWP.
  • Аз бях в състояние да намалят това от ЕДП 's 657 линии за 166 линии.
  • Аз не играя си с параметри XML файл (което е отделено от XSL и вие ще знаете какво имам предвид, когато отидеш да модифицирате DVWP, самата; има два файла, можете да промените). Въпреки това, за да се опрости, Почти всички от тях премахване от XSL. Това означава, че ако искате да се използват от тези параметри, трябва само да добавите променлива определения обратно към XSL. Това ще бъде лесно, тъй като ще имате оригиналния XSL променлива дефиниции във вашия visual studio проект.
  • Вие трябва да можете да копирате и го поставете директно в вашия visual studio проект. След това, Извадете ми обаждания и поставете вашите собствени повиквания към "ShowBar".
  • Детайлизирането работи чрез създаване на <a href> Ето така: http://server/List?FilterField1=fieldname&FilterValue1=actualFilterValue. Тази техника може да бъде на стойност в друг контекст. На първо място, Мислех, че ще трябва да отговарят на по-сложни формат: http://server/List/AllItems.aspx?View={guid}&FilterField1=blah&FilterValue1=blah, но в моята среда, която не е необходимо. URL адрес на списъка се предава към нас от SharePoint, така че това е доста лесно да се обобщи.

Ето това е:

<XSL:стилове версия="1.0" изключване-резултат-представки="RS z о s ddwrt dt msxsl" 
xmlns:msxsl="урна:схеми-microsoft-com:XSLT" xmlns:XSL="HTTP://www.w3.org/ 1999/XSL/трансформация"
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="урна:схеми-microsoft-com:офис" xmlns:s="UUID:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"
xmlns:DT="UUID:C2F41010-65B3 - 11d 1-A29F-00AA00C14882" xmlns:RS="урна:схеми-microsoft-com:набор редове" xmlns:z="#RowsetSchema"
xmlns:ddwrt2="урна:FrontPage:вътрешни"
> <XSL:изход метод="HTML" тире="Не" /> <XSL:десетичен формат NaN="" /> <XSL:param Име="ListUrlDir"></XSL:param> <!-- Имам нужда от това да подкрепят тренировка надолу. --> <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/редове/ред" /> <XSL:променлива Име="dvt_RowCount" Изберете="брой($Редове)" /> <XSL:променлива Име="IsEmpty" Изберете="$dvt_RowCount = 0" /> <XSL:променлива Име="dvt_IsEmpty" Изберете="$dvt_RowCount = 0" /> <XSL:Изберете> <XSL:Когато тест="$dvt_IsEmpty"> Няма данни за графиката!<br/> </XSL:Когато> <XSL:в противен случай> <!-- Интересни неща започва тук. Ние трябва да се определи един чифт на променливи за всеки ред в графиката: общ брой елементи и процента от общата сума. --> <XSL:променлива Име="totalProposed" Изберете="брой(/dsQueryResponse/редове/ред[нормализира-пространство(@Status) = "Предложени"])" /> <XSL:променлива Име="percentProposed" Изберете="$totalProposed div $dvt_RowCount" /> <XSL:променлива Име="totalInProcess" Изберете="брой(/dsQueryResponse/редове/ред[нормализира-пространство(@Status) = "В процес"])" /> <XSL:променлива Име="percentInProcess" Изберете="$totalInProcess div $dvt_RowCount" /> <XSL:променлива Име="totalStalled" Изберете="брой(/dsQueryResponse/редове/ред[нормализира-пространство(@Status) = "Задънена улица"])" /> <XSL:променлива Име="percentStalled" Изберете="$totalStalled div $dvt_RowCount" /> <!-- Ние дефинираме нашите HTML таблица тук. Аз съм заеми от някои стандартни стилове SharePoint тук в съответствие. Мисля, че това ще чест промени в глобалната css файл както тема предимство. --> <таблица ширина="100%" CellSpacing="0" CellPadding="2" стил="граница надясно: 1 твърди #C0C0C0; Долна граница: 1 твърди #C0C0C0; стил на граница наляво: твърди; гранично-ляво ширина: 1; гранично-отгоре стил: твърди; гранично-отгоре-ширина: 1;"> <TR> <TD Подравняване="център"> <таблица граница="1" ширина="100%"> <!-- За всеки статус, които искаме да графика, Ние наричаме "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:шаблон> <!-- Този шаблон е работа на показване на отделни редове в стълбовидната графика. Вие вероятно ще направи повечето от вашите ощипвам тук. --> <XSL:шаблон Име="ShowBar"> <XSL:param Име="BarDisplayLabel" /> <!-- етикет за показване --> <XSL:param Име="BarPercent"/> <!-- Процента от общата сума. --> <XSL:param Име="QueryFilterFieldName"/> <!-- Използвана за преход към заявката & филтър --> <XSL:param Име="QueryFilterFieldValue"/> <!-- Използвана за преход към заявката & филтър --> <XSL:param Име="TotalItems" /> <!-- Общият брой на тази barlabel --> <TR> <!-- Лентата етикет на самата. --> <TD клас="MS-formbody" ширина="30%"> <!-- Този следващия набор от отчети се основава на низ за заявка, който ни позволява да пробия филтриран изглед на базовите данни. Ние се използват за няколко неща тук: 1. Ние може да премине FilterField1 и FilterValue1 към списък за филтриране на колона. 2. SharePoint е преминаване ключов параметър за нас, ListUrlDir, който сочи към основния списък, срещу които този DVWP се "работи". Не е забавно XSL? --> <XSL:текст забрани продукция бягство="Да"> <![НЕЗАТВОРЕН[<a href ="]]></XSL:текст> <XSL:стойността на Изберете="$ListUrlDir"/> <XSL:текст забрани продукция бягство="Да"><![НЕЗАТВОРЕН[?FilterField1 =]]></XSL:текст> <XSL:стойността на Изберете="$QueryFilterFieldName"/> <XSL:текст забрани продукция бягство="Да"><![НЕЗАТВОРЕН[&FilterValue1 =]]></XSL:текст> <XSL:стойността на Изберете="$QueryFilterFieldValue"/> <XSL:текст забрани продукция бягство="Да"><![НЕЗАТВОРЕН[">]]></XSL:текст> <XSL:стойността на Изберете="$BarDisplayLabel"/> <XSL:текст забрани продукция бягство="Да"><![НЕЗАТВОРЕН[</а>]]></XSL:текст> <!-- Следващите малко показва някои числа във формат: "(общо / % от общата сума)" --> (<XSL:стойността на Изберете="$TotalItems"/> / <!-- Това създава приятен процент етикет за нас. Благодаря, Microsoft! --> <XSL:повикване-шаблон Име="percentformat"> <XSL:с Албена Име="процента" Изберете="$BarPercent"/> </XSL:повикване-шаблон>) </TD> <!-- Най-накрая, излъчват <TD> етикет за лентата на самата.--> <TD> <таблица CellPadding="0" CellSpacing="0" граница="0" ширина="{кръг($BarPercent * 100)+1}%"> <TR BGColor="червен"> <XSL:текст забрани продукция бягство="Да"><![НЕЗАТВОРЕН[&nbsp;]]></XSL:текст> </TR> </таблица> </TD> </TR> </XSL:шаблон> <!-- Това е взето директно от някои XSL, намерих в шаблон на MS. --> <XSL:шаблон Име="percentformat"> <XSL:param Име="процента"/> <XSL:Изберете> <XSL:Когато тест="Форматиране на число($процента, '#,##0%;-#,##0%')= "NaN"">0%</XSL:Когато> <XSL:в противен случай> <XSL:стойността на Изберете="Форматиране на число($процента, '#,##0%;-#,##0%')" /> </XSL:в противен случай> </XSL:Изберете> </XSL:шаблон> </XSL:стилове>

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

XSL отгоре генерира тази графика:

Изображение

Пробийте съответните данни, като щракнете върху кода на състоянието:

Изображение

Заключителни мисли:

Може ли това да се обобщи?

Обичам тази графики концепция, но аз мразя факта, че трябва да направим толкова много ръчно кодиране. Аз бях даден малко мисъл за това дали тя може да се обобщи и съм оптимист, но аз също съм малко страх, че може да има една тухлена стена някъде по пътя, който няма да предложи всякаква работа-наоколо. Ако някой има някои добри идеи за това, Молим да отбележите в коментарите или пишете ми.

Вертикална графики:

Това е хоризонтална лента графика. Това със сигурност е възможно да се създаде вертикална графика. Ние просто трябва да се промени HTML. Аз ще започна по същия начин: Създаване на HTML представителство на вертикален графика бар и след това да разбера как да получите, че чрез XSL. Ако някой се интересува от това, Може да бъде убеден да го изпробвате и да работят на kinks. Ако някой вече е направил това, моля, уведомете ме и с удоволствие ще направя връзка към вашия блог 🙂

Аз мисля, че предизвикателството с вертикална графика е, че етикетите за графиката са по-трудни за управление, но със сигурност не impossible.

Поле име Пипнах:

Има най-малко две неща да се внимава с вашите имена на полета.

Първо, име на поле с пространство трябва да бъде екраниран в XSL. Това вероятно ще бъде проблем тук:

        <XSL:променлива Име="totalProposed" 
Изберете="брой(/dsQueryResponse/редове/ред[нормализира-пространство(@Status) = "Предложени"])" />

Ако състоянието си"" колона всъщност е наречен "код на състоянието" тогава ще трябва да го позоваване като "Status_x0020_Code":

   <XSL:променлива Име="totalProposed" 
Изберете="брой(/dsQueryResponse/редове/ред[нормализира-пространство(@Status_x0020_Code) = "Предложени"])" />

Секунда, и аз съм малко размита в това, но вие също трябва да бъдат нащрек за поле име промени. Ако име на вашето поле "код на състоянието" а по-късно, Преименувайте го на "AFE статус", "вътрешно име" не се променя. Вътрешно име все още ще бъде "код на състоянието" и трябва да бъде упомената като "Status_x0020_Code". "Други ресурси" връзки може да диагностицира и коригира този род на проблема.

За този цвят:

Вдигнах "червено" защото това е приятен за мен в момента. Не е голяма работа да покаже различни цветове да се предоставят повече от просто визуална описание на число, но също така предоставя полезни KPI. За пример, Ако процентът на "застой" На AFE е > 10% след това го показват червен, иначе го покаже в черно. Употреба <XSL:Изберете> за да постигнем това.

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

Честит трансформиране!

<край />

Абонирайте се за моя блог!

Настоящите OM данни чрез списък по избор (или, Още друг OM данни Displayor [подобно на YACC, но различни])

Днес, Прекарах една шепа часове се проследи основната причина зад съобщение "името на колоната, което въведохте вече се използва или запазени за. Изберете друго име."

Колоната на въпросните може да бъде създаден, изтрита и създадена отново в друга среда, така че аз знаех, че не е запазено име. Въпреки това, Аз просто не можах да намеря колоната навсякъде чрез стандартния потребителски интерфейс на SharePoint във всеки сайт в колекцията от сайтове.

Аз афиш на Тук във форумите на MSDN и несломимия Андрю Удуърд ми посочи в посоката на основните данни за модел на обект.

Отиде в CodePlex за да намерите някои инструменти, които ще ми помогнат връстници в основните OM данни и помощ ми Намерете неприятности.

Аз tried няколко оръдие и те са много готино и интересно, но в крайна сметка, UI не е достатъчно добра за моята цел. Аз не съм ги критикува с всякакви средства, но ясно инструмент-създателите не са ми проблем в ума, когато те създават своите потребителски интерфейс :). Повечето хора изглежда да се инвестира справедлива стойност на време и усилия в създаването на работна станция / клиентски приложения, които осигуряват дърво пъти видяна, Щракнете с десния бутон контекст menus и т.н.. Това са хубаво и всички, но това е много работа, за да създадете най на на ред потребителски опит, който е също много гъвкави.

Аз действително нужда отговор на този проблем. Това ми хрумна, че ако мога да получа всички от колоните на сайта в колекцията от сайтове в списък по избор, Мога да филтрира, сортирате и създавате изгледи, които ще помагам me намирам този предполага съществуваща колона (който го е направил, BTW). Отидох напред и да направи това и един час или два по-късно, имаше колони на моя сайт натоварени в списък по избор с групиране, сортиране и т.н.. Аз намерих отговор пет минути по-късно.

Ако успешно поеме света, Мисля, че ще указ, че всички SharePoint инструменти доставчици трябва сериозно да обмислят настилка им обект модел на данните в списък по избор. По този начин, Имам право за да търсите някоя другото искам (ограничени, Разбира се, от функциите на стандартния sharepoint).