Новости | FAQ | Авторы | Документация | В действии | Библиотека |
Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
Азат Разетдинов 17.05.2007 21:08 / 17.05.2007 21:20
Решил реализовать давнюю идею и написал класс для серверной валидации форм с использованием атрибутов, описанных в WebForms 2.0# выбираем все формы $hForms[^xPage.select[//form]] ^for[i](0;$hForms-1){ # выбираем все кнопки формы $hButtons[^hForms.$i.select[//field[@type='submit']]] ^for[j](0;$hButtons-1){ $sAction[^hButtons.$j.getAttribute[name]] # если пользователь нажал на одну из них ^if(def $form:$sAction && $$sAction is junction){ ^use[WebForms.p] # и форма прошла валидацию ^if(^WebForms:checkValidity[$hForms.$i]){ # вызываем одноименный метод ^self.$sAction[] } } } }Пример xslt-кода:
<xsl:if test='@valid = 0'> <span class='alert'> <xsl:if test='@valueMissing'> <br /><xsl:value-of select='$locale/form/valueMissing'/> </xsl:if> <xsl:if test='@typeMismatch'> <br /><xsl:value-of select='$locale/form/typeMismatch[@type=current()/@type]'/> </xsl:if> <xsl:if test='@tooLong'> <br /><xsl:value-of select='$locale/form/tooLong'/> <xsl:text> </xsl:text><xsl:value-of select='@maxlength'/> </xsl:if> <xsl:if test='@patternMismatch'> <br /><xsl:value-of select='@title'/> </xsl:if> <xsl:if test='@customError'> <br /><xsl:value-of select='@validationMessage'/> </xsl:if> </span> </xsl:if>Собственно, сам класс:
@CLASS WebForms @USE Lib.p @auto[] $reDate[\d{4}-\d{2}-\d{2}] $reTime[\d{4}:\d{2}(?::\d{2}(?:\.\d+)?)?] $reNumber[-?\d+(?:\.\d+)?(?:e\d+)?] $reUrl[(?:[a-z]+://)?[:\w~%{}./?=&@,#-]+] #end @auto[] @checkValidity[xForm][i;hFields;hAttr;sName;xAttr] $hFields[^xForm.select[//field]] ^for[i](0;$hFields-1){ $hAttr[^hFields.$i.attributes.foreach[sName;xAttr]{ $.$sName[$xAttr.value] }] ^hFields.$i.setAttribute[valid;1] ^if(def $hAttr.value){ ^switch[$hAttr.type]{ ^case[datetime]{ ^if(!^hAttr.value.match[^^${reDate}T$reTime^$]){ ^hFields.$i.setAttribute[typeMismatch;1] ^hFields.$i.setAttribute[valid;0] } } ^case[datetime-local]{ ^if(!^hAttr.value.match[^^${reDate}T${reTime}Z^$]){ ^hFields.$i.setAttribute[typeMismatch;1] ^hFields.$i.setAttribute[valid;0] } } ^case[date]{ ^if(!^hAttr.value.match[^^$reDate^$]){ ^hFields.$i.setAttribute[typeMismatch;1] ^hFields.$i.setAttribute[valid;0] } } ^case[month]{ ^if(!^hAttr.value.match[^^\d{4}-\d{2}^$]){ ^hFields.$i.setAttribute[typeMismatch;1] ^hFields.$i.setAttribute[valid;0] } } ^case[week]{ ^if(!^hAttr.value.match[^^\d{4}-W\d{2}^$]){ ^hFields.$i.setAttribute[typeMismatch;1] ^hFields.$i.setAttribute[valid;0] } } ^case[time]{ ^if(!^hAttr.value.match[^^$reTime^$]){ ^hFields.$i.setAttribute[typeMismatch;1] ^hFields.$i.setAttribute[valid;0] } } ^case[number;range]{ ^if(!^hAttr.value.match[^^$reNumber^$]){ ^hFields.$i.setAttribute[typeMismatch;1] ^hFields.$i.setAttribute[valid;0] } } ^case[email]{ ^if(!^Lib:isEmail[$hAttr.value]){ ^hFields.$i.setAttribute[typeMismatch;1] ^hFields.$i.setAttribute[valid;0] } } ^case[url]{ ^if(!^hAttr.value.match[^^$reUrl^$]){ ^hFields.$i.setAttribute[typeMismatch;1] ^hFields.$i.setAttribute[valid;0] } } } ^if(^hFields.$i.getAttribute[valid] == 1){ ^if( ^hAttr.maxlength.int(0) && ^hAttr.value.length[] > ^hAttr.maxlength.int(0) ){ ^hFields.$i.setAttribute[tooLong;1] ^hFields.$i.setAttribute[valid;0] } } ^if(def $hAttr.pattern){ ^try{ ^if(!^hAttr.value.match[^^(?:$hAttr.pattern)^$]){ ^hFields.$i.setAttribute[patternMismatch;1] ^hFields.$i.setAttribute[valid;0] } }{ $exception.handled(true) } } }{ ^if(def $hAttr.required){ ^hFields.$i.setAttribute[valueMissing;1] ^hFields.$i.setAttribute[valid;0] } } ^if(def $hAttr.customError){ ^hFields.$i.setAttribute[valid;0] } } $result(!^xForm.select[//field[@valid = 0]]) #end @checkValidity[]Комментарии и замечания, как всегда, приветствуются.