CQ5/AEM 组件的 Item Load Path 在幕后是如何工作的?

In CQ5/AEM how does components' Item Load Path work behind the scene?

在 CQ5 中,项目加载路径字段允许作者提供 url 从中加载下拉列表 list/checkbox 组中可用的选项等。但它实际上是如何工作的?

编辑:我使用的是 5.6.1 版本以防相关

这是我所知道的:

1) 我知道 CQ5 中的组件对话框将其内容存储在:

/content/page/jcr:content/<component node>

在这种情况下,它存储在名为“./optionLoadPath”的 属性 中:

2) 我知道在任何组件(例如,复选框组件)中,要显示的值列表通过以下方式加载到字符串列表中:

编辑 2:@awadheshv 刚刚指出要显示的值列表实际上是使用 FormsHelper.getOptions() 加载的。如果是这样,getValueAsList 在做什么?

final List<String> values = FormsHelper.getValuesAsList(slingRequest, resource);

在使用 forloop 显示之前:

for (String v : displayValues.keySet()) {
    final String t = displayValues.get(v);
    final String currentId = id + "-" + i;

%><div class="form_row"><%
    LayoutHelper.printTitle(currentId, t, false, true, out);
    %><div class="form_rightcol"><%

            String checked = "";
            if (values.contains(v)) {
                checked = " checked=\"checked\"";
            }
        %><input class="<%= FormsHelper.getCss(properties, "form_field form_field_checkbox") %>" type="checkbox"
                 id="<%= StringEscapeUtils.escapeHtml4(currentId) %>" name="<c:out value="<%= name %>"/>"
                 value="<c:out value="<%= v %>"/>" <%= checked %> />&nbsp;<c:out value="<%= t %>" />
    </div>
</div><%

    i++;
}

3) 我也知道 FormsHelper.getValuesAsList 只是调用 FormsHelper.getValues 并将返回的数组转换为列表。

public static List<String> getValuesAsList(final SlingHttpServletRequest request, final Resource elementResource) {
    final String[] values = getValues(request, elementResource);
    if ( values == null ) {
        return Collections.emptyList();
    }
    return Arrays.asList(values);
}

但我不明白这一切是如何组合在一起的。 optionLoadPath 中的项目列表在什么 point/how 处传递给 FormsHelper?

此外,如果我想默认加载这些值,我该怎么做呢?例如,如果有一个国家列表我想加载到组件网络中。我仍然想让用户能够根据需要将 URL 更改为不同的国家/地区列表,但我想在将组件放入页面后立即加载默认列表。我该怎么做?

我不认为 loadOptions 是通过 getValues 获取的。 FormsHelper class 有一个单独的方法 getOptions 从 jcr 获取 optionsLoadPath 属性;实现如下-

public static Map<String, String> getOptions(SlingHttpServletRequest request, Resource elementResource)
  {
    ValueMap properties = ResourceUtil.getValueMap(elementResource);

    String[] options = null;
    String loadPath = (String)properties.get("optionsLoadPath", "");
    if (loadPath.length() > 0)
    {
      Resource rsrc = request.getResourceResolver().getResource(loadPath);
      if (rsrc != null) {
        options = (String[])rsrc.adaptTo([Ljava.lang.String.class);
      }
    }

    if (options == null) {
      options = (String[])properties.get("options", [Ljava.lang.String.class);
    }

    if (options == null) {
      return null;
    }

    Map splitValues = new LinkedHashMap();
    for (int i = 0; i < options.length; ++i) {
      String value = options[i].trim();
      if (value.length() > 0) {
        boolean endLoop = true;
        int pos = -1;
        int start = 0;
        do {
          pos = value.indexOf(61, start);

          if ((pos > 0) && (value.charAt(pos - 1) == '\')) {
            start = pos + 1;
            endLoop = false;
          } else {
            endLoop = true; }
        }
        while (!(endLoop));
        String t;
        if (pos == -1) {
          String v = value;
          t = value;
        } else {
          v = value.substring(0, pos);
          t = value.substring(pos + 1);
        }
        String v = v.replace("\=", "=");
        String t = t.replace("\=", "=");
        splitValues.put(v, t);
      } else {
        splitValues.put("", "");
      }
    }
    if (splitValues.size() == 0) {
      return null;
    }
    return splitValues;
  }

组件代码将显式调用 getOptions。例如-

 Map<String, String> displayValues = FormsHelper.getOptions(slingRequest, resource);

第二点 - 你可以将默认值放在 options 属性.