The current post is a follow-up of the previous OData Query Extension I had developed for Tridion 2011 and 2013:
, where:
<tridion:dynamicContent filter="ItemModificationDate gt '2013-05-01 13:24:56.999'"
orderby="ItemTitle ItemModification asc" />
- Extending OData Query Functionality
- URL Syntax for OData Query Extension
- Function Support for Queries in OData Extension
DynamicContent REL Tag
This tag queries for dynamic Component Presentations using the CD API Query and Criterias. It accepts the following attributes:
<tridion:dynamiContent var="name" filter="expr" orderby="expr" top="int" skip="int"
componentTemplate="tcmuri" />
componentTemplate="tcmuri" />
, where:
- var - name of the TransformContext variable that would hold the result. If var is specified, the resulting array of ComponentPresentation objects is stored into the TransformContext; otherwise, the DCPs are output one after the oter;
- filter - expression specifying the Criterias to query by. The format of this attribute is the same as the $filter query parameter presented in URL Syntax for OData Query Extension;
- orderby - expression specifying the order to sort results by. The format of this attribute is the same as the $orderby query parameter presented in URL Syntax for OData Query Extension;
- top - if specified, only returns the first top results;
- skip - if specified, skip the first skip results;
- componentTemplate - if specified, only return Component Presentations based on this Component Template;
<tridion:dynamicContent filter="ItemModificationDate gt '2013-05-01 13:24:56.999'"
orderby="ItemTitle ItemModification asc" />
Configuration
- Copy the JAR (odata-query-extension-1.3.jar) to your WEB-INF/lib folder (or /bin/lib for .NET installations);
- Edit your cd_dynamic_conf.xml and add the following line just below the <TCDLEngine>:
<TagBundle Resource="odata-query-extension.xml" />
Save the Good Part Last - The Code
DynamicContentTagRenderer Class
@Override
public int doStartTag(Tag tag, StringBuffer tagBody, TransformContext context,
OutputDocument target)
throws TCDLTransformerException {
DynamicContent dynamicContent = new DynamicContent(parametersMap);
dcps = dynamicContent.queryComponentPresentations();
return dcps.length > 0 ? Tag.CONTINUE_TAG_EVALUATION : Tag.SKIP_TAG;
}
@Override
public String doEndTag(Tag tag, StringBuffer tagBody,
TransformContext context, OutputDocument target)
throws TCDLTransformerException {
if (var == null) {
int publicationId = dcps[0].getPublicationId();
ComponentPresentationAssembler
assembler = new
ComponentPresentationAssembler(publicationId);
for (ComponentPresentation dcp : dcps) {
tagBody.append(assembler.getContent(dcp.getComponentId(),
dcp.getComponentTemplateId()));
}
} else {
context.set(var, dcps);
}
return tagBody.toString();
}
DynamicContent Class
public DynamicContent(Map<String, String>
attributes) {
setComponentTemplate(attributes.get(COMPONENT_TEMPLATE));
QueryBuilder builder = new QueryBuilder(attributes);
query = builder.getQuery();
}
public ComponentPresentation[]
queryComponentPresentations() {
List<ComponentPresentation> result = new ArrayList<ComponentPresentation>();
try {
String componentTcmUris[] = query.executeQuery();
log.debug("Query found " + componentTcmUris.length + " Components");
if (componentTcmUris.length == 0) {
return new
ComponentPresentation[0];
}
TCMURI tcmUri = new TCMURI(componentTcmUris[0]);
int publicationId = tcmUri.getPublicationId();
String templateTcmUri =
getTemplateTcmUri(publicationId);
ComponentPresentationFactory factory = new ComponentPresentationFactory(publicationId);
ComponentPresentation
componentPresentation;
for (String componentTcmUri : componentTcmUris) {
if (templateTcmUri == null) {
componentPresentation =
factory.getComponentPresentationWithHighestPriority(componentTcmUri);
} else {
componentPresentation =
factory.getComponentPresentation(componentTcmUri, templateTcmUri);
}
if (componentPresentation != null) {
result.add(componentPresentation);
}
}
} catch (StorageException se) {
log.error("StorageException occurred", se);
} catch (ParseException pe) {
log.error("ParseException occurred", pe);
}
return result.toArray(new
ComponentPresentation[0]);
}
Comments