+ All Categories
Home > Documents > Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… ·...

Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… ·...

Date post: 30-Jun-2020
Category:
Upload: others
View: 7 times
Download: 0 times
Share this document with a friend
48
Endeca Content Assembler API Developer's Guide for the RAD Toolkit for ASP.NET Version 2.1.3 March 2012
Transcript
Page 1: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

Endeca Content Assembler APIDeveloper's Guide for the RAD Toolkit for ASP.NET

Version 2.1.3 • March 2012

Page 2: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The
Page 3: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

Contents

Preface.............................................................................................................................7About this guide............................................................................................................................................7Who should use this guide............................................................................................................................7Conventions used in this guide.....................................................................................................................8Contacting Oracle Endeca Customer Support..............................................................................................8

Chapter 1: Introduction to the Content Assembler API..........................9Overview of the Content Assembler API ......................................................................................................9

Content Assembler API components...................................................................................................10Overview of the Content Assembler reference application.........................................................................11

About handling dynamic content.........................................................................................................11The reference application model for dynamic content.........................................................................12List of reference application cartridges................................................................................................13Connecting to a different MDEX Engine..............................................................................................15About skinning the reference application.............................................................................................15

Chapter 2: Working with the Content Assembler API...........................17Writing applications with the Content Assembler API ................................................................................17

About using the Content Assembler with the RAD Toolkit for ASP.NET .............................................17Creating a ContentNavigationDataSource control ..............................................................................17About implementing custom trigger conditions....................................................................................18About content XML validation..............................................................................................................21

Building cartridges to render template-based content................................................................................21About working with content items........................................................................................................21Using the Content Assembler reference application controls..............................................................22Writing user controls to render dynamic content ................................................................................22About rendering customized navigation refinements...........................................................................24About rendering customized results lists.............................................................................................24About customized results.....................................................................................................................25About rendering record lists.................................................................................................................26Generating see-all links.......................................................................................................................27About the DynamicContentPlaceHolder..............................................................................................28Using the DynamicContentPlaceHolder to render pages....................................................................28Using the DynamicContentPlaceHolder to render cartridge content...................................................29

About using the RAD Toolkit for ASP.NET server controls with the Content Assembler.............................30Using the Content Assembler API for programmatic querying ..................................................................32

Chapter 3: Extending the Content Assembler with Tag Handlers........35About tag handlers in the Content Assembler............................................................................................35Scenarios for extending Experience Manager and the Content Assembler...............................................36Life cycle of a Content Assembler query....................................................................................................37Class overview............................................................................................................................................38Implementing the tag handler interface.......................................................................................................38

Resources managed by the ContentContext object............................................................................39About invoking other tag handlers.......................................................................................................40

Integrating a tag handler into the Content Assembler.................................................................................41Registering a tag handler....................................................................................................................42Standard tag handlers in the Content Assembler................................................................................42

About the sample tag handler.....................................................................................................................43Installing the sample tag handler.........................................................................................................44

About extending the Content Assembler to validate custom XML..............................................................44

iii

Page 4: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The
Page 5: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

Copyright and disclaimer

Copyright © 2003, 2012, Oracle and/or its affiliates. All rights reserved.

Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may betrademarks of their respective owners. UNIX is a registered trademark of The Open Group.

This software and related documentation are provided under a license agreement containing restrictionson use and disclosure and are protected by intellectual property laws. Except as expressly permittedin your license agreement or allowed by law, you may not use, copy, reproduce, translate, broadcast,modify, license, transmit, distribute, exhibit, perform, publish or display any part, in any form, or byany means. Reverse engineering, disassembly, or decompilation of this software, unless required bylaw for interoperability, is prohibited.

The information contained herein is subject to change without notice and is not warranted to beerror-free. If you find any errors, please report them to us in writing.

If this is software or related documentation that is delivered to the U.S. Government or anyone licensingit on behalf of the U.S. Government, the following notice is applicable:

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integratedsoftware, any programs installed on the hardware, and/or documentation, delivered to U.S. Governmentend users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulationand agency-specific supplemental regulations. As such, use, duplication, disclosure, modification, andadaptation of the programs, including any operating system, integrated software, any programs installedon the hardware, and/or documentation, shall be subject to license terms and license restrictionsapplicable to the programs. No other rights are granted to the U.S. Government.

This software or hardware is developed for general use in a variety of information managementapplications. It is not developed or intended for use in any inherently dangerous applications, includingapplications that may create a risk of personal injury. If you use this software or hardware in dangerousapplications, then you shall be responsible to take all appropriate fail-safe, backup, redundancy, andother measures to ensure its safe use. Oracle Corporation and its affiliates disclaim any liability forany damages caused by use of this software or hardware in dangerous applications.

This software or hardware and documentation may provide access to or information on content,products and services from third parties. Oracle Corporation and its affiliates are not responsible forand expressly disclaim all warranties of any kind with respect to third-party content, products, andservices. Oracle Corporation and its affiliates will not be responsible for any loss, costs, or damagesincurred due to your access to or use of third-party content, products, or services.

Rosette® Linguistics Platform Copyright © 2000-2011 Basis Technology Corp. All rights reserved.

Teragram Language Identification Software Copyright © 1997-2005 Teragram Corporation. All rightsreserved.

v

Page 6: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The
Page 7: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

Preface

Oracle Endeca's Web commerce solution enables your company to deliver a personalized, consistentcustomer buying experience across all channels — online, in-store, mobile, or social. Whenever andwherever customers engage with your business, the Oracle Endeca Web commerce solution delivers,analyzes, and targets just the right content to just the right customer to encourage clicks and drivebusiness results.

Oracle Endeca Guided Search is the most effective way for your customers to dynamically exploreyour storefront and find relevant and desired items quickly. An industry-leading faceted search andGuided Navigation solution, Oracle Endeca Guided Search enables businesses to help guide andinfluence customers in each step of their search experience. At the core of Oracle Endeca GuidedSearch is the MDEX Engine,™ a hybrid search-analytical database specifically designed forhigh-performance exploration and discovery. The Endeca Content Acquisition System provides a setof extensible mechanisms to bring both structured data and unstructured content into the MDEX Enginefrom a variety of source systems. Endeca Assembler dynamically assembles content from any resourceand seamlessly combines it with results from the MDEX Engine.

Oracle Endeca Experience Manager is a single, flexible solution that enables you to create, deliver,and manage content-rich, cross-channel customer experiences. It also enables non-technical businessusers to deliver targeted, user-centric online experiences in a scalable way — creating always-relevantcustomer interactions that increase conversion rates and accelerate cross-channel sales. Non-technicalusers can control how, where, when, and what type of content is presented in response to any search,category selection, or facet refinement.

These components — along with additional modules for SEO, Social, and Mobile channel support —make up the core of Oracle Endeca Experience Manager, a customer experience management platformfocused on delivering the most relevant, targeted, and optimized experience for every customer, atevery step, across all customer touch points.

About this guideThis guide describes the major tasks involved in developing an Endeca application using the ContentAssembler API for the RAD Toolkit for ASP.NET.

This guide assumes that you have read the Oracle Endeca Experience Manager Getting Started Guideand that you are familiar with Endeca’s terminology and basic concepts.

This guide covers only the features of the Content Assembler API for the RAD Toolkit for ASP.NET,and is not a replacement for the available material documenting other Endeca products and features.For a list of recommended reading, please refer to the section "Who should use this guide."

Who should use this guideThis guide is intended for developers who are building Endeca applications using the Content AssemblerAPI for the RAD Toolkit for ASP.NET.

Page 8: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

If you are a new user of Oracle Endeca Guided Search or Oracle Endeca Experience Manager andyou are not familiar with developing Endeca applications, Oracle recommends reading the followingguides prior to this one:

1. Oracle Endeca Experience Manager Getting Started Guide2. Endeca Basic Development Guide3. Endeca Advanced Development Guide4. Endeca RAD Toolkit for ASP.NET Developer's Guide5. Oracle Endeca Experience Manager Developer's Guide

If you are an existing user of Oracle Endeca Guided Search or Oracle Endeca Experience Managerand you are familiar with developing Endeca applications, Oracle recommends reading the followingguides prior to this one:

1. Oracle Endeca Experience Manager Getting Started Guide2. Endeca RAD Toolkit for ASP.NET Developer's Guide3. Oracle Endeca Experience Manager Developer's Guide

Remember: All documentation is available on the Oracle Technology Network (OTN).

Conventions used in this guideThis guide uses the following typographical conventions:

Code examples, inline references to code elements, file names, and user input are set in monospacefont. In the case of long lines of code, or when inline monospace text occurs at the end of a line, thefollowing symbol is used to show that the content continues on to the next line: ¬

When copying and pasting such examples, ensure that any occurrences of the symbol and thecorresponding line break are deleted and any remaining space is closed up.

Contacting Oracle Endeca Customer SupportOracle Endeca Customer Support provides registered users with important information regardingOracle Endeca software, implementation questions, product and solution help, as well as overall newsand updates.

You can contact Oracle Endeca Customer Support through Oracle's Support portal, My Oracle Supportat https://support.oracle.com.

Endeca ConfidentialEndeca Content Assembler API Developer's Guide for the RAD Toolkit for ASP.NET

| Preface8

Page 9: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

Chapter 1

Introduction to the Content Assembler API

This section provides an overview of the Content Assembler API for the RAD Toolkit for ASP.NET andthe associated reference application.

Overview of the Content Assembler APIThe Content Assembler API for the RAD Toolkit for ASP.NET extends the Endeca RAD Toolkit forASP.NET to enable access to dynamic page content and is used in conjunction with other EndecaAPIs to build configurable Web applications.

The Content Assembler API is designed primarily for search and navigation queries and returnsdynamic content if any dynamic pages are triggered by those queries. The Content Assembler APIuses the RAD Toolkit for ASP.NET to query the MDEX Engine and provides convenient methods foraccessing the content tree that is returned as part of the query results. This content tree reflects thepage configuration created by a content administrator in Experience Manager. The tree may containresults from additional queries executed by the Content Assembler that are used to populate pagesections based on the configuration returned for the initial query.

Because the Content Assembler uses classes from the RAD Toolkit for ASP.NET such as Naviga¬tionDataSource and NavigationCommand, all queries to the MDEX Engine can be sent through

Page 10: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

the Content Assembler API.You can use regular RAD Toolkit methods to access and process queryresults. Note that only search or navigation queries that trigger a dynamic page return a content tree.

In addition, an Endeca application built with the Content Assembler API can also use the URLOptimization API, available as part of the optional Search Engine Optimization Module. The URLOptimization API also works with the RAD Toolkit for ASP.NET to enable developers to createapplication links using directory-style URLs with embedded keyword metadata.

Applications built on top of the MDEX Engine version 6.1 or later can also leverage the MDEX APIthrough XQuery, available as part of the Advanced Query Module. There is no explicit support forXQuery within the current version of the Content Assembler; that is, the Content Assembler does notuse the MDEX API through XQuery to process queries to the MDEX Engine. However, XQuery forEndeca enables developers to extend MDEX Engine functionality through custom XQuery modules.

Content Assembler API componentsThe Content Assembler API for the RAD Toolkit for ASP.NET provides some additional classes andcontrols for accessing and rendering dynamic page content.

The Content Assembler API includes the following additions to the RAD Toolkit for ASP.NET:

Endeca.Data.Content namespace

DescriptionClass or Interface

Defines a content item that represents the dynamic page contentconfigured in Experience Manager. Content items contain a

IContentItem

collection of IProperty objects that may include child contentitems.

A list of content items.IContentItemList

Represents a property defined in the template and configuredby the content administrator.

IProperty

Endeca.Data.Content.Navigation namespace

DescriptionClass or Interface

Generates content item objects from a RAD Toolkit for ASP.NETNavigationCommand and NavigationResult.

NavigationContentItemCreator

Used for rendering results lists from a NavigationRecordsproperty that has been configured in Experience Manager,

INavigationRecords

including custom sort, relevance ranking, and records-per-pagebehavior.

Used for rendering results lists from a RecordList propertythat has been configured in Experience Manager, includinginformation to create "see-all" links.

IRecordListProperty

The ContentNavigationDataSource control

The Content Assembler API includes a new server control. The ContentNavigationDataSourceextends the NavigationDataSource control to enable access to dynamic page content.

Endeca ConfidentialEndeca Content Assembler API Developer's Guide for the RAD Toolkit for ASP.NET

Introduction to the Content Assembler API | Overview of the Content Assembler API10

Page 11: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

Reference application controls

In addition, the following utility controls are included (along with full source code) in the ContentAssembler reference application:

• The DynamicContentPlaceHolder dynamically loads other user controls in order to rendertemplate-based content.

• The IContentControl interface defines a content item-aware user control for rendering sectioncontent.

Endeca.Data.Content.Assembler namespace

In addition to the components listed above, the classes in this namespace provide access to coreContent Assembler functionality that you can use to extend the Content Assembler. For moreinformation, see "Extending the Content Assembler with Tag Handlers" in this guide.

Overview of the Content Assembler reference applicationThe Content Assembler reference front-end application demonstrates best practices for using theContent Assembler API to develop configurable applications.

The Content Assembler reference application and sample project is designed to show a typical approachto building cartridges -- that is, templates and their associated rendering code -- and demonstrate howthe configuration specified by the content administrator in Experience Manager can affect the displayof content in the front-end application. The templates and application code are based on UI bestpractices developed by Endeca specifically for Guided Navigation applications.

Unlike other Endeca reference applications, the Content Assembler reference application is not intendedas a general-purpose data navigator. In order to show realistic examples of cartridge development,the reference application is closely tied to the sample wine data project that is provided with the ContentAssembler. For this reason, it is not intended as a generic preview application for the ExperienceManager in Endeca Workbench.

The reference application may be used as a starting point for your own application code.You cancustomize it to suit your data and business requirements and extend its functionality as needed.

About handling dynamic contentYour application should contain logic to iterate through the content tree returned by the ContentAssembler and pass the embedded content items to the appropriate code for rendering.

Recall that the structure of the templates you provide in Experience Manager determines the structureof the content in the page configuration. Templates enable you to specify <ContentItem> or <Con¬tentItemList> elements that serve as place holders for the content configured by the contentadministrator. The diagram below shows an example of a fully configured dynamic page.

Endeca Content Assembler API Developer's Guide for the RAD Toolkit for ASP.NETEndeca Confidential

11Introduction to the Content Assembler API | Overview of the Content Assembler reference application

Page 12: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

In this example, each orange dot represents a content item while the gray dots (such as Header andLeftColumn) represent content item lists.You can use both content items and content item lists in yourtemplates, but generally only content items are actually rendered.

Because the template dictates the number and type of properties in a content item, you can writerendering code that is closely tailored to handle the content items based on a particular template.There are several ways that you can then match the content items in the content tree to the appropriaterendering code, for example:

• inspecting the TemplateId of the content item• using a naming convention based on the template id• using a string property in the template that specifies the name of the class to use for rendering

content items based on the template

Content Assembler reference application for the RAD Toolkit for ASP.NET uses a mapping betweenthe template id and the rendering code, specified in the site's Web.config file.

The reference application model for dynamic contentIn the Content Assembler reference application for the RAD Toolkit for ASP.NET, the DynamicCon¬tentPlaceHolder manages the logic of finding the appropriate control to handle each content item.

The DynamicContentPlaceHolder is a data-bound control that automatically loads a user controlto handle nested cartridge content based on the template id and the mapping specified in the site'sWeb.config file.

The following example from Web.config shows the format of the mapping that is used by the Dy¬namicContentPlaceHolder between the template id and the path to the class designed to rendercartridges based on that template.

Endeca ConfidentialEndeca Content Assembler API Developer's Guide for the RAD Toolkit for ASP.NET

Introduction to the Content Assembler API | Overview of the Content Assembler reference application12

Page 13: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

The class specified here is the class that is initially loaded to handle the content item. In some cases,the content is then passed to another class for the actual rendering. See GuidedNavigation.ascxand ResultsList.ascx for examples.

<configuration> <configSections><!- additional elements not shown in this example --> <sectionGroup name="content.config" type="ContentRef.Config.ContentConfigSectionGroup"> <section name="templateHandlers" type="ContentRef.Config.TemplateHandlersSection"/> </sectionGroup> </configSections><!- additional elements not shown in this example --> <content.config> <templateHandlers> <add templateId="Breadcrumbs" handlerPath="~/Resources/ContentCon¬trols/Navigation/Breadcrumbs.ascx" /> <add templateId="GuidedNavigation" handlerPath="~/Resources/Content¬Controls/Navigation/GuidedNavigation.ascx" /> <add templateId="ImageBox" handlerPath="~/Resources/ContentControls/Ba¬sics/Image.ascx" /> <add templateId="ThreeRecordBox" handlerPath="~/Resources/ContentCon¬trols/Spotlights/ThreeRecordBox.ascx" /> <add templateId="TextBox" handlerPath="~/Resources/ContentControls/Ba¬sics/Text.ascx" /> <add templateId="SearchAdjustments" handlerPath="~/Resources/Content¬Controls/Search/SearchAdjustments.ascx" /> <add templateId="DimensionSearchResults" handlerPath="~/Resources/Con¬tentControls/Search/DimensionSearchResults.ascx" /> <add templateId="ImageBanner" handlerPath="~/Resources/ContentCon¬trols/Basics/Image.ascx" /> <add templateId="OneRecordBanner" handlerPath="~/Resources/Content¬Controls/Spotlights/OneRecordBanner.ascx" /> <add templateId="ResultsList" handlerPath="~/Resources/ContentCon¬trols/Records/ResultsList.ascx" /> <add templateId="TextBanner" handlerPath="~/Resources/ContentCon¬trols/Basics/Text.ascx" /> <add templateId="ThreeRecordBanner" handlerPath="~/Resources/Content¬Controls/Spotlights/ThreeRecordBanner.ascx" /> <add templateId="ImageSiteBanner" handlerPath="~/Resources/Content¬Controls/Basics/Image.ascx" /> <add templateId="SearchBar" handlerPath="~/Resources/ContentCon¬trols/Search/SearchBar.ascx" /> <add templateId="ThreeColumnNavigationPage" handlerPath="~/Re¬sources/ContentControls/Pages/ThreeColumnNavigationPage.ascx" /> </templateHandlers> </content.config><!- additional elements not shown in this example --></configuration>

Note that the same code may be used to handle more than one template, if the properties defined inthe templates are sufficiently similar.

List of reference application cartridgesThe reference application includes sample cartridges that enable configuration of a variety of front-endfeatures.

Endeca Content Assembler API Developer's Guide for the RAD Toolkit for ASP.NETEndeca Confidential

13Introduction to the Content Assembler API | Overview of the Content Assembler reference application

Page 14: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

For implementation details, refer to the templates (located in your reference application deploymentat [appDir]\config\page_builder_templates) and the rendering code (located inC:\Endeca\ContentAssemblerAPIs\RAD Toolkit forASP.NET\version\reference\ContentAssemblerRefApp\Resources\ContentControls).

DescriptionRendering codeTemplate name

Displays the site banner image with anoptional link.

Basics\Image.ascxFullWidthContent-ImageSiteBanner

Displays the search bar.Search\SearchBar.ascxFullWidthContent-SearchBar

Displays dimension search results. Contentadministrators can configure whether or not

Search\Dimension¬SearchResults.ascx

MainColumnContent-DimensionSearchResults

to display compound dimension searchresults.

Displays an image banner with an optionallink.

Basics\Image.ascxMainColumnContent-ImageBanner

Displays one record spotlight with animage.

Spotlights\OneRecord¬Banner.ascx

MainColumnContent-OneRecordBanner

Displays search and navigation results ina list view.

Records\Result¬sList.ascx

MainColumnContent-ResultsList

Displays search adjustment messagingsuch as Did You Mean or spellingcorrection.

Search\SearchAdjust¬ments.ascx

MainColumnContent-SearchAdjustments

Displays promotional text with a title andan optional link.

Basics\Text.ascxMainColumnContent-TextBanner

Displays a three record spotlight banner.Spotlights\ThreeRe¬cordBanner.ascx

MainColumnContent-ThreeRecordBanner

Displays breadcrumbs appropriate to thecurrent refinement state.

Navigation\Bread¬crumbs.ascx

SidebarItem-Breadcrumbs

Displays Endeca Guided Navigation withconfigurable display of dimensions.

Nsvigation\GuidedNav¬igation.ascx

SidebarItem-GuidedNavigation

Displays an image with an optional link.Basics\Image.ascxSidebarItem-ImageBox

Displays promotional text with a title andan optional link.

Basics\Text.ascxSidebarItem-TextBox

Displays a three record spotlight box.Spotlights\ThreeRe¬cordBox.ascx

SidebarItem-ThreeRecordBox

Note: Text.ascx in the reference application applies HTML escaping to the strings specifiedby the content administrator in Experience Manager. If you want to allow content administratorsto enter HTML-formatted text in Experience Manager, create a separate cartridge with renderingcode that does not escape HTML strings.

The reference application also includes a page template namedPageTemplate-ThreeColumnNavigationPage, which controls the overall page content andThreeColumnNavigationPage.ascx (located in C:\Endeca\ContentAssemblerAPIs\RAD

Endeca ConfidentialEndeca Content Assembler API Developer's Guide for the RAD Toolkit for ASP.NET

Introduction to the Content Assembler API | Overview of the Content Assembler reference application14

Page 15: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

Toolkit forASP.NET\2.0.0\reference\ContentAssemblerRefApp\Resources\ContentControls\Pages),which controls the overall rendering of the page.

Connecting to a different MDEX EngineBy default the Content Assembler reference application attempts to connect to an MDEX Enginerunning on localhost port 15000 (the default port in the sample wine deployment). If you are runningthe MDEX Engine on a different host or port, you can update the configuration in the site's Web.configfile.

To specify a different MDEX Engine host or port:

1. Navigate to the location of the Content Assembler reference application. In a typical installation,this is: C:\Endeca\ContentAssemblerAPIs\RAD Toolkit forASP.NET\<version>\reference\ContentAssemblerRefApp.

2. Open the Web.config file and locate the following section:

<endeca><!- additional elements not shown in this example --> <servers> <clear/> <add name="Local" hostName="localhost" port="15000" certificatePath=""/>

</servers> </endeca>

3. To change the host name of the MDEX Engine server, update the value of the hostName parameter.

4. To change the port of the MDEX Engine server, update the value of the port parameter.

5. Save and close the file.

6. Restart IIS.

About skinning the reference applicationThe styling of the reference application is implemented through external CSS style sheets, which canbe easily customized.

The style sheets are located in the reference/ContentAssemblerRefApp/css directory of yourContent Assembler API installation. In a typical installation, this isC:\Endeca\ContentAssemblerAPIs\RAD Toolkit forASP.NET\version\reference\ContentAssemblerRefApp\css.

Each cartridge component (or type of component) in the reference application has a correspondingstyle sheet that controls the appearance of that component.

Endeca Content Assembler API Developer's Guide for the RAD Toolkit for ASP.NETEndeca Confidential

15Introduction to the Content Assembler API | Overview of the Content Assembler reference application

Page 16: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The
Page 17: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

Chapter 2

Working with the Content Assembler API

This section provides information on working with the Endeca Content Assembler API classes andserver controls.

Writing applications with the Content Assembler APIThis section describes how to use the Content Assembler API for the RAD Toolkit for ASP.NET toquery the MDEX Engine and access dynamic page content.

About using the Content Assembler with the RAD Toolkit for ASP.NETThe Content Assembler API is used in conjunction with the RAD Toolkit for ASP.NET.

Use a ContentNavigationDataSource in place of a NavigationDataSource to access contentresults from the Content Assembler in addition to MDEX Engine record data.

If you are using the RAD API for programmatic querying, you can access content items from the resultsof a NavigationCommand. The Content Assembler is not intended for use with records detail,dimension search, or metadata queries.

Creating a ContentNavigationDataSource controlYou create and configure a ContentNavigationDataSource control in order to provide dynamic pagecontent and MDEX Engine records to other controls in your Web site.

The ContentNavigationDataSource provides the same design time functionality to populate the othercontrols (e.g. user interface controls) with Endeca record properties as a NavigationDataSource,with the addition of the content items returned by the Content Assembler.

Note: For more information about configuring NavigationDataSource controls, see the EndecaRAD Toolkit for ASP.NET Developer's Guide.

To create and configure an Endeca ContentNavigationDataSource control:

1. Open your Web site in Visual Studio.

2. In the Toolbox window, expand the Endeca RAD Toolkit tab.

3. Drag the ContentNavigationDataSource on to the Design tab of your Web page.

Page 18: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

4. From the smart tag, check Preview Endeca data to populate other controls you add later withrepresentative data from the MDEX Engine.

5. From the smart tag, select Configure Data Source....

6. On the Choose Endeca server screen, specify the host and port on which the MDEX Engine isrunning.

7. At this point, you can either click Finish to finish configuring the data source, or you can click Nextto continue through the wizard and configure optional data source parameters and specify optionalAnalytics query information. Adding data source parameters makes them available to other controlson the page.

8. In the Properties window of Visual Studio, modify the properties for the data source control ifnecessary. Many of the properties are set when you run the Configure Data Source... wizard.

a) Specify a value for the ContentRuleZone property. This property is required and correspondsto the zone that is specified on the template for the dynamic pages that you want to access withthis data source.

In most cases you only need one zone for all your landing pages. Using multiple zones canenable you to provide different perspectives on the same navigation state within your application.

The code generated on the Source tab is similar to the following:

<cc1:ContentNavigationDataSource ID="ContentNavigationDS1" runat="server" MdexPort="7900" MdexHostName="smith-690" ContentRuleZone="NavigationPageZone" ContentValidation="false"> <PermanentRefinementConfigs> <end:RefinementConfig DimensionValueId="3"> </end:RefinementConfig> </PermanentRefinementConfigs></cc1:ContentNavigationDataSource>

About implementing custom trigger conditionsBecause the Content Assembler API retrieves page content based on Endeca's dynamic businessrules functionality, pages can only be triggered on record-filtering dimension values, specific searchterms, a date range, or a single user profile identifier.

These limitations can make it difficult to handle certain scenarios such as the following:

• Search results pages. Dynamic pages are generally configured to display based on a navigationtrigger. This means however that the page for a particular location displays even if a user hasentered a search term on your Web site from that location. For example, you may have set up ahighly branded page to display as your site's home page (at location N=0) that does not includeany record results. This page displays even if a user has performed a search from the home pagelocation, unless a page has been configured specifically to trigger on that search term.

• Record offset pages. There is no simple way to explicitly trigger different content for the first pageof record results (at offset=0) and for subsequent pages, with different page configurations specifiedby the content administrator in Experience Manager.

• Alternate views on the same navigation state. Use cases include A/B testing or toggling betweena product details view and a customer reviews view. By default, the Content Assembler API returnsa single content tree representing a dynamic page for any given navigation state or trigger condition.

Endeca ConfidentialEndeca Content Assembler API Developer's Guide for the RAD Toolkit for ASP.NET

Working with the Content Assembler API | Writing applications with the Content Assembler API18

Page 19: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

There are various approaches that can be used to handle these use cases:

• Filtering landing pages based on rule properties• Using hidden dimensions• Using multiple rule zones• Using multiple user profiles

Any of these strategies can be applied to the scenarios listed above. They can also be used toimplement other custom trigger conditions that you may require. Which approach you use dependson the scenario you are trying to address and the specifics of your application. For guidance on selectingthe appropriate option (or combination of options) and assistance with implementation, contact yourEndeca representative.

About filtering landing pages based on rule properties

If you specify custom rule properties in a page template, you can use those properties to excludecertain landing pages from consideration by the MDEX Engine on a per-query basis.

Filtering based on rule properties can enable your application to implement more fine-grained triggerfunctionality than is available in Experience Manager.

Because the rule properties for a dynamic page are set based on the properties specified within the<RuleInfo> element in the page template, the content administrator must have set up a page intendedfor a particular trigger condition based on a template with the appropriate property.You can provideinformation in the template id (for example, ThreeColumnPage-Search) or description to helpthe content administrator select the appropriate template.

For the purposes of priority, pages based on templates with custom rule properties should be treatedas if they have more specific trigger conditions than the same page with no such properties. (In general,pages with more specific triggering conditions should have higher priority than more generic pages.)

Because the Experience Manager preview functionality cannot replicate your custom logic for filteringpages, the preview status messages may be misleading when you exclude certain pages fromconsideration. However, if your preview application includes the appropriate logic, the correct pagedisplays in the preview pane even if the status messages indicate that a different page fired.

Use case: Search results

You can enable more robust handling of search results pages by creating a template that specifies acustom rule property with a key such as search_results and a value of true. The contentadministrator can then create search results pages based on this template.You can add logic to yourapplication to consider these pages only for search queries (that is, queries that include Ntt and Ntkparameters). If there are no search parameters present, you can augment the query with a filter suchas Nmrf=not(search_results:true) before you pass it to the MDEX Engine via the ContentAssembler API.

For more information about working with rule properties, see "Promoting records with dynamic businessrules" in the Endeca MDEX Engine Advanced Development Guide.

About using hidden dimensions to trigger landing pages

You can create specialized dimensions in your application to expose additional trigger conditions.

This approach involves some additional work in your data pipeline to apply the dimension values tothe records. Once this is done, the content administrator can select the trigger condition in ExperienceManager using the same process as any navigation state.

Endeca Content Assembler API Developer's Guide for the RAD Toolkit for ASP.NETEndeca Confidential

19Working with the Content Assembler API | Writing applications with the Content Assembler API

Page 20: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

Use case: Record offset

You can enable different landing pages based on record offset by creating a dimension such as Offsetwith dimension values such as First Page and Next Pages. During the ITL process, apply both theOffset > First Page and Offset > Next Pages dimension values to all records.The content administratorcan then set up pages for each trigger condition.

You can add logic to your application to augment the navigation filter (N parameter) based on therecord offset value (the No parameter).

For more information about working with dimensions, see the Endeca Platform Services Forge Guide,Endeca MDEX Engine Basic Development Guide, and the Oracle Endeca Developer Studio Help.

About using multiple rule zones for landing pages

Using multiple zones can enable you to provide different perspectives on the same navigation statewithin your application.

Because the zone for a page is set based on the zone attribute of the <RuleInfo> element in thepage template, the content administrator must have set up a page intended for a particular displaycondition based on a template that uses the appropriate zone.You can provide information in thetemplate id or description to help the content administrator select the appropriate template foreach case.

Because the Experience Manager preview functionality does not limit the query to a single zone, thepreview status messages may be misleading when you use multiple zones. However, if your previewapplication includes the appropriate logic, the correct page should display in the preview pane evenif the status messages indicate that more than one page fired.

Also note that although the Content Assembler API only retrieves the content tree from a specific zone,the results from all zones with triggered content are returned as part of the query response, so excessiveuse of multiple zones may lead to a noticeable increase in the size of the query response.

Use case: A/B testing

You can enable A/B testing scenarios by setting up different zones such as Control, VariableA,VariableB, and so on.You then create different templates for each zone, and the content administratorcan create pages based on the different templates.

Your front-end application can set the zone for the content query based on various conditions for whichyou want to expose different views on the data.

For more information about setting up rule zones for landing pages, see the Oracle Endeca ExperienceManager Developer's Guide.

About using multiple user profiles for custom trigger conditions

You can use the user profile functionality to provide different views on the same navigation states.

You can set up specialized user profiles to enable content administrators to set up different pages inExperience Manager for different scenarios. However, if you are already using user profiles for otherpurposes, this usage may interfere with other user profile triggers.

Use case: Different front-end sites backed by the same data

You can present different views on the same data by creating different user profiles in DeveloperStudio such as SiteAUser and SiteBUser. In the Experience Manager, the content administrator canset the user profile to use for each page.

Endeca ConfidentialEndeca Content Assembler API Developer's Guide for the RAD Toolkit for ASP.NET

Working with the Content Assembler API | Writing applications with the Content Assembler API20

Page 21: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

You can add logic to your application to add the appropriate user profile to the query by setting Navi¬gationCommand.UserProfiles in the query.

For more information about setting up user profiles, see the Oracle Endeca Developer Studio Help.For more information about working with user profiles, see "Implementing User Profiles" in the AdvancedDevelopment Guide.

About content XML validationYou can enable XML validation of page configurations by setting the ContentValidation property ofthe ContentNavigationDataSource to true.

Validation can be useful in a testing environment for debugging purposes, particularly if templates arechanging often. Because of the performance impact of validating content XML, this option should neverbe used in production. XML validation is disabled in the ContentNavigationDataSource by default.

Building cartridges to render template-based contentCartridges consist of cartridge templates and their associated rendering code, allowing you to separatethe structure of dynamic page content from its presentation.

Building an ASP.NET application based on cartridges involves the following tasks:

• Writing user controls to render content items based on each template.• For controls that render content items that contain nested content items, adding logic to load the

appropriate user control to render the nested content.

The examples in this section use the DynamicContentPlaceHolder and the IContentControlthat are included as part of the reference application.You can adapt the entire reference application,or simply use these controls as a starting point for writing applications to render dynamic page contentand extend them with further functionality as needed.

About working with content itemsYou can access the IContentItem that contains dynamic page content from a ContentNaviga¬tionDataSource.

An IContentItem contains a KeyedCollection of IProperty objects. An IProperty can containany type of object returned by the MDEX Engine.The type of object depends on the property elementsspecified in the template. Common object types include:

• bool

• string

• IContentItem

• IContentItemList

• INavigationRecords

• ReadOnlyCollection<Record>

Because the properties are defined by the template on which a content item is based, you can accessthe content properties directly based on the property name defined in the template. Typically, youaccess a specific property value using ContentItem.Properties["name"].Value and cast it tothe appropriate object type.

Endeca Content Assembler API Developer's Guide for the RAD Toolkit for ASP.NETEndeca Confidential

21Working with the Content Assembler API | Building cartridges to render template-based content

Page 22: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

Using the Content Assembler reference application controlsThe DynamicContentPlaceHolder and the IContentControl work together to allow you todynamically load user controls to render page content.

These controls are included as part of the reference application.You can use these controls ascomponents in your own custom applications and extend them with further functionality as needed.

To use the reference application controls in your application:

1. Open Windows explorer and navigate to the reference application directory. In a typical installationthis is C:\Endeca\ContentAssemblerAPIs\RAD Toolkit forASP.NET\<version>\reference\ContentAssemblerRefApp\

2. Navigate to the App_Code subdirectory.

3. Copy the following files to a directory of your choice within your Web site directory structure:

• ContentPathManager.cs

• DynamicContentPlaceHolder.cs

• IContentControl.cs

• Config\ContentConfigSectionGroup.cs

• Config\TemplateHandler.cs

• Config\TemplateHandlersSection.cs

When using a DynamicContentPlaceHolder, you must add the following line to your code:

<%@ Register TagPrefix="end" Namespace="ContentRef" %>

If you modify the code and change the namespace of your custom DynamicContentPlaceHolder,update this line accordingly.

Writing user controls to render dynamic contentUser controls designed to render template-based content must implement the IContentControlinterface. This allows a DynamicContentPlaceHolder to load this control and pass a reference tothe content item it should render.

To create user control to render dynamic content:

1. Add the following includes at the top of your code:

using System.Web.UI;using Endeca.Data.Content;

2. Implement the IContentControl interface.This example shows the code-behind for a basic implementation:

public partial class ContentUserControl : UserControl, IContentControl

{

public IContentItem ContentItem { get { return contentItem; }

set

Endeca ConfidentialEndeca Content Assembler API Developer's Guide for the RAD Toolkit for ASP.NET

Working with the Content Assembler API | Building cartridges to render template-based content22

Page 23: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

{ contentItem = value; } }

private IContentItem contentItem; }

3. In the in-line code, access the properties of the content item for rendering.

For example, if you have the following properties defined in a cartridge template:

<ContentTemplate xmlns="http://endeca.com/schema/content-template/2008" type="SidebarItem" id="TextBox"><!-- additional elements not shown in this example -->

<ContentItem> <Name>New Text Box</Name> <Property name="title"> <String/> </Property> <Property name="body"> <String/> </Property> <Property name="link_text"> <String/> </Property> <Property name="link_href"> <String/> </Property> </ContentItem><!-- additional elements not shown in this example -->

</ContentTemplate>

The code to render content items based on this template could look like the following:

<div class="TextBanner"> <div class="Title"><%# (string)ContentItem.Properties["title"].Value %></div> <div class="Body"><%# (string)ContentItem.Properties["body"].Value %></div> <div class="Link"> <a href="<%# (string)ContentItem.Properties["link_href"].Value %>"> <%# (string)ContentItem.Properties["link_text"].Value %> </a> </div></div>

The following example shows a content item list property in a page template and how the correspondingrendering code can display the results.

If the template (PageTemplate-ThreeColumnNavigationPage.xml) includes the following:

<ContentTemplate xmlns="http://endeca.com/schema/content-template/2008" type="PageTemplate" id="ThreeColumnNavigationPage"><!-- additional elements deleted from this example -->

<ContentItem> <Name>New Three-Column Navigation Page</Name> <Property name="left_column"> <ContentItemList type="SidebarItem" /> </Property><!-- additional elements deleted from this example -->

Endeca Content Assembler API Developer's Guide for the RAD Toolkit for ASP.NETEndeca Confidential

23Working with the Content Assembler API | Building cartridges to render template-based content

Page 24: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

</ContentItem><!-- additional elements deleted from this example --></ContentTemplate>

The associated rendering code (ThreeColumnNavigationPage.ascx) may look similar to thefollowing:

<div id="LeftColumn"> <asp:Repeater runat="server" DataSource='<%#ContentItem.Proper¬ties["left_column"].Value %>'> <ItemTemplate> <!-- Dynamically include rendering code for each content item in the list. --> <end:DynamicContentPlaceHolder runat="server" ContentItem='<%# Con¬tainer.DataItem %>' /> </ItemTemplate> </asp:Repeater></div>

About rendering customized navigation refinementsUser controls designed to render customized navigation refinements must implement the IContent¬Control interface to access the configured DimensionList values.

For example:

DimensionStatesResult refinements = (DimensionStatesResult)ContentItem.Prop¬erties["refinements"].Value;

This code is equivalent to using the DimensionStatesResult from a ContentNavigationData¬Source or a NavigationCommand, except that the dimensions returned reflect the contentadministrator's configuration specified in Experience Manager.

Note: If you have precedence rules defined in your application, they still apply to the customizedDimensionList. This means that if the landing page definition specifies certain dimensionsfor display that should not display for that navigation state (whether it is due to precedence rulesor because it is not a valid refinement), those invalid dimensions are not included in the Dimen¬sionList object.

The Content Assembler reference application provides a sample Endeca Guided Navigation cartridge(including rendering code) that uses a navigation refinements property.

About rendering customized results listsIf you enable content administrators to customize the display of record results, the results objectreturned by the Content Assembler API is different from the object returned by the RAD Toolkit forASP.NET.

Recall that you can specify a <NavigationRecords> property in a template with a <Navigation¬RecordsEditor> that enables a content administrator to specify sort order, relevance ranking, andthe number of records to display per page.

Endeca ConfidentialEndeca Content Assembler API Developer's Guide for the RAD Toolkit for ASP.NET

Working with the Content Assembler API | Building cartridges to render template-based content24

Page 25: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

To render the customized navigation results, retrieve the list of records from the navigation recordsproperty, which is of type INavigationRecords. For example:

INavigationRecords navRecs = (INavigationRecords) ContentItem.Properties["navigation_records"].Value;ReadOnlyCollection<Record> recs = navRecs.RecordsResult.Records;

This code is equivalent to using the RecordsResult from a ContentNavigationDataSource ora NavigationCommand, except that the records returned reflect the content administrator'sconfiguration specified in Experience Manager.

You can also use members of the INavigationRecords object as a data source. The ContentAssembler reference application provides a sample cartridge for rendering results lists, includingsample code for using members of INavigationRecords as a data source. Refer to theMainColumnContent-ResultsList.xml template and the ResultsSet.ascx andRecordsControl.ascx classes for more details.

The INavigationRecords object also exposes the following members with values based on themodified query that is used to retrieve the customized results:

• ActiveSorts

• AggregateRecordsResult

• AggregationKey

• AggregationKeys

• RecordsResult

• SortKeys

When working with customized results lists, you must use the INavigationRecords members,rather than the NavigationResults from the main ContentNavigationDataSource.

For example, when rendering a pager component for a customized record list, you should usenavRecs.RecordsResult.RecordsPerPage because the content administrator may have specifieda different number of records per page from the main query (which is reflected in NavigationRe¬sults.RecordsResult.RecordsPerPage).

For further details, refer to the Endeca API Reference for the Content Assembler API for the RADToolkit for ASP.NET.

About customized resultsThe Content Assembler handles sort order, relevance ranking, and records-per-page customizationslightly differently than the RAD Toolkit for ASP.NET. See the sections below for details about howthe Content Assembler handles each configuration option.

The Content Assembler performs an additional query in order to retrieve the customized record resultsfrom the MDEX Engine. If no custom behavior was specified in Experience Manager, no additionalquery is made.

Sort order

The sort order specified by the content administrator in Experience Manager is used as a default. Endusers of the Web application can override this setting if you enable a control for users to specify sortorder.

Endeca Content Assembler API Developer's Guide for the RAD Toolkit for ASP.NETEndeca Confidential

25Working with the Content Assembler API | Building cartridges to render template-based content

Page 26: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

Relevance ranking

If the content administrator specifies both a sort order and a relevance ranking strategy for a singlelanding page and the query that triggers the page contains a search, the Content Assembler passesonly the relevance ranking strategy on to the query to retrieve the customized navigation records. Ifno search is present, both the sort order and the relevance ranking strategy are passed on to thesecond query. In this case, the sort order overrides the relevance ranking.

The relevance ranking strategy specified by the content administrator for a landing page alwaysoverrides any other relevance ranking setting (whether it is coded as default behavior in the applicationor -- less typically -- specified by an end user).

Records per page

The NavigationRecordsEditor provides an optional interface for the content administrator tospecify the number of records to return per page for a given navigation state.

The case where a content administrator has configured a value for records per page and an end useralso specifies a value can lead to undefined and unexpected behaviors. For this reason, if you enableconfiguration of records-per-page display in Experience Manager, it is not recommended that youenable a control for end users to specify records per page in the application.

About rendering record listsRecord list properties represent the results of supplemental queries, for example, to populate promotionsor Content Spotlighting cartridges.

Properties containing record list values are returned as instances of IRecordListProperty, whichis a sub-interface of IProperty. Content administrators can designate either specific records or anavigation query that returns records for spotlighting. An IRecordListProperty that is configuredto display specific featured records always returns a ReadOnlyCollection<Record>.

Note: When a cartridge is configured to display specific featured records and any of the specifiedrecord IDs are invalid, the Content Assembler API for the RAD Toolkit for ASP.NET returns onlythe records that have valid IDs.

An IRecordListProperty that is populated with a NavigationCommand returns either a ReadOn¬lyCollection<Record> or a ReadOnlyCollection<AggregateRecord>, depending on whetherthe NavigationCommand that triggered a landing page has the AggregationKey property set.

If you use rollup keys for aggregated records in your application, then you must check the type of listbeing returned for any IRecordListProperty in one of two ways:

• Check the type of the record list IProperty.Value to determine whether it is a ReadOnlyCol¬lection<AggregateRecord> or a ReadOnlyCollection<Record>.

• Cast the IProperty to an IRecordListProperty, and check the bool value of the Contain¬sAggregateRecords property.

Based on the type of list returned, your application must handle records or aggregated records asappropriate.

If you prefer to render records rather than aggregated records for a Content Spotlighting cartridge ona page with a rollup key, you can render a representative record from the list of constituent records.For example, for each aggregated record, the application can retrieve the first constituent record inthe list as follows:

Record record = aggregateRecord.Records[0];

Endeca ConfidentialEndeca Content Assembler API Developer's Guide for the RAD Toolkit for ASP.NET

Working with the Content Assembler API | Building cartridges to render template-based content26

Page 27: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

where aggregateRecord is the AggregateRecord object.

The Content Assembler reference application provides several sample spotlight cartridges thatdemonstrate how to render a record list property.

Generating see-all linksYou can provide front-end users with a "see-all" link to display the full results set of a navigation querythat was used to populate a spotlight cartridge.

The IRecordListProperty interface has additional public properties for the corresponding Navi¬gationCommand object that aids in creating see-all links.

Note: See-all links cannot be generated for record lists that are returned from record queries.The NavigationCommand object is null when a record query is used to specify the record list.

In URL-based RAD.NET applications, the NavigationCommand object can be serialized using theRAD.NET CommandSerialization class that uses the application CommandSerialization¬Provider. The serialized command can then be used when forming the see-all link URL.

To create a see-all link:

1. Retrieve the record list IProperty object off an IContentItem.

IProperty property = contentItem.Properties["products"];NavigationCommand navigationCommand = null;if (property is IRecordListProperty) {

//Cast the Property to IRecordListProperty IRecordListProperty recListProperty = (IRecordListProperty)property;

navigationCommand = recListProperty.NavCommand;

}

2. Check that the NavigationCommand is not null, then use the CommandSerialization classto serialize the command.

//Check that the navigationCommand is not null:

if (navigationCommand != null) {

String serializedCommand = CommandSerialization.Serialize(navigation¬Command);

}

The serialized command can then be used to generate the link URL.

If you plan to construct URLs using the UrlManager object from the RAD Toolkit for ASP.NET, pleaserefer to the RAD Toolkit for ASP.NET Developer's Guide for more information. To see an examplecartridge that uses a UrlManager, refer to the ThreeRecordBannerSpotlightControl.ascx.csfile located in the Resources\UserControls directory of your Content Assembler referenceapplication installation directory.

Endeca Content Assembler API Developer's Guide for the RAD Toolkit for ASP.NETEndeca Confidential

27Working with the Content Assembler API | Building cartridges to render template-based content

Page 28: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

About the DynamicContentPlaceHolderYou use a DynamicContentPlaceHolder when rendering dynamic pages or any cartridges thathave nested content items within them.

The DynamicContentPlaceHolder is a data-bound control that automatically loads a user controlto handle nested cartridge content. Using the DynamicContentPlaceHolder class to render adynamic page, you would have a generic page that includes a ContentNavigationDataSourceand a single DynamicContentPlaceHolder to load the code that handles the actual rendering ofthe page.

Related LinksUsing the DynamicContentPlaceHolder to render pages on page 28

Because a content administrator chooses which template drives a page, you need to be ableto dynamically load the appropriate code to render them.

Using the DynamicContentPlaceHolder to render cartridge content on page 29When working with content items that contain nested content items, you can use a Dynamic¬ContentPlaceHolder to load the appropriate user control to render the nested content.

Using the DynamicContentPlaceHolder to render pagesBecause a content administrator chooses which template drives a page, you need to be able todynamically load the appropriate code to render them.

Typically, you will have a generic page that includes a ContentNavigationDataSource and asingle DynamicContentPlaceHolder to load the code that handles the actual rendering of thepage.

To render pages based on different templates:

1. Add and configure a ContentNavigationDataSource control.

2. Add a DynamicContentPlaceHolder and set the following properties:

ValueProperty

The ID of the ContentNavigationDataSource to use.DataSourceID

The string "ContentItem".DataMember

The following example shows a simple ContentNavigationDataSource and a DynamicContent¬PlaceHolder that loads the appropriate code to render dynamic page content.

<%@ Register TagPrefix="end" Namespace="ContentRef" %>

<end:DynamicContentPlaceHolder ID="content" runat="server" DataSourceID="dsNav" DataMember="ContentItem" />

<end:ContentNavigationDataSource ID="dsNav" runat="server" MdexHostName='<%$ EndecaConfig:Servers.Servers["Local"].HostName %>'

Endeca ConfidentialEndeca Content Assembler API Developer's Guide for the RAD Toolkit for ASP.NET

Working with the Content Assembler API | Building cartridges to render template-based content28

Page 29: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

MdexPort='<%$ EndecaConfig:Servers.Servers["Local"].Port %>' ContentRuleZone="NavigationPageZone" EnableExposeAllRefinements="true" />

Related LinksUsing the DynamicContentPlaceHolder to render cartridge content on page 29

When working with content items that contain nested content items, you can use a Dynamic¬ContentPlaceHolder to load the appropriate user control to render the nested content.

About the DynamicContentPlaceHolder on page 28You use a DynamicContentPlaceHolder when rendering dynamic pages or any cartridgesthat have nested content items within them.

Using the DynamicContentPlaceHolder to render cartridge contentWhen working with content items that contain nested content items, you can use a DynamicContent¬PlaceHolder to load the appropriate user control to render the nested content.

The DynamicContentPlaceHolder loads the control to render cartridges in the same way as itloads the appropriate control to render dynamic pages. The only difference is that you do not need tospecify a DataSourceID or DataMember, as you are setting the data source via the ContentItemproperty.

To use the DynamicContentPlaceHolder to render cartridge content:

1. Add a DynamicContentPlaceHolder and set the following property:

ValueProperty

The ContentItem object that the loaded control shouldrender.

ContentItem

2. Repeat the previous step for each nested content item that the current content item can contain.For example, if your template defines sections called LeftColumn, CenterColumn, and Right¬Column, you would add three DynamicContentPlaceHolder controls, one to handle eachnested content item.

The following example shows a page template and the corresponding user control that uses a Dynam¬icContentPlaceHolder to render cartridge content:

If the template (PageTemplate-ThreeColumnNavigationPage.xml) includes the following:

<ContentTemplate xmlns="http://endeca.com/schema/content-template/2008" type="PageTemplate" id="ThreeColumnNavigationPage"><!-- additional elements removed from this example -->

<ContentItem> <Name>New Three-Column Navigation Page</Name>

<!-- additional properties removed from this example --> <Property name="left_column"> <ContentItemList type="SidebarItem" /> </Property> <Property name="center_column"> <ContentItemList type="MainColumnContent" /> </Property> <Property name="right_column"> <ContentItemList type="SidebarItem" />

Endeca Content Assembler API Developer's Guide for the RAD Toolkit for ASP.NETEndeca Confidential

29Working with the Content Assembler API | Building cartridges to render template-based content

Page 30: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

</Property><!-- additional elements removed from this example -->

</ContentTemplate>

The code for the associated user control (ThreeColumnNavigationPage.ascx) may look similarto the following:

<%@ Register TagPrefix="end" Namespace="ContentRef" %>

<div class="LeftColumn"> <asp:Repeater runat="server" DataSource='<%#ContentItem.Proper¬ties["left_column"].Value %>'> <ItemTemplate> <end:DynamicContentPlaceHolder runat="server" ContentItem='<%# Con¬tainer.DataItem %>' /> </ItemTemplate> </asp:Repeater></div>

<div id="CenterColumn"> <div id="CenterContent"> <asp:Repeater runat="server" DataSource='<%#ContentItem.Properties["cen¬ter_column"].Value %>'> <ItemTemplate> <end:DynamicContentPlaceHolder runat="server" ContentItem='<%# Container.DataItem %>' /> </ItemTemplate> </asp:Repeater></div>

<div id="RightColumn"> <div id="CenterContent"> <asp:Repeater runat="server" DataSource='<%#ContentItem.Proper¬ties["right_column"].Value %>'> <ItemTemplate> <end:DynamicContentPlaceHolder runat="server" ContentItem='<%# Container.DataItem %>' /> </ItemTemplate> </asp:Repeater></div>

Related LinksUsing the DynamicContentPlaceHolder to render pages on page 28

Because a content administrator chooses which template drives a page, you need to be ableto dynamically load the appropriate code to render them.

About the DynamicContentPlaceHolder on page 28You use a DynamicContentPlaceHolder when rendering dynamic pages or any cartridgesthat have nested content items within them.

About using the RAD Toolkit for ASP.NET server controlswith the Content Assembler

If you prefer not to use user controls similar to those in the Content Assembler reference applicationto render certain Endeca features, you can use the RAD Toolkit for ASP.NET server controls. In this

Endeca ConfidentialEndeca Content Assembler API Developer's Guide for the RAD Toolkit for ASP.NET

Working with the Content Assembler API | About using the RAD Toolkit for ASP.NET server controlswith the Content Assembler

30

Page 31: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

case, the way in which the data sources are passed to the server controls is slightly different from theway it is normally done in the RAD Toolkit for ASP.NET.

To use server controls to render features on landing pages that may have customized navigationrefinements or results lists, you can use a content item member as a data source. The DataSourceis used to render the feature, while the NavigationDataSourceID represents the overall navigationstate for the page to generate URLs for any follow-on queries.

Guided Navigation

The following is a typical example in the RAD Toolkit for ASP.NET:

<cc1:GuidedNavigation ID="GuidedNavigation1" runat="server" DataSourceID="dsNav"></cc1:GuidedNavigation>

The same example with the Content Assembler:

<cc1:GuidedNavigation ID="guidedNavigationServerControl" runat="server" DataSource='<%# new object[] {ContentItem.Properties["refinements"].Value} %>' NavigationDataSourceID="dsNav"> <DimensionStateGroupTemplate></DimensionStateGroupTemplate></cc1:GuidedNavigation>

Note: The default behavior of the server control renders dimensions arranged by dimensiongroups. By specifying an empty DimensionStateGroupTemplate you suppress the displayof dimension group names in cases where a content administrator may have customized thedisplay of dimensions.

Breadcrumbs

Breadcrumbs server controls work with the Content Assembler without any changes, as in this example:

<cc1:Breadcrumbs ID="breadcrumbsServerControl" runat="server" DataSourceID="dsNav" RemoveImageUrl="<%~/images/x.gif%>" />

Pager

The following is a typical example in the RAD Toolkit for ASP.NET:

<cc1:Pager ID="topPaging1" runat="server" DataSourceID="dsNav" />

The same example with the Content Assembler:

<cc1:Pager ID="topPaging1" runat="server" ItemsType='<%# getPagerItemsType() %>'

Endeca Content Assembler API Developer's Guide for the RAD Toolkit for ASP.NETEndeca Confidential

31Working with the Content Assembler API | About using the RAD Toolkit for ASP.NET server controlswith the Content Assembler

Page 32: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

DataSource='<%# getRecordsResult() %>' NavigationDataSourceID="dsNav" />

In addition, the following two methods need to be defined in the code behind:

protected PagerItemsType getPagerItemsType() { INavigationRecords records = (INavigationRecords)ContentItem.Properties["navigation_records"].Value; if (!String.IsNullOrEmpty(records.AggregationKey)) { return PagerItemsType.AggregateRecords; } return PagerItemsType.Records; }

protected object getRecordsResult() { INavigationRecords records = (INavigationRecords)ContentItem.Prop¬erties["navigation_records"].Value; object result = records.RecordsResult; if (!String.IsNullOrEmpty(records.AggregationKey)) { result = records.AggregateRecordsResult; } return new object[] { result }; }

Tag cloud

The following is a typical example in the RAD Toolkit for ASP.NET:

<cc1:TagCloud ID="tagcloud" runat="server" DataSourceID="dsNav" DimensionId="8"></cc1:TagCloud>

The same example with the Content Assembler:

<cc1:TagCloud ID="tagcloud" runat="server" NavigationDataSourceID="dsNav" DataSource='<%# new object[] {ContentItem.Properties["refinements"].Value} %>' DimensionId="8"></cc1:TagCloud>

Using the Content Assembler API for programmaticquerying

This example code connects to an MDEX Engine, creates and executes a NavigationCommand,and retrieves the root content item for a query.

To retrieve content results from a NavigationCommand:

Endeca ConfidentialEndeca Content Assembler API Developer's Guide for the RAD Toolkit for ASP.NET

Working with the Content Assembler API | Using the Content Assembler API for programmatic querying32

Page 33: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

1. Add the following includes at the top of your code:

using System.Collections.ObjectModel;using System.Collections.Generic;using Endeca.Data;using Endeca.Data.Provider;using Endeca.Data.Provider.PresentationApi;using Endeca.Data.Content;using Endeca.Data.Content.Navigation;

2. Create and execute a NavigationCommand.

// A PresentationApiConnection is an EndecaConnection that uses // the Presentation API as a transport.// Future EndecaConnections can use XQuery or other transport mechanismsPresentationApiConnection conn = new PresentationApiConnection("localhost", 8000);

// A NavigationCommand represents a query to the engine that requests // everything except record/aggregate record details and single/compound// dimension searchNavigationCommand cmd = new NavigationCommand(conn);

// ... additional code not shown to set Navigation Command values ...

// NavigationResult contains Records, AggregateRecords, Dimensions, // Breadcrumbs, Analytics, BusinessRules, MetaData, and Supplemental // Objects.NavigationResult res = cmd.Execute();

3. Get the root content item.

IContentItem contentItem = NavigationContentItemCreator.Create(cmd, res, "NavigationPageZone", false)

In the Create() method, the third parameter is the content rule zone and the final parametercontrols content XML validation. Validation should never be enabled in a production environment.

For more details on using the RAD API for programmatic querying, see the Endeca RAD Toolkit forASP.NET Developer's Guide.

Endeca Content Assembler API Developer's Guide for the RAD Toolkit for ASP.NETEndeca Confidential

33Working with the Content Assembler API | Using the Content Assembler API for programmatic querying

Page 34: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The
Page 35: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

Chapter 3

Extending the Content Assembler with TagHandlers

The Content Assembler uses tag handlers to transform content XML into an object representation ofa dynamic page.Tag handlers can be written by the Endeca community (including Endeca ProfessionalServices, partners, or customers) in order to customize or extend the Content Assembler to processcustom content XML and integrate with third-party systems.

About tag handlers in the Content AssemblerA tag handler enables you to define your own processing logic for the content that is configured bycontent administrators in Experience Manager.

When your application queries the MDEX Engine using the Content Assembler API, the correspondinglanding page configuration is returned as part of the response in the form of content XML.The ContentAssembler processes this XML, executing additional queries as needed, and returns a tree of ICon¬tentItem objects and their associated properties.

Each of the standard property types in Experience Manager is represented by an element in XML,such as <String>, <RecordList>, or <ContentItem>. For each of the standard types, the ContentAssembler has a standard tag handler associated with that element that processes the element intoan object.

You can take advantage of the same mechanism to write a tag handler that processes a specificelement in the content XML and returns objects to the application. Community tag handlers processelements outside of the Endeca content XML namespaces (that is, http://endeca.com/schema/con¬tent/2008 and http://endeca.com/schema/content-tags/2008). These elements may beeither pass-through XML defined in the template or custom XML generated by a community editor.For more information on pass-through XML and community editors, refer to the Oracle EndecaExperience Manager Developer's Guide.

The combination of custom XML and a community tag handler enables you to extend the queryprocessing logic in the Content Assembler — for example, by executing additional queries against theMDEX Engine, or interfacing with a third-party system to return data — before returning the results tothe application. Use cases for community tag handlers include the following:

• Given some XML that specifies a rollup key for a navigation query or aggregated record query,pass this key with the query to the MDEX Engine to return records for Content Spotlighting.

• Implement A/B testing for Content Spotlighting by executing different queries to the MDEX Enginefor identical requests.The results of the queries are then transparently passed on to the applicaton.

Page 36: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

• Query a third-party source for information to display on a product detail page. Examples includeRSS feeds, content stored in another repository (such as a CMS), inventory information, or arecommendation engine.

It is not necessary to implement a tag handler to use custom XML. If no tag handler is registered tohandle a particular element, the Content Assembler passes the XML through to the application as astring, which can then be parsed into XML and handled by your rendering logic. A tag handlerprovides a mechanism to encapsulate any processing you need to do for a particular element andabstract this processing from the rendering code.

Scenarios for extending Experience Manager and theContent Assembler

You can use either community editors on their own, community tag handlers on their own, or both ofthem in combination to extend the functionality of Experience Manager.

Following are some common scenarios and their implications for community editors or tag handlers:

Use community tag handler?Use community editor?Scenario

NoNoInclude application-specificinformation in the template as apass-through XML property.

The Content Assembler returnsthe XML to the rendering codefor your application.

If content administrators do notneed to modify the configurationof a property on a per-pagebasis, you do not need to write aspecialized editor.

Example: Information that theapplication uses to render thecartridge, but is of no interest tothe content administrator.

YesNoInclude external configuration inthe template as a pass-throughXML property.

The Content Assembler uses theinformation contained in the XML

If content administrators do notneed to modify the content of a

to query a third-party system, andproperty on a per-page basis, youExample: Hard-codedconfiguration for a third-party returns the results to the

rendering code.do not need to write a specializededitor.system that applies to any page

that uses this template.

NoYesProvide a new interface forcontent administrators to

The community editor outputsstandard Endeca content XML,

This editor is bound to a standardproperty. (In the example, the

configure existing ExperienceManager properties.

which is processed by theeditor modifies a <RecordList>property.)Example: A variation of the

record selector dialog box thatstandard tag handler for recordlists. No additional work isnecessary.enables content administrators

to browse for featured records,instead of entering a record ID.

There are two options:YesProvide an interface to configurefunctionality that is not supported

No

Endeca ConfidentialEndeca Content Assembler API Developer's Guide for the RAD Toolkit for ASP.NET

Extending the Content Assembler with Tag Handlers | Scenarios for extending Experience Managerand the Content Assembler

36

Page 37: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

Use community tag handler?Use community editor?Scenario

The editor provides a specializedinterface for selecting data to

by Experience Managerout-of-the-box.

The Content Assembler returnsthe XML to the application's

populate a cartridge. TheExample: An editor that enablescontent administrators to specify

rendering code, which can thenfetch the reviews from the CMSwhere they are stored.

configuration is saved as acustom XML property.

reviews to display for a particularnavigation state, including Yes (preferred)number of reviews, sort order,and additional filtering options.

The Content Assembler fetchesthe reviews from the CMS beforereturning the content results tothe rendering code for yourapplication.

Similarly, you can use a taghandler and community editor tosend customized queries to anMDEX Engine and return resultsto the rendering code.

Life cycle of a Content Assembler queryThis section describes the sequence of events that occur when the Content Assembler processes aquery.

The following sequence of events occurs when the query is executed:

1. The Content Assembler sends the query to the MDEX Engine and retrieves the ContentResourcefrom the query results.

This is the content XML that represents the landing page configuration created in ExperienceManager.The content XML is retrieved from the properties of the first rule returned in the zone thatyou specified when you configured the ContentNavigationDataSource.

2. The Content Assembler calls ContentAssembler.Assemble().

This method creates an XmlReader that reads the ContentResource, then calls ContentAssem¬bler.Evaluate(), passing in a ContentContext that contains the relevant resources for thecurrent query and the XmlReader that provides access to the content XML.

3. ContentAssembler.Evaluate() calls the Evaluate() method of the appropriate tag handler(in the case of the root element, this is Endeca.Data.Content.Assembler.TagHandlers.Con¬tentItemTagHandler).

This method takes two arguments: the current ContentContext, and an XmlReader positionedat the element to be evaluated.

4. The tag handler marshals the XML element into an object.

As part of the Evaluate() method, the tag handler may execute additional queries against anMDEX Engine or a third-party system. The Content Assembler also provides a mechanism for atag handler to invoke additional tag handlers.

For example, ContentItemTagHandler invokes PropertyTagHandler, which in turn invokestag handlers for specific property types to populate the property values.

Endeca Content Assembler API Developer's Guide for the RAD Toolkit for ASP.NETEndeca Confidential

37Extending the Content Assembler with Tag Handlers | Life cycle of a Content Assembler query

Page 38: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

When the Content Assembler has finished processing the content XML, it has transformed the XMLtree into a tree of IContentItem objects with properties and nested IContentItem objects. Thisobject tree is then returned to the application for rendering.

Class overviewThe Endeca.Data.Content.Assembler namespace contains the classes and interfaces that makeup the core Content Assembler implementation and enable extension of Content Assembler functionalitythrough tag handlers.

DescriptionClass

Used to transform an IContentResource into an objectmodel representation of its content item.

ContentAssembler

Provides access to resources that are shared across taghandlers.

ContentContext

The byte representation of the content XML returned in theMDEX query results.

IContentResource

The ContentAssembler creates an XmlReader to readan IContentResource in order to enable tag handlers toprocess the content XML.

Used internally to fetch an IContentResource object.IContentResourceLocator

Transforms a specific element in the content XML into anobject.

ITagHandler

The Content Assembler ships with several standard taghandlers.You can implement your own tag handlers toprocess custom XML elements.

Related LinksResources managed by the ContentContext object on page 39

The ContentContext object provides access to resources that are shared across taghandlers.

Implementing the tag handler interfaceA tag handler takes an element in the content XML and transforms it into an object. In the typical usecase, you write a tag handler to return the value of a particular property.

Your tag handler can do as much or as little processing as desired during the course of marshalingXML into objects, including executing one or more queries to an MDEX Engine or another third-partysystem.

Endeca ConfidentialEndeca Content Assembler API Developer's Guide for the RAD Toolkit for ASP.NET

Extending the Content Assembler with Tag Handlers | Class overview38

Page 39: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

Important:

All tag handlers are instantiated once, then reused for each element that the Content Assemblerprocesses. Because multiple invocations of a tag handler may be executed concurrently, taghandlers must be reentrant.

For performance reasons, tag handlers should not contain large blocks of synchronized code.

To implement the tag handler interface:

1. Add the the following includes at the top of your code:

using System;using System.Xml;using Endeca.Data.Content;using Endeca.Data.Content.Assembler;

2. Specify the element name and namespace that the tag handler is intended to process by definingthe appropriate properties. For example:

public string TagName { get { return "Integer"; } } public string TagNamespace { get { return "http://endeca.com/sample-schema/2010"; } }

Note: To avoid conflicts between tag handlers, ensure that each tag handler processes anelement that has a unique qualified name.

3. Implement the Evaluate() method.

This method takes an XmlReader positioned at the XML element to process and a ContentCon¬text, and returns an Object to the tag handler that invoked it (typically, a PropertyTagHandler).

Resources managed by the ContentContext objectThe ContentContext object provides access to resources that are shared across tag handlers.

A new ContentContext is instantiated for each search or navigation query executed by a Content¬NavigationDataSource. The ContentContext class includes the following properties:

DescriptionProperty

A reference to the active ContentAssembler.ContentAssembler

You can use the ContentAssembler to invoke additionaltag handlers by calling its Evaluate() method.

Returns the name of the IProperty on which processinghas most recently begun.

LocalPropertyName

This property is set by the PropertyTagHandler when itbegins to process a <Property> element.

A reference to the stack of IContentItem objects currentlybeing assembled.

ContentItems

Endeca Content Assembler API Developer's Guide for the RAD Toolkit for ASP.NETEndeca Confidential

39Extending the Content Assembler with Tag Handlers | Implementing the tag handler interface

Page 40: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

DescriptionProperty

When the ContentItemTagHandler begins to process a<ContentItem> element, it adds the IContentItem tothis stack. The tag handler pops the IContentItem fromthe stack when it is done.

Note: Other tag handlers should not modify the contentitem stack.

A reference to the active ContentResourceLocator.ContentResourceLocator

Typically, you do not need to use the ContentResource¬Locator unless you want to retrieve a ContentResourcefrom a zone other than the one that you specified on theContentNavigationDataSource.You can pass a Con¬tentResource to the ContentAssembler.Assemble()method to transform the content XML into an IContentItemobject (which may contain other IContentItem objects).

Provides access to the ContentResource objects beingassembled.ContentResources or

ContentResourceStack Typically, there is only one ContentResource for any givenquery, and you do not need to access it directly. Rather, taghandlers work on the XML that is passed through the Eval¬uate() method.

Related LinksClass overview on page 38

The Endeca.Data.Content.Assembler namespace contains the classes and interfacesthat make up the core Content Assembler implementation and enable extension of ContentAssembler functionality through tag handlers.

About invoking other tag handlersYou can write tag handlers that invoke other tag handlers (either standard tag handlers or othercommunity tag handlers).

You invoke another tag handler by calling ContentAssembler.Evaluate() and passing in anXmlReader positioned at the element to be processed, along with a reference to the current Content¬Context.

return pContext.ContentAssembler.Evaluate( pContext, pReader );

The ContentAssembler.Evaluate() method identifies the appropriate tag handler for the element,if one exists, and calls its Evaluate() method.

It is not necessary to invoke other tag handlers from within your own tag handler, even if you havenested elements within your custom XML.There are two cases in which this may be especially useful.

Endeca ConfidentialEndeca Content Assembler API Developer's Guide for the RAD Toolkit for ASP.NET

Extending the Content Assembler with Tag Handlers | Implementing the tag handler interface40

Page 41: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

Multiple combinations of valid child elements

You may have optional elements or different possible combinations of elements within your customXML. In such a case, rather than adding logic to check for each element that your tag handler mayhave to process, you can write separate tag handlers for each possible child element. The parent taghandler can simply iterate through the child elements and call ContentAssembler.Evaluate()on each child.

For example, the standard RecordList element can contain either a RecordQuery (for featuredrecords) or a NavQuery (for dynamic records). The RecordListTagHandler invokes either theRecordQueryTagHandler or the NavQueryTagHandler to perform a query against the MDEXEngine that returns the records for a Content Spotlighting cartridge.

Same element nested under more than one parent

Your use of custom XML within your application may produce a structure similar the following:

<Property> <TagA> <TagC/> </TagA></Property><Property> <TagB> <TagC/> </TagB></Property>

In this case, you can write separate tag handlers for <TagA> and <TagB> that each invoke a thirdhandler for <TagC>. This ensures consistent handling of <TagC> regardless of its parent element.

Integrating a tag handler into the Content AssemblerThe Content Assembler API provides a simple interface for registering tag handlers.

This procedure assumes that you have already written a tag handler class that implements Endeca.Da¬ta.Content.Assembler.ITagHandler.

To integrate a tag handler with the Content Assembler for the RAD Toolkit for ASP.NET:

1. Register your tag handler by updating your application configuration.You can specify theconfiguration in the app.config or Web.config file for your application.

2. Package the tag handler as an assembly (DLL).

3. Install the tag handler by copying the assembly into the \bin directory of your application.

4. Restart IIS.

In order for the Content Assembler to make use of the new tag handler, the content XML must containthe element that the tag handler is intended to process.You can achieve this in one of the followingways:

• Specify pass-through XML in a page template or cartridge template.• Specify a custom property type in a template and bind it to an editor that generates custom XML.

Endeca Content Assembler API Developer's Guide for the RAD Toolkit for ASP.NETEndeca Confidential

41Extending the Content Assembler with Tag Handlers | Integrating a tag handler into the ContentAssembler

Page 42: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

Registering a tag handlerYou register a tag handler by specifying it in your application's app.config or Web.config file.

To register a tag handler:

1. Open the app.config or Web.config file for your application.

2. Define the tag handler configuration section as in the following example:

<configSections> <sectionGroup name="endeca.content" type="Endeca.Data.Content.Configuration.EndecaContentSectionGroup, Endeca.Data.Content, Version=2.1.0.0, Culture=neutral, PublicKeyToken=6d02be8724ca751c" > <section name="tagHandlers" type="Endeca.Data.Content.Configuration.TagHandlersSection, Endeca.Data.Content, Version=2.1.0.0, Culture=neutral, PublicKeyToken=6d02be8724ca751c" /> </sectionGroup></configSections>

3. Specify the assembly-qualified type name for each tag handler as in the following example:

<endeca.content> <tagHandlers> <add handlerType="Endeca.Data.Content.Sample.IntegerTagHandler, Endeca.Data.Content.Sample" /> </tagHandlers></endeca.content>

As the Content Assembler processes the content XML that represents a landing page, it invokes theappropriate tag handler for each element. In the sample content XML excerpt below, the ContentAssembler would call the Evaluate() method of the Endeca.Data.Content.Sample.Inte¬gerTagHandler handler to process the <Integer> element. In this case, it returns an IPropertyobject with an int value of 17.

<ContentItem type="PageTemplate"> <TemplateId>IntegerTagSample</TemplateId> <Name>Integer demo</Name> <Property name="humbug"> <Integer xmlns="http://endeca.com/sample-schema/2010">17</Integer> </Property> </ContentItem>

Standard tag handlers in the Content AssemblerThe Content Assembler API package includes several tag handlers associated with the standardproperty types.

The following handlers are provided for the standard Experience Manager content types:

Tag handler implementationXML element

Endeca.Data.Content.Assembler.TagHan¬dlers.BooleanTagHandler

http://endeca.com/schema/con¬tent/2008:Boolean

Endeca.Data.Content.Assembler.TagHan¬dlers.ContentItemTagHandler

http://endeca.com/schema/con¬tent/2008:ContentItem

Endeca ConfidentialEndeca Content Assembler API Developer's Guide for the RAD Toolkit for ASP.NET

Extending the Content Assembler with Tag Handlers | Integrating a tag handler into the ContentAssembler

42

Page 43: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

Tag handler implementationXML element

Endeca.Data.Content.Assembler.TagHan¬dlers.ContentItemListTagHandler

http://endeca.com/schema/con¬tent/2008:ContentItemList

Endeca.Data.Content.Navigation.TagHan¬dlers.DimensionListTagHandler

http://endeca.com/schema/content-tags/2008:DimensionList

Endeca.Data.Content.Navigation.TagHan¬dlers.NavigationRecordsTagHandler

http://endeca.com/schema/content-tags/2008:NavigationRecords

Endeca.Data.Content.Navigation.TagHan¬dlers.NavigationRefinementsTagHandler

http://endeca.com/schema/content-tags/2008:NavigationRefinements

Endeca.Data.Content.Navigation.TagHan¬dlers.NavigationResultTagHandler

http://endeca.com/schema/content-tags/2008:NavigationResult

Endeca.Data.Content.Navigation.TagHan¬dlers.NavQueryTagHandler

http://endeca.com/schema/content-tags/2008:NavQuery

Endeca.Data.Content.Assembler.TagHan¬dlers.PropertyTagHandler

http://endeca.com/schema/con¬tent/2008:Property

Endeca.Data.Content.Navigation.TagHan¬dlers.RecordListTagHandler

http://endeca.com/schema/con¬tent/2008:RecordList

Endeca.Data.Content.Navigation.TagHan¬dlers.RecordQueryTagHandler

http://endeca.com/schema/content-tags/2008:RecordQuery

Endeca.Data.Content.Navigation.TagHan¬dlers.SortTagHandler

http://endeca.com/schema/content-tags/2008:Sort

Endeca.Data.Content.Assembler.TagHan¬dlers.StringTagHandler

http://endeca.com/schema/con¬tent/2008:String

Endeca.Data.Content.Navigation.TagHan¬dlers.SupplementTagHandler

http://endeca.com/schema/content-tags/2008:Supplement

About the sample tag handlerThe Content Assembler API package includes a sample tag handler implementation.

The sample is located in ContentAssemblerAPIs\RAD Toolkit forASP.NET\version\reference\tag_handlers and includes the following:

DescriptionFile

Contains a sample tag handler that transforms thecontents of an <Integer> element into an int.

Endeca.Data.Content.Sample.dll

The source code for the IntegerTagHandler.IntegerTagHandler.cs

A sample page template that contains an <Inte¬ger> property.

PageTemplate-IntegerTagSample.xml

The sample package is intended to demonstrate the integration points between tag handlers and theContent Assembler. It does not include any rendering code for the reference application to make useof the integer property returned by the Content Assembler.

Endeca Content Assembler API Developer's Guide for the RAD Toolkit for ASP.NETEndeca Confidential

43Extending the Content Assembler with Tag Handlers | About the sample tag handler

Page 44: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

Installing the sample tag handlerThe sample tag handler is provided as an assembly along with a simple page template that definesan <Integer> property with a default value.

To install the sample tag handler:

1. Register the tag handler by editing the app.config or Web.config file for your application.

a) Define the config section as follows:

<configSections> <sectionGroup name="endeca.content" type="Endeca.Data.Content.Configuration.EndecaContentSectionGroup,

Endeca.Data.Content, Version=2.1.0.0, Culture=neutral, PublicKeyToken=6d02be8724ca751c" > <section name="tagHandlers" type="Endeca.Data.Content.Configuration.TagHandlersSection, Endeca.Data.Content, Version=2.1.0.0, Culture=neutral, PublicKeyToken=6d02be8724ca751c" /> </sectionGroup></configSections>

b) Specify the tag handler as follows:

<endeca.content> <tagHandlers> <add handlerType="Endeca.Data.Content.Sample.IntegerTagHandler, Endeca.Data.Content.Sample" /> </tagHandlers></endeca.content>

2. Copy the assembly into the \bin directory of your application.

3. Restart IIS.

4. Copy the sample template to your local templates directory and upload it using the emgr_updateutility. For example:

emgr_update.bat --action set_templates --host localhost:8006 --app_name My_application --dir c:\endeca-app\templates\

The template does not define any editors associated with the integer property. The <Integer>element is treated as pass-through XML.

About extending the Content Assembler to validate customXML

You can configure the Content Assembler to validate content XML, including custom XML.

Recall that you can enable XML validation in Content Assembler by setting the ContentValidationproperty of the ContentNavigationDataSource to true.

If validation is enabled, the Content Assembler performs schema validation as it processes the contentXML. By default, the Content Assembler validates any elements within the Endeca content XMLnamespaces (http://endeca.com/schema/content/2008 and http://ende¬ca.com/schema/content-tags/2008) that are defined in the associated schemas.

Endeca ConfidentialEndeca Content Assembler API Developer's Guide for the RAD Toolkit for ASP.NET

Extending the Content Assembler with Tag Handlers | About extending the Content Assembler tovalidate custom XML

44

Page 45: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

You can specify additional schemas that the Content Assembler uses to validate content XML byediting the application configuration.You can specify additional schemas in either the Web.configor the app.config file, as in the following example:

<!--specify the config section as follows; the tagHandlers section should already have been added to specify the tag handlers themselves--><configSections> <sectionGroup name="endeca.content" type="Endeca.Data.Content.Configuration.EndecaContentSectionGroup, Endeca.Data.Content, Version=2.1.0.0, Culture=neutral, PublicKeyToken=6d02be8724ca751c" > <section name="tagHandlers" type="Endeca.Data.Content.Configuration.TagHandlersSection, Endeca.Data.Content, Version=2.1.0.0, Culture=neutral, PublicKeyToken=6d02be8724ca751c" />

<section name="schemas" type="Endeca.Data.Content.Configuration.SchemasSection, Endeca.Data.Content, Version=2.1.0.0, Culture=neutral, PublicKeyToken=6d02be8724ca751c" /> </sectionGroup></configSections>

<!-- additional elements not included in this example -->

<endeca.content> <tagHandlers> <add handlerType="Endeca.Data.Content.Sample.IntegerTagHandler, Endeca.Data.Content.Sample" /> </tagHandlers><!-- specify additional schemas as in the following example --> <schemas>

<add namespace="http://endeca.com/sample-schema/2010" uri="Endeca.Data.Content.Sample.Resources.integer_tag_handler.xsd" assembly="Endeca.Data.Content.Sample"/> </schemas></endeca.content>

At runtime, the Content Assembler matches the namespace of each element in the content XMLagainst the namespaces defined in the configuration file. If the associated schema file defines theelement being processed, the Content Assembler validates that element against the schema.

Note: Validation can be useful in a testing environment for debugging purposes, particularly ifyou are working with a community editor that generates custom XML. Because of the performanceimpact of validating content XML, this option should never be used in production. XML validationis disabled in the ContentNavigationDataSource by default.

Endeca Content Assembler API Developer's Guide for the RAD Toolkit for ASP.NETEndeca Confidential

45Extending the Content Assembler with Tag Handlers | About extending the Content Assembler tovalidate custom XML

Page 46: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The
Page 47: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

Index

C

cartridgesand user controls 22building 21rendering code 22rendering custom navigation refinements 24rendering custom results lists 24

class overviewcom.endeca.content.assembler 38ContentContext object 39

community editorsscenarios 36

community tag handlersscenarios 36

Content Assembler APIand RAD API 32components 10

Content Assembler API for the RAD Toolkit for ASP.NETand the RAD Toolkit for ASP.NET 17

Content Assembler reference application controls, using22content items and Content Assembler API 21content properties, accessing 21content query

and content XML validation 21executing 32results 32

ContentNavigationDataSource and content XMLvalidation 21ContentNavigationDataSourceControl 17custom navigation refinements, rendering 24custom results lists

additional considerations 25rendering 24

custom trigger conditionsfiltering based on rule properties 19overview 18using hidden dimensions 19with rule zones 20with user profiles 20

D

dynamic content 11DynamicContentPlaceHolder 22

introduced 28using 28, 29

E

Endeca Content Assembler APIdynamic content 11overview 9

Endeca Content Assembler reference applicationcartridges 14CSS 15host, changing 15overview 11port, changing 15skinning 15templates 14

I

IContentControl 22

R

RAD Toolkit for ASP.NET server controls 31

S

see-all links 27server controls 31

T

tag handlersabout 35implementing 38in life cycle of Content Assembler query 37integrating with Content Assembler 41invoking from other tag handlers 40list of standard tag handlers 42registering 42sample 43, 44

X

XML validationextending 44

Page 48: Endeca Content Assembler API - Oracle › cd › E28913_02 › ContentAssemblerNET.21… · Optimization API, available as part of the optional Search Engine Optimization Module.The

Recommended