Обзор и цели
Из коробки, МОСС’ Веб-часть запроса содержимого (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 имя="значение" |
Это было невероятно полезным. Спасибо!
ААА… Это было, потому что я назвал мой стиль списка по-разному и не понимал, что в ContentQueryMain.xsl он ищет «стиль»:
<XSL:Когда test="@Style='NameOfMyStyle'»>
С этим переименован он работал. 🙂
Он почти работал для меня: Управлять для вывода </Таблица> закрывающий тег правильно, Однако отсутствует начальный тег. Это кажется тест = "$ CurPos = 1" значение true не возвращается. Но почему?
Великий пост. Павел, я сделал все выше вещи. У меня есть запрос, как можно достичь, сумма «общая фактические расходы" или сумма стоимости двух столбцов.
Вы сделали любую работу с создания пользовательских файлов ContentQueryMain и ItemStyle xsl? Я спрашиваю это, что я не хочу, чтобы беспокоиться о моем пользовательских стилей, перезаписи с любых исправлений или обновлений. Есть ли у вас примеры? Я пытался сделать точную копию ContentQueryMain.xsl и загрузки этой новой пользовательской копии в библиотеку стилей. Когда положить ссылку на этот файл xsl в .webpart MainXslLink собственности, Я получаю 401 не авторизован. Настраиваемый xsl-файл является опубликованной версии, и каждый имеет доступ на чтение к нему.
фантастический пост спасибо! Сражаясь с этим сейчас за последние несколько дней.
Привет, Это было действительно полезно проводки. У меня это все работает, и изменения также реализовано Майк Браун так ИТ-групп
результаты внутри таблицы, все, что я выбираю как параметр Group By в свойствах CQWB.
Я сделал название ссылку также, так он работает хорошо. Я до сих пор одна проблема, Хотя. Я Группировка результатов по имени узла. Внутри таблицы, Он группирует их красиво, и это выглядит здорово, но это еще печать из всей группы
имена(в моем случае имена сайтов) над таблицей. Кто-нибудь знает как избавиться от них?
Спасибо,
Грег
Nice статьи. Мне удалось дать моим столом вид списков Sharepoint по умолчанию, анализируя исходный код списка. Вот основные блоки HTML, необходимо чтобы он поместился в ItemStyle:
<Таблица ширина = "100%" класс = "ms-listviewtable" граница = 0 cellspacing = 0 cellpadding = 1 dir = «None»>
<!–ЗАГОЛОВОК–>
<TR класс = "ms-viewheadertr" VALIGN = TOP>
<Й nowrap область = "col" класс = «ms-vh2»><Div стиль = "ширина:100%;позиция:относительная;слева:0;Вверх:0;">
<Стиль таблицы = "ширина:100%;" CtxNum = "1" Высота = 100%" CellSpacing = 1 cellpadding = 0 класс = «ms-unselectedtitle»>
<TR>
<ТД ширина = "100%" Класс = "ms-vb" nowrap>
Texte du титр ici
</ТД>
<ТД стиль = "позиция:абсолютное;">
</ТД>
</TR>
</ТАБЛИЦА></Div>
</TH>
<!–Повторите для всех ячеек заголовков–>
</TR>
<!– Данные таблицы –>
<Класс TR = «»>
<!–Столбец данных, Используйте Павла код для первого с гиперссылкой –>
<TD Class = «ms-vb2»>Данные здесь</ТД>
<!–Пустой столбец–>
<TD Class = «ms-vb2»>
<диапазон dir = нет></диапазон><
/ТД>
<!–В столбце Дата–>
<TD Class = «ms-vb2»>
<NOBR>11/12/2008</NOBR>
</ТД>
</TR>
<!–***Альтернативные строка – Используйте переменную XSL, которая будет вставить альтернативного класса, основанный на текущей строке по модулю 2–>
<TR класс = «ms чередование»>
…
</TR>
</ТАБЛИЦА>
Thatz точно я искал...Ты скала человек...Да здравствует...Люблю тебя за пост..
<XSL:применить шаблоны выберите =»." режим = «itemstyle»>
<XSL:имя с param = «CurPos" Выберите = "$ CurPosition" />
<XSL:имя с param = "последний" Выберите = "$ LastRow" />
<XSL:имя с param = «StartNewGroup" Select="@__begingroup" />
</XSL:когда>
<XSL:когда тест = "$StartNewGroup = «True»»>
<TR>
<ТД >
<XSL:вызов шаблон name="OuterTemplate.GetGroupName»>
<XSL:имя с param = "имя_группы" Select="@*[имя()=$ Группа]"/>
<XSL:имя с param = «GroupType" Выберите = «$ GroupType» />
</XSL:вызов шаблон>
</ТД>
</TR>
</XSL:когда>
<XSL:в противном случае>
</XSL:в противном случае>
</XSL:выбрать>
Привет Павел,
При работе с веб-часть xml/xsl и содержание запроса, нашли ли вы какие-либо хорошие способы для форматирования ваших xslt? Пытаясь внести изменения и тест дизайн оказывается право боль в ** только с помощью текстового редактора…
Всего наилучшего
(Например. https://myweb.com/Marketing/images/icn-order.gif, )
Следует использовать изображение или фотографию в типе поля CommonViewFields? (Например. InternalColumnName, Изображение)
Ваше сообщение является именно то, что я искал. Однако, Я не могу получить его на работу.
У меня есть документы, которые хранятся в различных doc. библиотеки, но объявления с помощью столбца пользовательского класса (Выбор: 1 или 2. Я хочу использовать CQWP, чтобы показать эти документы, на основе их класса.
Я был в состоянии добавить CQWP, экспортировать его в СДПГ, Настройка itemStyle.xls для отображения настраиваемых полей в представлении списка. Однако, Я не мог успешно реализовать, что вы описали здесь.
Этими значениями являются столбцы, которые я хочу показать в моем CQWP:
Тип файла (чтобы показать значок)
Название файла
Дата последнего изменения
Изменение ВОЗ
Извлечен
Проверил в комментариях
В настоящее время у меня результат в виде списка. Как изменить его формат talble.
Спасибо.
Садзи
Извините за missspelling на мое имя, не уверен, где ” пришли из.