nebumix/rt-validation-bundle

Symfony2 实时后端验证

dev-master 2014-09-29 12:07 UTC

This package is not auto-updated.

Last update: 2024-09-24 02:09:08 UTC


README

Symfony2 实时后端验证

安装

将包添加到 composer.json 文件

// composer.json

{
    "require": {
        // ...
        "nebumix/rt-validation-bundle": "dev-master"
    }
}

将包添加到您的应用程序内核

// app/AppKernel.php

public function registerBundles()
{
    $bundles = array(
        // ...
        new Bmatzner\JQueryBundle\BmatznerJQueryBundle(),
        new FOS\JsRoutingBundle\FOSJsRoutingBundle(),
        new Nebumix\rtValidationBundle\NebumixrtValidationBundle(),
        // ...
    );
}

使用 Composer 下载包

$ php composer.phar update nebumix/rt-validation-bundle

app/config/routing.yml 中注册路由定义

# app/config/routing.yml
fos_js_routing:
    resource: "@FOSJsRoutingBundle/Resources/config/routing/routing.xml"

Nebumix_rtV_routing:
    resource: "@NebumixrtValidationBundle/Resources/config/routing.yml"

安装资源

假设您的服务器公共目录名为 "web",安装公共供应商资源

$ php app/console assets:install web

可选地,使用 --symlink 属性创建链接而不是资源的副本

$ php app/console assets:install --symlink web

创建新文件 app/config/securityRT.yml

# app/config/securityRT.yml
parameters:
    nebumix_rtvalidation.check.class: Nebumix\rtValidationBundle\Controller\CheckController

app/config/config.yml 中导入新文件

# app/config/config.yml
imports:
    // ...
    - { resource: securityRT.yml }

安装 NeburtValidation,您还自动安装了 bmatzner/jquery-bundlefriendsofsymfony/jsrouting-bundle

我们需要配置 friendsofsymfony/jsrouting-bundle,您可以在官方页面查看官方文档。

我建议在 app/config/config.yml 中添加以下行

# app/config/config.yml
fos_js_routing:
    routes_to_expose: [ nebumixrt_validation_check ]

您需要的路由名是 nebumixrt_validation_check

用法

添加 jQuery

在您的布局中添加此行

<script type="text/javascript" src="{{ asset('bundles/bmatznerjquery/js/jquery.min.js') }}"></script>

添加 FOSJsRoutingBundle

在您的布局中添加这两行

<script src="{{ asset('bundles/fosjsrouting/js/router.js') }}"></script>
<script src="{{ path('fos_js_routing_js', {"callback": "fos.Router.setData"}) }}"></script>

添加 rtValidation

在您的布局中添加此行

<script type="text/javascript" src="{{ asset('bundles/nebumixrtvalidation/js/nebumix_r_t_validation.js') }}"></script>

编写 JavaScript 函数

此示例假设在页面中有一个名为 nameFieldnameField1 ... 的表单字段。在示例中将有更详细的解释。

要实时验证表单字段,您需要调用一个函数来检查您的字段。我使用了 .focusout 函数。

要验证文本字段,您需要在您的布局中添加以下内容

$(function() {  
	$('#nameForm_nameField').focusout(function() {
		check_field('nameValidation', 'nameForm_nameField');
	});
	$('#nameForm_nameField1').focusout(function() {
		check_field('nameValidation', 'nameForm_nameField1');
	});
	
	//...
	
	$('#nameForm_nameFieldN').focusout(function() {
		check_field('nameValidation', 'nameForm_nameFieldN');
	});
	
	
	//if you have a radio or checkbox
	$('#nameForm_nameFieldN').onchange(function() {
		check_field_check('nameValidation', 'nameFieldToCheck');
	});
	
});  

您需要将 nameField 替换为您想要验证的字段名称,将 nameForm 替换为表单名称(通常使用 nameForm_nameField 创建 id 字段)。您需要将 nameValidation 替换为一个名称,它对于每个表单都必须不同。nameValidation 不必是实际的表单名称,它只需要在验证文件中区分表单字段。

securityRT.yml 中编写验证规则

parameters:
    nebumix_rtvalidation.check.class: Nebumix\rtValidationBundle\Controller\CheckController
    nameValidation:
        nameForm_nameField:
            NotBlank:
                message: Field is required.
            Regex: 
                pattern: "/^\d+$/"
                message: insert an integer
        nameForm_nameField1:
            NotBlank:
            Length:
                min: 3
        nameFieldToCheck:
            NotBlank:

您必须使用在 JavaScript 函数中使用的名称,后跟 nameForm_nameField 和验证规则,如示例所示。

打印错误

要打印错误,您可以在布局中添加以下内容

<div id="nameForm_nameField_error"></div>
<div id="nameForm_nameField1_error"></div>
/ ...
<div id="nameForm_nameFieldN_error"></div>

div id 必须是 nameForm_nameField 后跟 _error。您必须为每个字段写一个。

提交表单

现在您可以在实时中验证表单,但如果您希望在验证返回错误时停止表单,请在布局中添加 JavaScript 函数

$( document ).ready(function() {
	$( "#sendForm" ).click(function() {

		//list functions, each per field
		var c_nameField = check_field('nameValidation', 'nameForm_nameField');
		var c_nameField1 = check_field('nameValidation', 'nameForm_nameField1');
		//..
		var c_nameFieldN = check_field('nameValidation', 'nameForm_nameFieldN');
		
		//if you have a radio or checkbox
		var c_nameFieldToCheck = check_field_check('nameValidation', 'nameFieldToCheck');



		if( c_nameField == 1 && c_nameField1 == 1 )
		{
			var form_data = $('#myForm').serialize();

		      $.ajax({  
        		url: Routing.generate('_your_route_to_save_form'),  
		        type: "POST",  
		        data:  form_data,
		        dataType: "html",
		        async : false,
		        success: function(msg) { 
				//if the function have no error return 1
		                if(msg == 1){
					alert('Saved');
		                }else{
					check_field('nameValidation', 'nameForm_nameField');
					check_field('nameValidation', 'nameForm_nameField1');
					//...
					check_field('nameValidation', 'nameForm_nameFieldN');
				}
		        },
		        error: function(){
		          alert("ERROR!");
		        } 
		    }); 

		}
	});
});

这只是一个示例,您可以编写自己的函数。

支持的约束

基本约束

字符串约束

数字约束

比较约束

日期约束

财务及其他数字约束

示例

...