April 19, 2020
Estimated Post Reading Time ~

Select from Pages in a CQ5 Dialog

When constructing a dialog, you may want to present users with a list of pages to select from.  Browse and path fields work well for selecting from a tree, but often you may need to show just the pages from a single folder or from some discrete list.

Using the optionsProvider

One way to do this is to create a selection field and populate the value through a JavaScript function in the optionsProvider field.  This field is supposed to contain a function that gets called when the dialog loads and returns a JavaScript Array of Objects containing the data to populate the selection.
Each object can have the following attributes:
    • value - The value to save into the repository
    • text - The text to display to the user
    • qtip - hover text, extra information for the user

Getting the URL
First, we get the path to the pages to retrieve. Depending on your need you can calculate a path or hard code the path. In this case, we will get the current page's path and append the selector 'infinity.json'. This selector will create a JSON representation of the page structure, you can also control how deep the JSON structure will be by replacing infinity with a number, ex: 2.json
Next, we pass that path into a function that will create a non-cacheable URL.  This ensures CQ will not serve up cached data when the author attempts to use the dialog.

// get the URL to retrieve the pages
var url = CQ.HTTP.noCaching(CQ.HTTP.getPath()+'.infinity.json');

Retrieving the Page JSON Data

Once we have the url, we can get CQ to retrieve it.  CQ provides a convenience function for asynchronous JSON GET request, so we'll use that:
var childPages = CQ.HTTP.eval(url);

Creating the List of Pages

Finally, we will loop through the list of child pages and extract the information we need to construct our list.  Since the JSON representation includes all of the properties for the page, it is easy to retrieve the title or even have conditional logic depending on what attributes are available on the page.

// loop through the child pages and create the list of child pages
for(var name in childPages){
    if(childPages[name]['jcr:content']){
        var child = {};
        child['text'] = childPages[name]['jcr:content']['jcr:title'];
        child['value'] = CQ.HTTP.getPath() + '/' + name;
        children.push(child);
    }
}

Wrapup

Once we have the array of children objects, we can return that array and it will be used to populate the select field.  In the end, your optionsProvider function will look like:
function(){
  //create an array of the child pages
  var children = new Array();
  // get the URL to retrieve the pages
  var url = CQ.HTTP.noCaching(CQ.HTTP.getPath()+'.infinity.json');
  //retrieve the child pages
  var childPages = CQ.HTTP.eval(url);
  // loop through the child pages and create the list of child pages
  for(var name in childPages){
    if(childPages[name]['jcr:content']){
      var child = {};
      child['text'] = childPages[name]['jcr:content']['jcr:title'];
      child['value'] = CQ.HTTP.getPath() + '/' + name;
      children.push(child);
    }
  }
  return children;
}
You can download a complete example dialog xml, make sure to right-click and save as.


By aem4beginner

No comments:

Post a Comment

If you have any doubts or questions, please let us know.