在Magnolia有幾種方法可以做到這一點。我將通過一個例子展示兩者。
首先,我們需要一個組件和一個對話框:
# component
dialog: valid:texttext
description: some yummy text you should enter
renderType: freemarker
title: Texttext
templateScript: /valid/templates/components/texttext.ftl
# dialog
actions:
commit:
label: save changes
class: info.magnolia.ui.admincentral.dialog.action.SaveDialogActionDefinition
cancel:
label: cancel
class: info.magnolia.ui.admincentral.dialog.action.CancelDialogActionDefinition
form:
tabs:
- name: tabMain
label: Texttext Dialog
fields:
- name: text1
label: text1
description: enter some text 1
class: info.magnolia.ui.form.field.definition.TextFieldDefinition
validators:
adsizes:
class: info.magnolia.test.field.validator.SizeFieldsValidatorDefinition
errorMessage: Invalid ad size entered
- name: text2
label: text2
description: enter some text 2
class: info.magnolia.ui.form.field.definition.TextFieldDefinition
validators:
imgsizes:
class: info.magnolia.ui.form.validator.definition.RegexpValidatorDefinition
errorMessage: invalid image size entered
pattern: ^\[.*$
你會注意到我添加了兩個字段驗證:「adsizes」和「imgsizes」。做這樣的事情的第一種方式就是用一個大的正則表達式作爲RegexpValidatorDefinition的'模式'屬性,就像我在'imgsizes'上做的那樣。這個特定的正則表達式可以是任何東西......我在那裏只是說我們希望該行以'['字符開頭。在你的特定例子中,你需要一個條件正則表達式來處理這一行。一種天真的解決方案,如
^\[(\[?\d+\,\s?\d+\]?\,?\s?){1,}\]$
未通過廣告尺寸的測試#7,在您的列表中。
在我的觀點和經驗中,如果我們不試圖對他們太過聰明,regexen更容易調試/維護。也就是說,不是試圖在一行中做五件事,爲什麼不在五行中做五件事?這是我的第二種方式進來的地方。
你會注意到text1字段我已經附加了一個名爲SizeFieldsValidatorDefinition的自定義驗證器。這是典型的玉蘭模式:
package info.magnolia.test.field.validator;
import info.magnolia.ui.form.validator.definition.ConfiguredFieldValidatorDefinition;
public class SizeFieldsValidatorDefinition extends ConfiguredFieldValidatorDefinition {
public SizeFieldsValidatorDefinition() {
setFactoryClass(SizeFieldsValidatorFactory.class);
}
}
package info.magnolia.test.field.validator;
import info.magnolia.context.Context;
import info.magnolia.ui.form.validator.factory.AbstractFieldValidatorFactory;
import com.vaadin.data.Item;
import com.vaadin.data.Validator;
public class SizeFieldsValidatorFactory extends AbstractFieldValidatorFactory<SizeFieldsValidatorDefinition> {
private final Item item;
private final Context context;
public SizeFieldsValidatorFactory(final SizeFieldsValidatorDefinition definition, final Item item, final Context context) {
super(definition);
this.item = item;
this.context = context;
}
public Validator createValidator() {
return new SizeFieldsValidator(item, context, getI18nErrorMessage());
}
}
package info.magnolia.test.field.validator;
import info.magnolia.context.Context;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang3.StringUtils;
import com.vaadin.data.Item;
import com.vaadin.data.validator.AbstractStringValidator;
public class SizeFieldsValidator extends AbstractStringValidator {
private final Item item;
private final Context context;
public SizeFieldsValidator(final Item item, final Context context, final String errorMessage) {
super(errorMessage);
this.item = item;
this.context = context;
}
@Override
protected boolean isValidValue(String text1) {
if (!StringUtils.isEmpty(text1)) {
return checkit(text1);
}
return false;
}
private boolean checkit(String text1) {
// the atomic pattern '[number,number]':
Pattern atom = Pattern.compile("\\[\\d+\\s?\\,\\s?\\d+\\]");
// must start with '[' and end with ']' in all cases:
Pattern pattern = Pattern.compile("^\\[(.*)\\]$");
Matcher matcher = pattern.matcher(text1);
if (!matcher.matches()) {
return false;
}
// the bit inside the required outer '[' and ']':
String data = matcher.group(1);
// now check that the bits inside follow the plan:
if (!Pattern.matches("\\d+\\s?\\,\\s?\\d+", data) && !Pattern.matches("(" + atom + "\\s?\\,?\\s?){1,}", data)) {
//^bare numbers //^multiple objs
return false;
}
return true;
}
}
正如你所看到的,這一點,我的首選解決方案,實際上是打破了問題分成幾個步驟:首先,我們要確保是什麼輸入的用戶開始用「[」和以']'結尾,然後我們確定其他東西是一個空的元組,或者是這些元組的集合。再次,寫這些正則表達式有更好看的方法,並且有更多簡潔的方法來寫它們。但這種方式是可維護。並且,它會通過您爲廣告尺寸提出的所有測試。
我已經將圖片尺寸作爲練習留給了您,因爲它與廣告尺寸非常相似。
我希望這會有所幫助。
我不明白這裏要問什麼,你問我們的正則表達式來實現這個嗎? – zack6849
是的zack6849,我正在尋找正則表達式驗證。我編輯了這個問題,所以它更清晰 – sirhc