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