Обзор и цели
Из коробки, МОСС’ Веб-часть запроса содержимого (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>
|
Подход
Выполните следующие действия для создания сетки:
- Идентификация компонентов сетки (строк/столбцов).
- Определить и создать столбцы необходимые сайта.
- Создайте sub сайты для проектов и списки Синглтон.
- Добавить CQWP на веб-страницу и настроить его для поиска для ваших списков.
- Измените XML CQWP, чтобы собрать дополнительные столбцы.
- Изменить значение 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, чтобы отключить выход побега, Он будет генерировать такие вещи, как»<Таблица>" вместо в»<Таблица>".
-->
<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:шаблон>
|