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

Остерегайтесь критические изменения в ItemStyle.xsl

Я работал с ItemStyle.xsl, чтобы настроить внешний вид веб-части запросов содержимого и права о обеденное время, Я сделал критические изменения в XSL. Я не понимаю его, но это имело далеко идущие последствия во всем семействе сайтов. Я отправился на обед и после моего возвращения, заметил это сообщение появляется в кучу мест:

Не удается отобразить эту веб-часть. Для устранения проблемы, Откройте эту веб-страницу в совместимых с Windows SharePoint Services HTML редакторе, таком как Microsoft Office SharePoint Designer. Если проблема сохранится, обратитесь к администратору веб-сервера.

Я винить клиента (не пока еще не понимая, что это была моя вина в данный момент) но со временем заметил, что visual studio intellisense была предупреждение меня что искаженной XSL. Я исправить это и все начали работать.

Будьте darned внимательны при работе с ItemStyle.xsl (и любой из глобальной XSL-файлов) — разорвать их затрагивает множество артефактов в семействе узлов.

<конец />

Отображения содержимого запросов веб-части результаты в сетке / Таблица

Обзор и цели

Из коробки, МОСС’ Веб-часть запроса содержимого (CQWP) Отображает результаты в виде списка, аналогичные результаты поиска. Это также возможно для отображения результатов в виде сетки (т.е.. Формате HTML-таблицы). Сетку форматы лучше в некоторых обстоятельствах. Я опишу, как добиться этого эффекта в этой статье.

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

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

изображение

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

Я всегда себе результат прежде чем погрузиться в XSL, потому что XSL это кошмар. Вот мой желаемый результат:

изображение

HTML как это создает результат:

<HTML>
 <тело>
 <центр>
 <Таблица граница= 1>

<!-- Этикетки-->
 <TR bgcolor= синий>
 <ТД><шрифт Цвет= белый><b>Название проекта</b></шрифт></ТД>
 <ТД Выравнивание= правый><шрифт Цвет= белый><b>Полная дата</b></шрифт></ТД>
 <ТД Выравнивание= правый><шрифт Цвет= белый><b>Бюджет</b></шрифт></ТД>
 <ТД Выравнивание= правый><шрифт Цвет= белый><b>Фактические расходы</b></шрифт></ТД>
 <ТД><шрифт Цвет= белый><b>Общее состояние</b></шрифт></ТД>
 </TR>

<TR>
 <ТД>Re-Wire компьютерный зал.</ТД>
 <ТД Выравнивание= правый>02/01/08</ТД>
 <ТД Выравнивание= правый>22,500.00</ТД>
 <ТД Выравнивание= правый>19,000.00</ТД>
 <ТД>В процессе</ТД>
 </TR>

<TR>
 <ТД>Предоставление серверы для обновления SQL</ТД>
 <ТД Выравнивание= правый>04/01/08</ТД>
 <ТД Выравнивание= правый>7,500.00</ТД>
 <ТД Выравнивание= правый>0.00</ТД>
 <ТД>Запланированные</ТД>
 </TR>

</Таблица>
 </центр>
 </тело>
</HTML>

Подход

Выполните следующие действия для создания сетки:

  1. Идентификация компонентов сетки (строк/столбцов).
  2. Определить и создать столбцы необходимые сайта.
  3. Создайте sub сайты для проектов и списки Синглтон.
  4. Добавить CQWP на веб-страницу и настроить его для поиска для ваших списков.
  5. Измените XML CQWP, чтобы собрать дополнительные столбцы.
  6. Изменить значение XSL для создания таблицы.

Я собираюсь сосредоточиться на номер 6. Номера один через четыре являются прямо вперед и то, что любой пользователь CQWP уже сделали. Номер пять был документально другими включая этот исчерпывающий экран shot груженого статьи из MSDN Здесь (http://msdn2.microsoft.com/en-us/library/bb897399.aspx) и Heather Solomon's блог Здесь (http://www.heathersolomon.com/blog/articles/CustomItemStyle.aspx).

Гайки и болты

Начать и осуществлять шаги 1-5 согласно документации MSDN и Хизер Соломон статьи.

В этой точке, Вы добавили свой CQWP на страницу и у вас есть ваш <CommonViewFields> настроены при необходимости.

После обычных шагов, Я получаю эти промежуточные результаты:

1. Создание типа контента, templatized настраиваемого списка для данного типа содержимого и два места. Вот типа контента:

изображение

Вот структура сайта:

изображение

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 и флип над Heather Solomon's статьи. Следуйте ее шаги, начиная вблизи шаг #5 для создания настраиваемого / отсоединенных от шаблона версии ItemStyle.xsl. Я следовать советам Heather, через шаг 11 и получить эти промежуточные результаты:

4.1: Имя XSL-шаблон следующим:

<XSL:имя шаблона = «сетка" матч = "строка[@Style = 'Grid']" режим = «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:с param имя="EditMode" Выберите="$cbq_iseditmode" />
        </XSL:применить шаблоны>
      </XSL:когда>
      <XSL:когда тест="@Style = 'NewsBigItem'">
        <XSL:применить шаблоны Выберите="." режим="ItemStyle">
          <XSL:с param имя="CurPos" Выберите="$CurPosition" />
        </XSL:применить шаблоны>
      </XSL:когда>
      <XSL:когда тест="@Style = 'NewsCategoryItem'">
        <XSL:применить шаблоны Выберите="." режим="ItemStyle">
          <XSL:с param имя="CurPos" Выберите="$CurPosition" />
        </XSL:применить шаблоны>
      </XSL:когда>

      <!--
              Передать шаблон itemstyle.xsl сетки текущей позиции и lastrow.
              ItemStyle.xsl будет использовать это, чтобы излучать открытой и закрытия <Таблица> Теги.
      -->
      <XSL:когда тест="@Style = 'Grid'">
        <XSL:применить шаблоны Выберите="." режим="ItemStyle">
          <XSL:с param имя="CurPos" Выберите="$CurPosition" />
          <XSL:с param имя="Последний" Выберите="$LastRow" />
        </XSL:применить шаблоны>
      </XSL:когда>

      <XSL:в противном случае>
        <XSL:применить шаблоны Выберите="." режим="ItemStyle">
        </XSL:применить шаблоны>
      </XSL:в противном случае>
    </XSL:выбрать>
  </XSL:шаблон>

Комментарии описывают цель изменения.

Конечно, «OuterTemplate.CallItemTemplate" сам вызывается из другого шаблона. Найти этот шаблон для этой строки текста:

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

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

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

После все это, Мы наконец создали вещей должным образом так, что наши ItemStyle.xsl может излучать <Таблица> Теги в нужном месте.

ItemStyle.Xsl

ПРИМЕЧАНИЕ: Снова, Регистрация ItemStyle.xsl после внесения любых изменений, так что вы увидите эффект этих изменений.

У нас есть две задачи здесь:

  • Заменить весь шаблон сетки. Вы можете копировать/вставить снизу.
  • Добавьте некоторые mumbo jumbo вне определения шаблона, который позволяет «formatcurrency" шаблон для работы. (Вы можете сказать, что у меня разреженной ручку на XSL).

Первый, в верхней части ItemStyle.xsl, Добавьте эту строку:

  <!-- Некоторые фетиш, что позволяет нам для отображения США. Валюта. -->
  <XSL:десятичный формат имя="персонал" цифра="D" />

  <XSL:шаблон имя="По умолчанию" матч="*" режим="ItemStyle">

Обратите внимание, что я добавил его непосредственно перед <XSL:имя шаблона = «значения по умолчанию" …> определение.

Следующая, вернуться к нашей сетки шаблон. Замените на код ниже весь шаблон сетки. Он тщательно прокомментировал, но не стесняйтесь, напишите мне или оставить комментарии на моем блоге, если у вас есть вопросы.

  <XSL:шаблон имя="Сетка" матч="Строка[@Style = 'Grid']" режим="ItemStyle">

    <!--
      ContentMain.xsl проходит CurPos и последний.
      Мы используем эти условно выпустить под открытым небом и закрытия <Таблица> Теги.
    -->
    <XSL:Param имя="CurPos" />
    <XSL:Param имя="Последний" />

    <!-- Следующие переменные неизмененной от стандартной ItemStyle.xsl -->
    <XSL:переменная имя="SafeImageUrl">
      <XSL:вызов шаблон имя="OuterTemplate.GetSafeStaticUrl">
        <XSL:с param имя="UrlColumnName" Выберите="«ImageUrl»"/>
      </XSL:вызов шаблон>
    </XSL:переменная>
    <XSL:переменная имя="SafeLinkUrl">
      <XSL:вызов шаблон имя="OuterTemplate.GetSafeLink">
        <XSL:с param имя="UrlColumnName" Выберите="«LinkUrl»"/>
      </XSL:вызов шаблон>
    </XSL:переменная>
    <XSL:переменная имя="DisplayTitle">
      <XSL:вызов шаблон имя="OuterTemplate.GetTitle">
        <XSL:с param имя="Название" Выберите="@Title"/>
        <XSL:с param имя="UrlColumnName" Выберите="«LinkUrl»"/>
      </XSL:вызов шаблон>
    </XSL:переменная>
    <XSL:переменная имя="LinkTarget">
      <XSL:Если тест="@OpenInNewWindow = «True»" >_blank</XSL:Если>
    </XSL:переменная>

    <!--
      Здесь мы определяем переменную, «tableStart».  Это содержит HTML-код, который мы используем для определения открытия таблицы, а также заголовки столбцов.  Обратите внимание, что если CurPos = 1, Она включает в себя HTML-код в теге CDATA.
      В противном случае, Он будет пустым.

      TableStart значение emited при каждом вызове ItemStyle через ContentQueryMain.xsl.
    -->
    <XSL:переменная имя="tableStart">
      <XSL:Если тест="$CurPos = 1">
        <![CDATA[
        <границы таблицы = 1>
          <TR bgcolor = «blue»>
            <ТД><цвет шрифта = «белый»><b>Название проекта</b></шрифт></ТД>
            <выровнять TD = «право»><цвет шрифта = «белый»><b>Полная дата</b></шрифт></ТД>
            <выровнять TD = «право»><цвет шрифта = «белый»><b>Бюджет</b></шрифт></ТД>
            <выровнять TD = «право»><цвет шрифта = «белый»><b>Фактические расходы</b></шрифт></ТД>
            <ТД><цвет шрифта = «белый»><b>Общее состояние</b></шрифт></ТД>
          </TR>
        ]]>
      </XSL:Если>
    </XSL:переменная>

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

      Как с tableStart, Это всегда emited.  Вот почему его значение будет назначено условно основе ли мы принят последний ряд ContentQueryMain.xsl.
    -->
    <XSL:переменная имя="tableEnd">
      <XSL:Если тест="$CurPos = $Last">
        <![CDATA[ </Таблица> ]]>
      </XSL:Если>
    </XSL:переменная>

    <!--
      Всегда выдавать содержимое tableStart.  Если это не первая строка передается нам по ContentQueryMain.xsl, Тогда мы знаем, что его значение будет пустым.

      Отключение вывода побега, потому что когда tableStart он не пустой, Она включает в себя фактические HTML, который мы хотим быть к просмотру в браузере.  Если мы не рассказать анализатору XSL, чтобы отключить выход побега, Он будет генерировать такие вещи, как»&lt;Таблица&gt;" вместо в»<Таблица>".
    -->
    <XSL:Стоимость от Выберите="$tableStart" disable-output-escaping="Да"/>


    <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
      -->
      <ТД>
        <XSL:Стоимость от Выберите="@Project_x005F_x0020_Name"/>
      </ТД>

      <ТД Выравнивание="право">
        <XSL:Стоимость от Выберите="@Project_x005F_x0020_End_x005F_x0020_Date"/>
      </ТД>

      <ТД Выравнивание="право">
        <XSL:вызов шаблон имя="FormatCurrency">
          <XSL:с param имя="значение" 
Выберите="@Project_x005F_x0020_Budget"></XSL:с param> </XSL:вызов шаблон> </ТД> <ТД Выравнивание="право"> <XSL:вызов шаблон имя="FormatCurrency"> <XSL:с param имя="значение" Выберите="@Project_x005F_x0020_Expenses">
</XSL:с param> </XSL:вызов шаблон> </ТД> <ТД> <XSL:Стоимость от Выберите="@Project_x005F_x0020_Status"/> </ТД> <!-- Все следующие закомментирован прояснить вещи. Однако, вернуть его обратно и вещи его в <ТД> чтобы увидеть его эффект. --> <!-- <div id = "linkitem" класс = «элемент»> <XSL:Если тест = «длина строки($SafeImageUrl) != 0»> <Div class = «изображение площадь левых»> <a href = "{$SafeLinkUrl}" целевых = "{$LinkTarget}"> <IMG класс = "изображение фиксированной ширины" src = "{$SafeImageUrl}"
Alt = "{@ImageUrlAltText}"/> </в> </Div> </XSL:Если> <Div класс = «связь элемент»> <XSL:вызов шаблон
Name="OuterTemplate.CallPresenceStatusIconTemplate"/> <a href = "{$SafeLinkUrl}"
целевых = "{$LinkTarget}" название = "{@LinkToolTip}"> <XSL:значение из выберите = «$ DisXSLyTitle» /> </в> <Div class = «описание»> <XSL:значение из select="@Description" /> </Div> </Div> </Div>
--> </TR> <!-- Выделяют закрытия таблицы тегов. Если мы не в последней строке, Это будет пустым. --> <XSL:Стоимость от Выберите="$tableEnd" disable-output-escaping="Да"/> </XSL:шаблон> <XSL:шаблон имя="FormatCurrency"> <XSL:Param имя="значение" Выберите="0" /> <XSL:Стоимость от Выберите='номер формата($значение, «$ DDD,DDD,DDD.EDC, «персонал»)' /> </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/

Несколько раз в неделю, Если не ежедневно, Форум пользователей описывают это требование обычно будут удовлетворяться через каскадных раскрывающихся списков. Например, У меня есть два раскрывающихся элементов управления:

  • Список США. государства
  • Список США. города.

Как ответственные поставщики пользовательского интерфейса, Мы хотим работать, как это:

  • Павел выбирает США. состояние из раскрывающегося списка.
  • Это вызывает городов раскрывающийся список для фильтрации только те города, которые принадлежат к выбранное состояние.
  • Павел выбирает город из отфильтрованного списка.

Нет поддержки для этой функции out-of--box. На самом деле, нет поддержки OOB за любого рода прямой внутри формы коммуникации. Это включает программное скрытие/включение/отключение поля в ответ на изменения области в другом месте на форме.

Реальная цель этой статьи к для того чтобы описать возможные решения и эти варианты как я их знаю:

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

Если кто знает другие или более вариантов, Просьба оставить комментарий и я буду обновлять тело этого поста.

<конец />

Бирки Technorati:

Создайте бар графики в SharePoint

Обзор:

(ОБНОВЛЕНИЕ 12/04/07: В конце ссылки на другой блог, который решает эту проблему через очень интересный веб-часть добавлен еще один интересный ресурс)

Эта запись в блоге описывает как создать гистограмму в SharePoint. Это работает в средах с WSS и MOSS, как это только зависит от веб-части представления данных.

Общий подход заключается в следующем:

  1. Создать список или библиотеку документов, содержащую данные вы хотите, чтобы график.
  2. Место связанный документ Библиотека / настраиваемого списка на страницу и преобразовать его в веб-части представления данных (DVWP).
  3. Измените DVWP XSL для создания HTML-кода, который показывает как граф.

Бизнес-сценарий / Установка:

Я создал пользовательский список в столбце стандартный заголовок и один дополнительный столбец, «Статус». Этой модели (очень упрощенно) «Разрешение на счет" сценарий, где название представляет проект и статус значение из списка:

  • Предлагаемые
  • В процессе
  • Тупик

Цель-производить Интерактивный горизонтальный гистограмма, которая показывает эти коды статуса.

Я заполняется список, и это выглядит так:

изображение

Создайте веб-часть представления данных:

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

В дополнение к просто создавать DVWP, нам также необходимо задать свойство подкачки для отображения всех доступных строк. Для меня, Это выглядит примерно так:

изображение

В этой точке, Я всегда закрывать SPD и браузера. Затем я снова открыть страницу с помощью браузера. Это позволяет избежать случайного отводом вверх веб-части макет на странице.

Изменить XSLT:

Теперь пора изменить XSLT.

Я всегда использовать visual studio для этого. (См. Здесь для важное примечание о intellisense, которые помогут вам много).

Создать пустой проект, я добавить четыре новых файлов (заменить слова «оригинал" и «New" При необходимости):

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

В моем случае, Он выглядит следующим образом:

изображение

Изменить веб-часть и скопируйте params и XSL на «оригинал" версия в Visual Studio.

Цель здесь заключается в том, чтобы вызвать XSL для преобразования результатов, которые мы получаем обратно от DVWP запроса в HTML-код, отображаемый как граф.

С этой целью, Это помогает сначала рассмотреть, что HTML должен выглядеть, прежде чем мы запутаться, безумие, которая известна как «XSL». (Чтобы быть ясно, Ниже приведен лишь в качестве примера; не введите или скопируйте в visual studio. Я предоставить полный удар отправной точкой для этого позже в рецензии). На следующем графике образец подготавливается к просмотру как HTML-код сразу после:

Пример СТОЛБЧАТОМ

Соответствующий HTML:

<HTML>
<тело>
<центр>
<ширина стола = 80%>
<TR><ТД><центр>Горизонтальные гистограммы</ТД></TR>
<TR>
<выровнять TD = «центр»>
<границы таблицы = "1" Ширина = 80%>
<TR>
<Ширина TD = 10%>Открытые</ТД>
<ТД><Таблица cellpadding ="0" CellSpacing ="0" граница = 0 ширина = 50%><TR bgcolor = красный><ТД>&nbsp;</ТД></TR></Таблица></ТД>
</TR>
<TR>
<Ширина TD = 10%>Закрыто</ТД>
<ТД><Таблица cellpadding ="0" CellSpacing ="0" граница = 0 ширина = 25%><TR bgcolor = красный><ТД>&nbsp;</ТД></TR></Таблица></ТД>
</TR>
<TR>
<Ширина TD = 10%>Тупик</ТД>
<ТД><Таблица cellpadding ="0" CellSpacing ="0" граница = 0 ширина = 25%><TR bgcolor = красный><ТД>&nbsp;</ТД></TR></Таблица></ТД>
</TR>
</Таблица>
</ТД>
</TR>
</Таблица>
</тело>
</HTML>

Я использовал мертвым простой подход к созданию моего баров, установив цвет фона строки «красный».

Вынос вот это: В конце концов, все, что мы делаем является создание HTML со строками и столбцами.

Шаблон XSLT:

Я скопировал XSLT, который создает горизонтальную гистограмму. Это довольно хорошо прокомментировал, так что я не добавить много здесь за исключением эти примечания:

  • Я начал с по умолчанию XSL, что SharePoint Designer дал мне, когда я впервые создал DVWP.
  • Я был в состоянии сократить это от SPD 657 линии для 166 линии.
  • Я не возиться с XML-файл параметров (который является отдельным от XSL и вы будете знать, что я имею в виду, когда вы идете изменить сам DVWP; есть два файла, которую можно изменить). Однако, для того, чтобы упростить его, Я удалить почти все из них от XSL. Это означает, что если вы хотите, чтобы использовать эти параметры, Вам просто нужно добавить их определений переменных XSL. Это будет легко, так как вы будете иметь оригинальный определения переменных XSL в проекте visual studio.
  • Вы должны иметь возможность копировать и вставлять это прямо в свой проект visual studio. Затем, удалить мои звонки и вставьте ваши собственные вызовы на «ShowBar».
  • Детализация работает путем создания <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 o 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> <ТД Выравнивание="центр"> <Таблица граница="1" Ширина="100%"> <!-- Для каждого статуса, который мы хотим построить график, Мы называем «ShowBar" шаблон. Мы передаем его: 1. Метка строки. Это превращается в гиперссылку. 2. Процент (переменная с выше). 3. Имя поля кода из базового списка. Это не должны совпадать с меткой дисплей. 4. Значение поля соответствия для #3. 5. Всего элементов этого кода состояния (не итог всех кодов состояния). Он испускает <TR></TR> и линии горизонтальной гистограммы. Мы называем этот шаблон для каждого кода состояния, которые мы хотим посмотреть. --> <XSL:вызов шаблон имя="ShowBar"> <XSL:с param имя="BarDisplayLabel" Выберите="«Предложил»"/> <XSL:с param имя="BarPercent" Выберите="$percentProposed"/> <XSL:с param имя="QueryFilterFieldName" Выберите="«Статус»"/> <XSL:с param имя="QueryFilterFieldValue" Выберите="«Предложил»"/> <XSL:с param имя="TotalItems" Выберите="$totalProposed"></XSL:с param> </XSL:вызов шаблон> <XSL:вызов шаблон имя="ShowBar"> <XSL:с param имя="BarDisplayLabel" Выберите="«В тупике»"/> <XSL:с param имя="BarPercent" Выберите="$percentStalled"/> <XSL:с param имя="QueryFilterFieldName" Выберите="«Статус»"/> <XSL:с param имя="QueryFilterFieldValue" Выберите="«В тупике»"/> <XSL:с param имя="TotalItems" Выберите="$totalStalled"></XSL:с param> </XSL:вызов шаблон> <XSL:вызов шаблон имя="ShowBar"> <XSL:с param имя="BarDisplayLabel" Выберите="«В процессе»"/> <XSL:с param имя="BarPercent" Выберите="$percentInProcess"/> <XSL:с param имя="QueryFilterFieldName" Выберите="«Статус»"/> <XSL:с param имя="QueryFilterFieldValue" Выберите="«В процессе»"/> <XSL:с param имя="TotalItems" Выберите="$totalInProcess"></XSL:с param> </XSL:вызов шаблон> </Таблица> </ТД> </TR> </Таблица> </XSL:в противном случае> </XSL:выбрать> </XSL:шаблон> <!-- Этот шаблон выполнит работу отображения отдельных линий в гистограмме. Вы, вероятно, сделать большую часть вашего настройки здесь. --> <XSL:шаблон имя="ShowBar"> <XSL:Param имя="BarDisplayLabel" /> <!-- Метка, чтобы показать --> <XSL:Param имя="BarPercent"/> <!-- Процент от общего числа. --> <XSL:Param имя="QueryFilterFieldName"/> <!-- Используется для перехода к запросу & фильтр --> <XSL:Param имя="QueryFilterFieldValue"/> <!-- Используется для перехода к запросу & фильтр --> <XSL:Param имя="TotalItems" /> <!-- Общее количество этого barlabel --> <TR> <!-- Метка сама. --> <ТД класс="MS-formbody" Ширина="30%"> <!-- Это следующий набор инструкций строит строку запроса, что позволяет детализировать отфильтрованного представления базовых данных. Мы делаем использовать несколько вещей здесь: 1. Мы можем передать FilterField1 и FilterValue1 в списке, чтобы отфильтровать по столбцу. 2. SharePoint передача параметра key нам, ListUrlDir, который указывает в базовый список, против которого этот DVWP «работает». Не весело XSL? --> <XSL:текст disable-output-escaping="Да"> <![CDATA[<a href ="]]></XSL:текст> <XSL:Стоимость от Выберите="$ListUrlDir"/> <XSL:текст disable-output-escaping="Да"><![CDATA[?FilterField1 =]]></XSL:текст> <XSL:Стоимость от Выберите="$QueryFilterFieldName"/> <XSL:текст disable-output-escaping="Да"><![CDATA[&FilterValue1 =]]></XSL:текст> <XSL:Стоимость от Выберите="$QueryFilterFieldValue"/> <XSL:текст disable-output-escaping="Да"><![CDATA[">]]></XSL:текст> <XSL:Стоимость от Выберите="$BarDisplayLabel"/> <XSL:текст disable-output-escaping="Да"><![CDATA[</в>]]></XSL:текст> <!-- Следующий бит показывает некоторые цифры в формате: "(Итого / % от общего числа)" --> (<XSL:Стоимость от Выберите="$TotalItems"/> / <!-- Это создает хороший процент метку для нас. Спасибо, Microsoft! --> <XSL:вызов шаблон имя="percentformat"> <XSL:с param имя="процент" Выберите="$BarPercent"/> </XSL:вызов шаблон>) </ТД> <!-- Наконец, выделяют <ТД> тег для бара сам.--> <ТД> <Таблица CellPadding="0" CellSpacing="0" граница="0" Ширина="{раунд($BarPercent * 100)+1}%"> <TR bgcolor="красный"> <XSL:текст disable-output-escaping="Да"><![CDATA[&nbsp;]]></XSL:текст> </TR> </Таблица> </ТД> </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. Если кто заинтересован в том, что, Я мог бы убедить попробовать его и работать изломы. Если кто-то уже сделано, пожалуйста, дайте мне знать, и я с удовольствием ссылку на свой блог 🙂

Я думаю, что проблема с вертикальной графе, что этикетки для графа сложнее управлять, но определенно не невозможно.

Поле имя Гоча:

Есть по крайней мере две вещи следует остерегаться с именами полей.

Первый, должна быть имя поля с пробелом в XSL. Вероятно, это будет вопрос здесь:

        <XSL:переменная имя="totalProposed" 
Выберите="количество(/dsQueryResponse/строк/строки[нормализовать пространства(@Status) = «Предложил»])" />

Если ваш статус"" на самом деле столбец назван «код состояния" Затем вам необходимо сослаться на него как «Status_x0020_Code»:

   <XSL:переменная имя="totalProposed" 
Выберите="количество(/dsQueryResponse/строк/строки[нормализовать пространства(@Status_x0020_Code) = «Предложил»])" />

Второй, и я немного нечеткой на этом, но вы также должны быть начеку для изменения имени поля. Если имя поля «Код состояния" а потом на, переименовать его в «AFE статуса», «внутреннее имя" не изменяется. Внутреннее имя будет по-прежнему «код состояния" и должны быть привязаны как «Status_x0020_Code». «Другие ресурсы" ссылки могут помочь диагностировать и исправить такого рода проблемы.

О что цвет:

Я выбрал «красный" потому что это приятно для меня на данный момент. Не было бы большое дело для отображения различных цветов, с тем чтобы обеспечить больше, чем просто визуального описания ряда, но также предоставлять Полезные КПИ. Например, Если процент «тупик" AFE является > 10% Затем показывают красный, в противном случае показать его в черном. Использование <XSL:выбрать> для достижения этой цели.

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

Счастливые преобразование!

<конец />

Подписаться на мой блог!

Представление данных ом через настраиваемый список (или, Еще еще один Displayor OM данных [как YACC, но разные])

Сегодня, Я провел несколько часов, отследить причину за сообщение «Введенное имя столбца уже используется или зарезервировано. Выберите другое имя."

Этот столбец может быть создан, удаляется и создается заново в другой среде, так что я знал, что это не зарезервированное имя. Однако, Я просто не мог найти столбец нигде через стандартный интерфейс пользователя SharePoint в любом месте в коллекции.

Я написал для Форумы MSDN и неукротимый Эндрю Вудворд указал мне в направлении базовых объектов модели данных.

Я отправился в CodePlex чтобы найти некоторые инструменты, которые помогли бы мне вглядываться в базовых данных ом и помочь мне найти беда.

Я попытался несколько инструментов, и они были очень круто и интересно, но в конце концов, Пользовательский интерфейс не был достаточно хорош для моей цели. Я не критикую их любыми средствами, но очевидно инструмент мейкеров не моя проблема в виду, когда они создали их пользовательского Интерфейса :). Большинство людей, как представляется, инвестирование изрядное количество времени и усилий в создании станции / клиентские приложения, которые предоставляют дерево Просмотров, Щелкните правой кнопкой мыши контекстное меню и так далее. Они славны и все, но это много работы для создания топ лайн пользовательский опыт, который также является весьма гибкой.

Я действительно необходимо ответ на эту проблему. Это произошло на меня, если я мог бы получить все столбцы узлов в семействе узлов в пользовательский список, Я мог бы фильтр, сортировать и создавать представления, которые помогли бы мне найти этот якобы существующего столбца (что он сделал, BTW). Я пошел дальше и сделал и через час или два позже, все мои столбцы сайта загружается в пользовательский список с группировкой, Сортировка и т.д.. Я нашел мой ответ через пять минут.

Если и когда я успешно захватить мир, Я думаю, что будет указ, что все поставщики средств SharePoint должны серьезно рассмотреть вопрос покрытия их объектов модели данных в пользовательский список. Таким образом, Я имею право для поиска какой-либо образом я хочу (ограничены, Конечно, от функций стандартного sharepoint).