在CQ5中设置自定义多字段元素的最小值和最大值?

时间:2016-06-17 13:52:35

标签: javascript cq5 aem day-cq

我目前正在研究包含自定义多字段的AEM组件,我遇到了一个问题,我不知道如何解决它。 我为此创建了一个自定义小部件,允许在multiefield中包含multiefield。从文档阅读开始,据我所知,对于小部件API配置,没有默认配置。

我的对话节点:

<questions
    jcr:primaryType="cq:Widget"
    xtype="panel"
    title="Questions">
    <items jcr:primaryType="cq:WidgetCollection">
        <quiz-data
                jcr:primaryType="cq:Widget"
                fieldDescription="Click the '+' to add a new data"
                fieldLabel="Quiz"
                name="./quizData"
                xtype="multifield">
            <fieldConfig
                    jcr:primaryType="cq:Widget"
                    xtype="apps.mypath.widgets.MultieField"/>
        </quiz-data>
    </items>
</questions>

小部件工作正常,但我想设置最低要求的多字节和最大值。我在网上找到了一个例子,但我真的不明白该怎么做,请看下面的代码:

myNamespace = {};
myNamespace.myCustomFunction = function (dialog) {
    var isValid = function () {
        var valStatus = true;
        ... custom JavaScript/jQuery to check if 3 items exist ...
        return valStatus;
    };
    if (!isValid()) {
        CQ.Ext.Msg.show({title: 'Validation Error', msg: 'Must contain at least 3 items!', buttons: CQ.Ext.MessageBox.OK, icon: CQ.Ext.MessageBox.ERROR});
        return false;
    } else {
        return true;
    }
}

如果有人可以解释我如何为我的自定义多字段或任何其他想法实现这一点,那会很棒吗?如果您有任何问题,请告诉我。

1 个答案:

答案 0 :(得分:3)

要在Classic UI中实现JavaScript,您将使用Listeners。例如:

<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:cq="http://www.day.com/jcr/cq/1.0"
          xmlns:jcr="http://www.jcp.org/jcr/1.0"
          xmlns:nt="http://www.jcp.org/jcr/nt/1.0"
          jcr:primaryType="cq:Dialog"
          height="600"
          width="600"
          title="My Component"
          xtype="dialog">
    <listeners
        jcr:primaryType="nt:unstructured"
        beforesubmit="function(dialog){ return myNamespace.myCustomFunction(dialog); }"/>
    <items jcr:primaryType="cq:TabPanel">
        <items jcr:primaryType="cq:WidgetCollection">
        </items>
    </items>
</jcr:root>

CQ Widgets API documentation中列出了您可以使用的所有听众。例如,如果您查看Dialog API,您将看到所有公共活动。

我无法评论您的自定义窗口小部件,但是此JavaScript示例与上面的对话框侦听器结合使用时,将验证所有具有maxLimitminLimit自定义属性的多字段。

对话框:

<quiz-data
    jcr:primaryType="cq:Widget"
    fieldDescription="Click the '+' to add a new data"
    fieldLabel="Quiz"
    name="./quizData"
    minLimit="2"
    maxLimit="4"
    xtype="multifield">
    <fieldConfig
        jcr:primaryType="cq:Widget"
        xtype="textfield"/>
</quiz-data>

JavaScript:

var myNamespace = myNamespace || {};

myNamespace.myCustomFunction(dialog){
  var multifields
      field,
      max,
      min,
      length,
      x;

  multifields = dialog.findByType('multifield');

  for (x = 0; x < multifields.length; x++) {

    field = multifields[x];
    max = parseInt(field.maxLimit, 10);
    min = parseInt(field.minLimit, 10);
    length = field.getValue().length;

    if (max && length > max) {
      CQ.Ext.Msg.show({
        title: 'Validation Error',
        msg: field.fieldLabel + ' must have no more than ' + max + ' items.',
        buttons: CQ.Ext.MessageBox.OK, icon: CQ.Ext.MessageBox.ERROR});
      return false;
    } else if (min && length < min) {
      CQ.Ext.Msg.show({
        title: 'Validation Error',
        msg: field.fieldLabel + ' must have at least ' + min + ' items.',
        buttons: CQ.Ext.MessageBox.OK, icon: CQ.Ext.MessageBox.ERROR});
      return false;
    }
  }
}