DIN BLOGURILE MOLDOVEI
Валидация для erlyweb
Накалякал тут функцию валидации для Erlyweb. Сначала описание работы, а потом, может быть, о самой функции :) Работает примерно так:Создаем форму с четырьмя полями:- login- password- pasword_repeat- emailСтандартная форма регистрации то бишь. Естественно, нам нужно провести валидацию полей следующим образом:- login должен быть 4-16 символов- password должен быть 4-16 символов- password должен быть равен password_repeat- email должен быть правильным адресомСтандартные функции валидации для этого не подходят. Но подойдет моя :)Предположим, у нас есть функция process_signup, которая принимает на вход стандартную структуру yaws_arg. Тогда валидация будет выглядеть следующим образом:process_signup(A) ->
F = fun(A, Field) ->
{ok, Val} = yaws_api:postvar(A, Field),
L = string:len(Val),
if
L < 4 orelse L > 16 ->
{Field, length};
true ->
{}
end
end,
EmailCheck = fun(Args, Field2) ->
{ok, Email} = yaws_api:postvar(Args, Field2),
Match = regexp:match(Email, "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]+"),
Match /= nomatch
end,
%% магия тут:
buktu_form:validate(A, [
{login, F},
{email, EmailCheck},
{password, [{'=', password_repeat}, F]}
]).
Таким образом, если вообще ни одно поле введено не будет, то мы получим:[{login,invalid_field},
{email,invalid_field},
{password,[{invalid_fields,[password,password_repeat]},
invalid_field]}]
Если введем поля, не соответствующие критериям, то:[{login,length},
{email,invalid_value},
{password,[{not_equal,password_repeat},
length]}]
Callback-функция, которую можно передавать для валидации, может возвращать:кортеж типа {FieldName, Error}true, если поле прошло валидацию или false в противном случае (тогда функция валидации вернет кортеж {FieldName, invalid_value})любое значение Value, которое будет трансформировано в {FieldName, Value} если любое из полей в правиле не существует или не содержит значение, то для каждого такого правила функция валидации вернет:invalid_field если поле сравнивается со значением{invalid_fields, [field1, field2]} если поле сравнивается с другим полемЕсли необходимо передать несколько правил, достаточно передать их в списке. Если достаточно проверить наличие поля, можно передать кортеж, содержащий только название поля:Проверить, существует ли такое поле{field_name} Сравнить поле field_name с полем field2_name (также можно использовать '=', '/=', '<', '=<', '>', '>=' ){field_name, {'=', field2_name}}Сравнить значение поля с любым другим значением: {field_name, {'=', Value}}Использовать callback-функцию (function/2, первый параметр - yaws_arg, второй - название поля). Функция может быть лямбдой или любой функцией из любого модуля в виде module:function/2 или {module, function}{field_name, F}Использовать callback-функцию с дополнительным значением (function/3, первый параметр - yaws_arg, второй - название поля, третий - значение). Функция может быть лямбдой или любой функцией из любого модуля в виде module:function/3 или {module, function}{field_name, {F, Value}}Функция валидации возвращает proplist в виде:[{FieldName(), Errors()}]гдеFieldName() = atom()
Errors() = Error() | [Error()]
Error() = любое_пользовательское_значение | absent | invalid_value |
invalid_field | {invalid_fields, [FieldName(), FieldName()]} |
ComparisonError()
ComparisonError() = {not_equal, value_or_field} | {equal, value_or_field} |
{not_greater, value_or_field} | {not_less, value_or_field} |
{not_greater_or_equal, value_or_field} | {not_less_or_equal, value_or_field} |