谨慎:您正在浏览遗产ob娱乐下载symfony 1.倍本网站的一部分。< / div >

自定义小部件和验证器

语言
{input.longitude} {input.latitude}
'这个美元->使用addOption“template.javascript”' '公共函数getJavascripts返回数组' / sfFormExtraPlugin / js / sf_widget_gmap_address.js '公共函数渲染美元的名字美元的价值美元的属性数组美元的错误数组//定义主要模板变量template_vars美元数组“{div.id}”= >这个美元->generateId美元的名字“{div.class}”= >这个美元->getOption“div.class”“{map.id}”= >这个美元->generateId美元的名字”(图)“{map.style}”= >这个美元->getOption“map.style”“{map.height}”= >这个美元->getOption“map.height”“{map.width}”= >这个美元->getOption“map.width”“{input.lookup.id}”= >这个美元->generateId美元的名字“[查询]”“{input.lookup.name}”= >这个美元->getOption“lookup.name”“{input.address.id}”= >这个美元->generateId美元的名字“(地址)”“{input.latitude.id}”= >这个美元->generateId美元的名字“(纬度)”“{input.longitude.id}”= >这个美元->generateId美元的名字“(经度)”//避免任何通知错误无效的$value格式美元的价值= !is_array美元的价值?数组美元的价值美元的价值“地址”收取美元的价值“地址”?美元的价值“地址”美元的价值“经”收取美元的价值“经”?美元的价值“经”美元的价值“纬度”收取美元的价值“纬度”?美元的价值“纬度”//定义地址小部件美元的地址sfWidgetFormInputText数组这个美元->getOption“address.options”template_vars美元“{input.search}”美元的地址->渲染美元的名字“(地址)”美元的价值“地址”//定义经纬度字段隐藏的美元sfWidgetFormInputHidden;template_vars美元“{input.longitude}”隐藏的美元->渲染美元的名字“(经度)”美元的价值“经”template_vars美元“{input.latitude}”隐藏的美元->渲染美元的名字“(纬度)”美元的价值“纬度”//合并模板和变量返回strtr这个美元->getOption“template.html”这个美元->getOption“template.javascript”template_vars美元

小部件使用generateId ()方法来生成id每个元素。的美元的名字变量由sfFormFieldSchema,所以美元的名字变量由名称表单、任何嵌套的小部件模式名称和表单中定义的小部件名称组成配置()

请注意

例如,如果表单名称为用户,嵌套模式名为位置小部件名称为地址,决赛的名字用户(位置)(地址)iduser_location_address.换句话说,美元$ this - > generateId(名字。“(纬度)”)将生成一个有效且唯一的id纬度字段。

不同的元素id属性非常重要,因为它们被传递给JavaScript块(通过template.js变量),这样JavaScript就可以正确地处理不同的元素。

呈现()方法还实例化两个内部小部件sfWidgetFormInputText控件,该控件用于呈现地址字段sfWidgetFormInputHidden小部件,用于呈现隐藏字段。

这个小部件可以用下面的一小段代码快速测试:

美元的小部件sfWidgetFormGMapAddress回声美元的小部件->渲染“用户(位置)(地址)”数组“地址”= >巴黎蒙马特街151号,邮编75002“经”= >“2.294359”“纬度”= >“48.858205”

输出结果为:

< divid“user_location_address”“sf-gmap-widget”><输入风格“宽度:400 px”类型“文本”的名字“用户(位置)(地址)(地址)”价值巴黎蒙马特街151号,邮编75002id“user_location_address_address”/><输入类型“提交”价值“查找”id“user_location_address_lookup”/>< br/><输入类型“隐藏”的名字“用户(位置)(地址)(经度)”价值“2.294359”id“user_location_address_longitude”/><输入类型“隐藏”的名字“用户(位置)(地址)(纬度)”价值“48.858205”id“user_location_address_latitude”/>< divid“user_location_address_map”风格宽度:500 px;高度:300 px;”>< / div >< / div ><脚本类型“text / javascript”>jQuery(窗口)。bind("load", function() {new sfGmapWidgetWidget({longitude: "user_location_address_longitude", latitude: "user_location_address_latitude", address: "user_location_address_address", lookup: "user_location_address_lookup", map: "user_location_address_map"});})> < /脚本

小部件的JavaScript部分采用了不同的方法id属性,并将jQuery监听器绑定到它们,以便在执行操作时触发特定的JavaScript。JavaScript使用谷歌地理编码服务提供的经度和纬度更新隐藏字段。

JavaScript对象有几个有趣的方法:

  • init ():初始化所有变量并将事件绑定到不同输入的方法

  • lookupCallback ():一个静态由geocoder方法用于查找用户提供的地址的方法

  • reverseLookupCallback ():是另一个静态用于将给定的经度和纬度转换为有效地址的方法。

最终的JavaScript代码可以在附录A中查看。

有关谷歌地图功能的更多详细信息,请参阅谷歌地图文档欧宝官网下载appAPI

sfValidatorGMapAddress验证器

sfValidatorGMapAddress类继承了sfValidatorBase它已经执行了一个验证:具体地说,如果字段被设置为所需的值,那么该值不能.因此,sfValidatorGMapAddress只需要验证不同的值:纬度经度而且地址.的美元的价值变量应该是一个数组,但由于用户输入不可信,因此验证器检查是否存在所有键,以便向内部验证器传递有效值。

sfValidatorGMapAddress扩展sfValidatorBase受保护的函数doClean美元的价值如果is_array美元的价值sfValidatorError这个美元“无效”试一试美元的纬度sfValidatorNumber数组“最小值”= >-90年“马克斯”= >90“要求”= >真正的美元的价值“纬度”美元的纬度->清洁收取美元的价值“纬度”?美元的价值“纬度”美元的经度sfValidatorNumber数组“最小值”= >-180年“马克斯”= >180“要求”= >真正的美元的价值“经”美元的经度->清洁收取美元的价值“经”?美元的价值“经”美元的地址sfValidatorString数组“min_length”= >10“max_length”= >255“要求”= >真正的美元的价值“地址”美元的地址->清洁收取美元的价值“地址”?美元的价值“地址”sfValidatorError$ esfValidatorError这个美元“无效”返回美元的价值

请注意

验证器总是引发sfValidatorError当值无效时异常。这就是验证用a包围的原因try / catch块。在这个验证器中,验证器重新抛出一个new无效的异常,它等同于一个无效的的验证错误。sfValidatorGMapAddress验证器。

测试

为什么测试很重要?验证器是用户输入和应用程序之间的粘合剂。如果验证器有缺陷,应用程序就容易受到攻击。幸运的是,symfony随ob娱乐下载之而来石灰这是一个非常容易使用的测试库。

如何测试验证器?如前所述,验证器会在验证错误时引发异常。测试可以向验证器发送有效值和无效值,并检查异常是否在正确的情况下抛出。

$ tlime_test7lime_output_color美元的测试数组数组“空值”数组“字符串值”“字符串值”数组数组“空数组”数组数组“地址”= >“我的好地址”不完整的地址的数组数组“地址”= >“我的好地址”“纬度”= >“字符串”“经”= >23“无效值”数组数组“地址”= >“我的好地址”“纬度”= >200“经”= >23“无效值”数组真正的数组“地址”= >“我的好地址”“纬度”= >“2.294359”“经”= >“48.858205”“有效值”v美元sfValidatorGMapAddress;$ t->诊断接头“测试sfValidatorGMapAddress”foreach美元的测试作为美元的测试列表美元的有效性美元的价值美元的消息美元的测试;试一试v美元->清洁美元的价值美元的形sfValidatorError$ e美元的形真正的$ t->好吧美元的有效性! =美元的形“::清洁()”美元的消息

sfForm: bind ()方法时,表单执行清洁()每个验证器的方法。对象的实例化,从而重现此行为sfValidatorGMapAddress验证器直接和测试不同的值。

最终的想法

创建小部件时最常见的错误是过分关注信息将如何存储在数据库中。表单框架只是一个数据容器和验证框架。因此,小部件必须只管理其相关信息。如果数据是有效的,那么不同的清洗值就可以被模型或控制器使用。

本作品在创作共用署名相似共享3.0未移植许可许可下获得许可。