Skip to main content

DynamicContent REL Tag Addition to OData Query Extension

The current post is a follow-up of the previous OData Query Extension I had developed for Tridion 2011 and 2013:
The code for this version is available in my GitHub project, distributable JAR (odata-query-extension-1.3.jar).

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="namefilter="exprorderby="exprtop="intskip="int"
    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;
Example:
<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