Como uso o QueryOverride no CQWP ao implantar uma instância da web part usando Elements.xml?
-
09-12-2019 - |
Pergunta
Preciso usar o CQWP com mais de três filtros, por isso vou usar o QueryOverride com uma consulta CAML como descrito aqui.Não consigo fazer isso funcionar ao implantar a instância da web part usando Elements.xml, ou seja,AllUsersWebPart e CDATA.
A maneira como fiz isso com filtros normais foi a seguinte (de Elements.xml)
<AllUsersWebPart ID="FindingsCQWP" WebPartZoneID="Middle" WebPartOrder="1" >
<![CDATA[
<webParts>
<webPart xmlns="http://schemas.microsoft.com/WebPart/v3">
<metaData>
<type name="Microsoft.SharePoint.Publishing.WebControls.ContentByQueryWebPart, Microsoft.SharePoint.Publishing, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
<importErrorMessage>Cannot import this Web Part.</importErrorMessage>
</metaData>
<data>
<properties>
<property name="GroupBy" type="string" />
<property name="FilterValue2" type="string">Draft</property>
... and so forth...
No entanto QueryOverride requer o uso de CDATA também.O problema é que não acho que elementos CDATA 'aninhados' sejam permitidos.eu tentei Codificação HTML o CAML como uma solução/abordagem alternativa, mas sem sucesso.
Qual é a solução aqui?Acho que poderia escrever algum código receptor de recurso, mas gostaria de evitar isso, se puder.
Solução 2
A resposta de @Andrey me indicou a resposta a esta pergunta.A consulta precisa ser codificada.Tentei isso na minha abordagem inicial, mas devo ter perdido alguma coisa.
Eu tinha esse CAML que queria ter no meu QueryOverride
<Where>
<And>
<And>
<Or>
<Eq>
<FieldRef Name='Status' />
<Value Type='Choice'>Not Started</Value>
</Eq>
<Eq>
<FieldRef Name='Status' />
<Value Type='Choice'>Not Closed</Value>
</Eq>
</Or>
<Leq>
<FieldRef Name='TargetImplDate' />
<Value Type='DateTime'>
<Today />
</Value>
</Leq>
</And>
<Eq>
<FieldRef Name='Category' />
<Value Type='Choice'></Value>
</Eq>
</And>
</Where>
<OrderBy>
<FieldRef Name='ProcessChoice' />
<FieldRef Name='TargetImplDate' />
</OrderBy>
Usar CDATA quando adicionei a web part à galeria de web parts, adicioná-la à página e exportá-la posteriormente obteve o resultado
<property name="QueryOverride" type="string"><Where><And><And><Or><Eq><FieldRef Name='Status' /><Value Type='Choice'>Not Started</Value></Eq><Eq><FieldRef Name='Status' /><Value Type='Choice'>Not Closed</Value></Eq></Or><Leq><FieldRef Name='TargetImplDate' /><Value Type='DateTime'><Today /></Value></Leq></And><Eq><FieldRef Name='Category' /><Value Type='Choice'></Value></Eq></And></Where><OrderBy><FieldRef Name='ProcessChoice' /><FieldRef Name='TargetImplDate' /></OrderBy></property>
que funcionou como esperado.Obrigado @Andrey
Outras dicas
Uma espécie de solução alternativa, mas ainda assim:implantar CQWP sem essa propriedade em uma página, definir a propriedade programaticamente e exportar a webpart para .webpart arquivo.
Prevejo algum tipo de pesadelo de codificação HTML dupla como resultado.
P.S.Não testado.
P.S.S.Se você não conseguir exportar a webpart do navegador, tente usar a abordagem programática (ExportarWebPart método de SPLimitedWebPartManager).
Por favor, tenha em mente que
<where> or <Where>
tag deve ficar na mesma linha com
<property name="QueryOverride" type="string">
assim
<property name="QueryOverride" type="string"><Where>
<Or>
<Eq>
<FieldRef Name="AssignedTo"/>
<Value Type="User">
<UserID/>
</Value>
</Eq>
<Membership Type="CurrentUserGroups">
<FieldRef Name="AssignedTo"/>
</Membership>
</Or>
</Where></property>
e NÃO assim
<property name="QueryOverride" type="string">
<Where>
<Or>
<Eq>
<FieldRef Name="AssignedTo"/>
<Value Type="User">
<UserID/>
</Value>
</Eq>
<Membership Type="CurrentUserGroups">
<FieldRef Name="AssignedTo"/>
</Membership>
</Or>
</Where>
</property>