Panoramica e obiettivo
Out of the box, MUSCHIO’ Web Part Query contenuto (DISPONIBILI) i risultati verranno visualizzati in formato elenco, simile ai risultati di ricerca. È anche possibile visualizzare i risultati in formato griglia (vale a dire. Formato di tabella HTML). Formati di griglia sono meglio in alcune circostanze. Viene descritto come ottenere questo effetto in questo articolo.
Scenario business
Ho lavorato con un cliente su un lancio MOSS aziendale. Abbiamo progettato loro tassonomia tale che progetti sono cittadini di prima classe nella gerarchia e hanno il proprio sito di livello superiore. Project Manager mantiene un elenco di singleton di informazioni di riepilogo del progetto, come il titolo, bilancio, Data di completamento prevista, budget residuo e altri campi di tipo di riepilogo. Da "singleton" Cioe ' un elenco SharePoint personalizzato garantito per contenere un solo elemento. Semplicisticamente, sembra che questo:
L'approccio tecnico è lo stesso come descritto qui (http://paulgalvin.spaces.live.com/blog/cns!1CC1EDB3DAA9B8AA!447.entry). Il CQWP utilizza una trasformazione XSL per generare HTML per il browser per eseguire il rendering.
Mi immagino sempre il risultato prima di tuffarsi in XSL perché XSL è un incubo. Ecco il mio risultato desiderato:
HTML come questo genera quel risultato:
<html> <corpo> <centro> <tabella confine= 1> <!-- Etichette-> <TR bgcolor= blu> <TD><tipo di carattere Colore= bianco><b>Nome del progetto</b></tipo di carattere></TD> <TD allineare= destra><tipo di carattere Colore= bianco><b>Data completa</b></tipo di carattere></TD> <TD allineare= destra><tipo di carattere Colore= bianco><b>Bilancio</b></tipo di carattere></TD> <TD allineare= destra><tipo di carattere Colore= bianco><b>Spesa effettiva</b></tipo di carattere></TD> <TD><tipo di carattere Colore= bianco><b>Stato complessivo</b></tipo di carattere></TD> </TR> <TR> <TD>Governando la sala computer.</TD> <TD allineare= destra>02/01/08</TD> <TD allineare= destra>22,500.00</TD> <TD allineare= destra>19,000.00</TD> <TD>In corso</TD> </TR> <TR> <TD>Server a disposizione per aggiornare SQL</TD> <TD allineare= destra>04/01/08</TD> <TD allineare= destra>7,500.00</TD> <TD allineare= destra>0.00</TD> <TD>Pianificato</TD> </TR> </tabella> </centro> </corpo> </html> |
Approccio
Attenersi alla seguente procedura per creare la griglia:
- Identificare i componenti della griglia (righe e colonne).
- Definire e creare le colonne del sito necessario.
- Creare siti sub per i progetti e le liste di singleton.
- Aggiungere il CQWP in una pagina web e configurarlo per cercare gli elenchi.
- Modificare XML del CQWP per raccogliere le colonne aggiuntive.
- Modificare il XSL per generare una tabella.
Ho intenzione di concentrarsi sul numero sei. Numeri da uno al quattro sono straight-forward e qualcosa che qualsiasi utente CQWP ha già fatto. Numero cinque è stato ben documentato da altri tra cui esaustivo articolo pieno carico schermata da MSDN qui (http://msdn2.microsoft.com/en-us/library/bb897399.aspx) blog di Heather Solomon e qui (http://www.heathersolomon.com/blog/articles/CustomItemStyle.aspx).
Dadi e bulloni
Avviare e implementare i passaggi da uno a cinque, secondo la documentazione MSDN e articolo di Heather Solomon.
A questo punto, hai aggiunto il tuo CQWP alla pagina e hai il tuo <CommonViewFields> configurato come necessario.
Seguendo la procedura usuale, Ottenere questi risultati intermedi:
1. Creare un tipo di contenuto, un elenco personalizzato templatized per quel tipo di contenuto e due siti. Ecco il tipo di contenuto:
Ecco la struttura del sito:
2. Aggiungere il CQWP dopo la creazione di liste di riepilogo del progetto mio progetto secondari e singleton:
3. Aggiungere tutte le informazioni aggiuntive che voglio tramite il <CommonViewFields>:
<Proprietà nome="CommonViewFields" tipo="stringa">Project_x0020_Name;Project_x0020_Expenses;Project_x0020_Status;Project_x0020_Start_x0020_Date;Project_x0020_End_x0020_Date;Project_x0020_Budget</Proprietà>
Si noti che ho dovuto tenere tutti i campi di proprietà su una linea o non avrebbero funzionato (CQWP vuoi dirmi che la query non restituita elementi).
4. A questo punto, Siamo pronti a muoversi oltre l'articolo di MSDN e flip su sopra all'articolo di Heather Solomon. Seguire i suoi passi di partenza nei pressi del passo #5 per creare un personalizzato / unghosted versione di ItemStyle.xsl. Seguo i consigli di Heather, alto attraverso il passo 11 e ottenere questi risultati intermedi:
4.1: Nome mio modello XSL come segue:
<xsl:nome template = "Grid" match = "riga[@Style = 'Grid']" modalità = "itemstyle">
Anche leggermente modificare lei suggerito <xsl:for each …> con l'aggiunta di un <br /> Tag per fornire un elenco più pulito:
<xsl:for each selezionare="@*"> P:<xsl:valore di selezionare="nome()" /><br/> </xsl:for each>
4.2: Modificare la web part, Vai a comparsa e selezionare my Grid"" stile:
Applicare la modifica ed ecco il risultato:
Da quanto sopra possiamo vedere che i campi che vogliamo (Nome del progetto, spese, status, ecc) sono disponibili per noi da utilizzare quando emettiamo il codice HTML. Non solo che, ma vediamo i nomi con cui ci dobbiamo fanno riferimento tali colonne in XSL. Per esempio, riferimento lo stato del progetto come "Project_x005F_x0020_Name".
A questo punto, Partiamo dal blog di Heather e dalle spalle di questi giganti, Aggiungo il mio po '.
ContentQueryMain.xsl
NOTA: Quando si apportano modifiche a ContentQueryMain.xsl così come ItemStyle.xsl, è necessario controllare che i file di nuovo in prima di vedere l'effetto delle modifiche.
Fini della griglia-making, MOSS utilizza due file XSL diversi per produrre i risultati che vediamo da un CQWP. Per generare il precedente bit di output, Abbiamo modificato ItemStyle.xsl. MOSS utilizza in realtà un altro file XSL, ContentQueryMain.xsl a in combinazione con ItemStyle.xsl per generare il codice HTML. Come suggerisce il nome, ContentQueryMain.xsl è il principale"" XSL che controlla il flusso complessivo di traduzione. Scorre tutti gli elementi trovati e li passa uno per modelli in ItemStyle.xsl. Verrà modificata ItemStyle.xsl per generare all'aperto <tabella> Tag prima di emettere la prima riga di dati e la chiusura <tabella> Tag dopo l'ultima riga di emissione. Per eseguire questa operazione, ContentQueryMain.xsl è modificato per passare due parametri alla nostra griglia"" modello in ItemStyle.xsl, "ultima fila" e "riga corrente". ItemStyle.xsl utilizza questi per generare in modo condizionale i tag necessari.
Utilizzando la tecnica di Heather Solomon, Siamo individuare ContentQueryMain.xsl. Si trova nello stesso luogo come ItemStyle.xsl. Questa schermata dovrebbe aiutare:
Abbiamo bisogno di apportare le seguenti modifiche:
- Modificare un modello xsl, "CallItemTemplate" che in realtà richiama il nostro modello di griglia in ItemStyle.xsl. Passeremo due parametri al modello Grid in modo che avrà i dati che necessari per generare in modo condizionale di apertura e chiusura <tabella> Tag.
- Modificare un altro po ' di ContentQueryMain.xsl che chiama la "CallItemTemplate" far passare un "LastRow" parametro quindi che LastRow potranno essere comunicati al nostro modello di griglia.
Individuare il modello denominato "OuterTemplate.CallItemTemplate" identificato dalla stringa:
<xsl:modello nome="OuterTemplate.CallItemTemplate">
Sostituire l'intero modello come segue:
<xsl:modello nome="OuterTemplate.CallItemTemplate"> <xsl:param nome="CurPosition" /> <!-- Aggiungere il "LastRow" parametro. Usiamo solo quando l'elemento style pass in è «Griglia». --> <xsl:param nome="LastRow" /> <xsl:scegliere> <xsl:Quando test="@Style = 'NewsRollUpItem'"> <xsl:apply-templates selezionare="." modalità="ItemStyle"> <xsl:con param nome="EditMode" selezionare="$cbq_iseditmode" /> </xsl:apply-templates> </xsl:Quando> <xsl:Quando test="@Style = 'NewsBigItem'"> <xsl:apply-templates selezionare="." modalità="ItemStyle"> <xsl:con param nome="CurPos" selezionare="$CurPosition" /> </xsl:apply-templates> </xsl:Quando> <xsl:Quando test="@Style = 'NewsCategoryItem'"> <xsl:apply-templates selezionare="." modalità="ItemStyle"> <xsl:con param nome="CurPos" selezionare="$CurPosition" /> </xsl:apply-templates> </xsl:Quando> <!-- Posizione corrente e lastrow passare il modello di griglia itemstyle.xsl. ItemStyle.xsl che utilizzerà per emettere l'apertura e la chiusura <tabella> Tag. --> <xsl:Quando test="@Style = 'Griglia'"> <xsl:apply-templates selezionare="." modalità="ItemStyle"> <xsl:con param nome="CurPos" selezionare="$CurPosition" /> <xsl:con param nome="Ultima" selezionare="$LastRow" /> </xsl:apply-templates> </xsl:Quando> <xsl:in caso contrario> <xsl:apply-templates selezionare="." modalità="ItemStyle"> </xsl:apply-templates> </xsl:in caso contrario> </xsl:scegliere> </xsl:modello> |
Commenti descrivono lo scopo delle modifiche.
Naturalmente, il OuterTemplate.CallItemTemplate"" Se viene chiamato da un altro modello. Individuare tale modello di ricerca per questa stringa di testo:
<xsl:modello nome="OuterTemplate.Body">
Scorrere le istruzioni in OuterTemplate.Body e inserire il parametro LastRow come segue (mostrato come un commento in corsivo):
<xsl:modello di chiamata nome="OuterTemplate.CallItemTemplate"> <xsl:con param nome="CurPosition" selezionare="$CurPosition" /> <!-- Inserire il parametro LastRow. --> <xsl:con param nome="LastRow" selezionare="$LastRow"/> </xsl:modello di chiamata>
Dopo tutto questo, finalmente abbiamo impostate correttamente in modo che la nostra ItemStyle.xsl può emettere cose <tabella> Tag al posto giusto.
ItemStyle.Xsl
NOTA: Ancora una volta, Dopo aver apportato eventuali modifiche, in modo che si vede l'effetto di tali modifiche il check-in ItemStyle.xsl.
Abbiamo due compiti qui:
- Sostituire l'intero modello di griglia. È possibile copiare/incollare da sotto.
- Aggiungere alcuni mumbo jumbo non rientra nella definizione di modello che consente di "formatcurrency" modello a lavorare. (Si può dire che ho una tenue maniglia su XSL).
Primo, nella parte superiore della ItemStyle.xsl, aggiungere questa riga:
<!-- Alcuni mumbo jumbo che ci permette di visualizzare gli Stati Uniti. valuta. --> <xsl:formato decimale nome="personale" cifre="D" /> <xsl:modello nome="Predefinito" match="*" modalità="ItemStyle">
Si noti che aggiunto direttamente prima del <xsl:nome template = "Default" …> definizione.
Successivo, Torna al nostro modello di griglia. Sostituire l'intero modello di griglia con il codice riportato di seguito. È accuratamente commentato, ma non esitate a scrivermi o lasciare commenti sul mio blog, se avete domande.
<xsl:modello nome="Griglia" match="Riga[@Style = 'Griglia']" modalità="ItemStyle"> <!-- ContentMain.xsl passa CurPos e ultimo. Usiamo questi condizionalmente emettere all'aperto e chiusura <tabella> Tag. --> <xsl:param nome="CurPos" /> <xsl:param nome="Ultima" /> <!-- Le seguenti variabili sono state modificate dalla ItemStyle.xsl standard --> <xsl:variabile nome="SafeImageUrl"> <xsl:modello di chiamata nome="OuterTemplate.GetSafeStaticUrl"> <xsl:con param nome="UrlColumnName" selezionare="'ImageUrl'"/> </xsl:modello di chiamata> </xsl:variabile> <xsl:variabile nome="SafeLinkUrl"> <xsl:modello di chiamata nome="OuterTemplate.GetSafeLink"> <xsl:con param nome="UrlColumnName" selezionare="'LinkUrl'"/> </xsl:modello di chiamata> </xsl:variabile> <xsl:variabile nome="DisplayTitle"> <xsl:modello di chiamata nome="OuterTemplate.GetTitle"> <xsl:con param nome="Titolo" selezionare="@Title"/> <xsl:con param nome="UrlColumnName" selezionare="'LinkUrl'"/> </xsl:modello di chiamata> </xsl:variabile> <xsl:variabile nome="LinkTarget"> <xsl:Se test="@OpenInNewWindow = 'True'" >Blank</xsl:Se> </xsl:variabile> <!-- Qui definiamo una variabile, "tableStart". Questo file contiene il codice HTML che usiamo per definire l'apertura della tabella così come le etichette di colonna. Si noti che se CurPos = 1, Esso comprende il codice HTML in un tag CDATA. In caso contrario, sarà vuota. Il valore di tableStart viene emesso ogni volta ItemStyle è chiamata via ContentQueryMain.xsl. --> <xsl:variabile nome="tableStart"> <xsl:Se test="$CurPos = 1"> <![CDATA[ <bordo della tabella = 1> <TR bgcolor = "blue"> <TD><colore del carattere = "white"><b>Nome del progetto</b></tipo di carattere></TD> <TD align = "right"><colore del carattere = "white"><b>Data completa</b></tipo di carattere></TD> <TD align = "right"><colore del carattere = "white"><b>Bilancio</b></tipo di carattere></TD> <TD align = "right"><colore del carattere = "white"><b>Spesa effettiva</b></tipo di carattere></TD> <TD><colore del carattere = "white"><b>Stato complessivo</b></tipo di carattere></TD> </TR> ]]> </xsl:Se> </xsl:variabile> <!-- Un'altra variabile, tableEnd definisce semplicemente la chiusura tag di tabella. Come con tableStart, è sempre emesso. Ecco perché il relativo valore è assegnato in modo condizionale basata su se siamo stati passati l'ultima riga di ContentQueryMain.xsl. --> <xsl:variabile nome="tableEnd"> <xsl:Se test="$CurPos = $Last"> <![CDATA[ </tabella> ]]> </xsl:Se> </xsl:variabile> <!-- Emettono sempre il contenuto di tableStart. Se questo non è la prima riga che passava a noi ContentQueryMain.xsl, quindi sappiamo che il suo valore sarà vuoto. Disabilitare l'uscita escape perché quando tableStart non vuoto, Esso comprende HTML effettivo che vogliamo sottoporre a rendering mediante il browser. Se non diciamo il parser XSL per disabilitare output fuga, verrà generato roba come"<tabella>" invece di"<tabella>". --> <xsl:valore di selezionare="$tableStart" disable-output-escaping="Sì"/> <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:valore di selezionare="@Project_x005F_x0020_Name"/> </TD> <TD allineare="destra"> <xsl:valore di selezionare="@Project_x005F_x0020_End_x005F_x0020_Date"/> </TD> <TD allineare="destra"> <xsl:modello di chiamata nome="FormatCurrency"> <xsl:con param nome="valore" |
Questo è stato incredibilmente utile. Grazie!
Aah… e ' stato perché il mio stile di elenco un nome diverso e non realizzare il ContentQueryMain.xsl verifica per lo "stile":
<xsl:Quando test="@Style='NameOfMyStyle'">
Con quello rinominato ha funzionato. 🙂
Ha quasi funzionato per me: Gestire per l'output il </tabella> tag di fine correttamente, ma manca il tag iniziale. Sembra che il test = "$CurPos = 1" non restituire true. Ma perché?
Grande Post. Paolo ho fatto tutte le cose di cui sopra. Ho una query, come posso ottenere la somma di "totale spese effettive" o la somma del valore delle due colonne.
Hai fatto qualche lavoro con la creazione di file xsl ContentQueryMain e ItemStyle personalizzati? Il motivo che mi chiedo è che non vogliono preoccuparsi di mio stili personalizzati vengano sovrascritte con eventuali patch o aggiornamenti. Avete esempi? Ho provato a fare una copia identica della ContentQueryMain.xsl e caricare quella nuova copia personalizzata alla libreria di stile. Quando si inserisce un riferimento a questo file xsl nella proprietà MainXslLink di WebPart, Ottengo 401 non autorizzato. Il file xsl personalizzato è una versione pubblicata e ognuno di noi ha accesso in lettura ad esso.
fantastico post grazie! Sono stato in lotta con questo ora per gli ultimi giorni.
Ciao, Questo è stato un distacco veramente utile. Ce l'ho tutti lavoro, e cambia anche implementato Mike Brown così gruppi it
i risultati all'interno della tabella da qualunque cosa scegliere come gruppo di parametro nella proprietà di CQWB.
Ho fatto il titolo di un link anche, così funziona bene. Ho ancora un problema, anche se. Io sto raggruppando i risultati dal nome del sito. All'interno della tabella, li raggruppa ben, e sembra grande, ma è ancora stampa fuori tutto il gruppo
nomi(nel mio caso i nomi dei siti) sopra la tabella. Qualcuno sa come sbarazzarsi di questi?
Grazie,
Greg
Bell'articolo. Sono riuscito a dare il mio tavolo l'aspetto degli elenchi Sharepoint predefinita analizzando il codice sorgente dell'elenco. Ecco i principali blocchi HTML necessari per montare in ItemStyle:
<TABELLA larghezza = 100%" classe = "ms-listviewtable" border = 0 cellspacing = 0 cellpadding = 1 dir = "None">
<!–INTESTAZIONE–>
<Classe TR = "ms-viewheadertr" VALIGN = TOP>
<Ambito nowrap TH = "col" classe = "ms-vh2"><div style = "width:100%;posizione:relativa;sinistra:0;In alto:0;">
<Stile tabella = "larghezza:100%;" CtxNum = "1" Height = "100%" CellSpacing = 1 cellpadding = 0 class = "ms-unselectedtitle">
<TR>
<Larghezza TD = 100%" Classe = "ms-vb" NoWrap>
Texte du titre ici
</TD>
<TD style = "position:assoluta;">
</TD>
</TR>
</TABELLA></div>
</TH>
<!–Ripetere per tutte le celle di intestazione–>
</TR>
<!– Dati della tabella –>
<Classe TR = "">
<!–Colonna di dati, utilizzare il codice di Paul per quella prima con il collegamento ipertestuale –>
<TD Class = "ms-vb2">Dati qui</TD>
<!–Colonna vuota–>
<TD Class = "ms-vb2">
<span dir = None></arco><
/TD>
<!–Colonna Data–>
<TD Class = "ms-vb2">
<NOBR>11/12/2008</NOBR>
</TD>
</TR>
<!–***Riga alternativo – Utilizzare una nuova variabile XSL che inserirà la classe alternativa basata sulla riga corrente modulo 2–>
<Classe TR = "ms-alternato">
…
</TR>
</TABELLA>
Thatz precisamente stavo cercando...È rock uomo...Viva...Ti amo per il post..
<xsl:apply-templates select = "." modalità = "itemstyle">
<xsl:con param name = "CurPos" Select = "$CurPosition" />
<xsl:con param name = "ultima" Select = "$LastRow" />
<xsl:con param name = "StartNewGroup" Select="@__begingroup" />
</xsl:Quando>
<xsl:Quando la prova = "$StartNewGroup = 'True'">
<TR>
<TD >
<xsl:name="OuterTemplate.GetGroupName modello di chiamata">
<xsl:con param name = "GroupName" Select="@*[nome()= $Group]"/>
<xsl:con param name = "GroupType" Select = "$GroupType" />
</xsl:modello di chiamata>
</TD>
</TR>
</xsl:Quando>
<xsl:in caso contrario>
</xsl:in caso contrario>
</xsl:scegliere>
Ciao Paolo,
Quando si lavora con la web part query xml/xsl e contenuto, Hai trovato tutti buoni modi per formattare il tuo xslt? Cercando di apportare modifiche e prova il design si sta rivelando un dolore giusto nell'un * * solo utilizzando un editor di testo…
Tutti i migliori
(e. g. https://myweb.com/Marketing/images/icn-order.gif, )
Dovrei usare immagini o foto nel campo tipo di CommonViewFields? (e. g. InternalColumnName, Immagine)
Il tuo post è esattamente quello che stavo cercando. Tuttavia, Non riesco a farlo funzionare.
Ho documenti memorizzati in vari doc. le librerie ma classificati utilizzando una colonna di classe personalizzata (scelta: 1 o 2. Voglio usare CQWP per mostrare questi documenti in base alla loro classe.
Sono stato in grado di aggiungere il CQWP, esportarlo in SPD, configurare il itemStyle.xls per mostrare i campi personalizzati nella visualizzazione elenco. Tuttavia, Non riuscivo a implementare con successo ciò che si descrive qui.
Queste sono le colonne che vi voglio mostrare nel mio CQWP:
Tipo di file (per visualizzare l'icona)
Titolo del file
Data ultima modificata
Modificato da chi
Check-Out per
Controllato nei commenti
Al momento ho il risultato in formato elenco. Come faccio a cambiarlo in un formato di talble.
Grazie.
Simonelli
Ci scusiamo per il missspelling il mio nome non è sicuro dove il ” è venuto da.