谨慎:你正在浏览的遗产欧宝娱乐app下载地址symfony 1.倍这个网站的一部分。< / div >

自定义小部件和验证

语言
{input.longitude} {input.latitude}
');这个美元- >使用addOption(“template.javascript”,' < script type = " text / javascript " > jQuery(窗口)。绑定(“负载”,函数(){新sfGmapWidgetWidget({经度:“{input.longitude。id}”,纬度:“{input.latitude。id}”,地址:“{input.address。id}”,查找:“{input.lookup。id}”,地图:“{地图。id} "});})> < /脚本的);}公共函数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(美元的名字“(经度)”),);/ /避免任何通知错误无效的美元值格式美元的价值= !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.jsJavaScript变量),所以可以妥善处理不同的元素。

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

小部件可以快速测试用小段代码:

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

输出结果是:

< divid=“user_location_address”=“sf-gmap-widget”><输入风格=“宽度:400 px”类型=“文本”的名字=“用户(位置)(地址)(地址)”价值=“151蒙马特街,75002年巴黎”id=“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(窗口)。绑定(“负载”,函数(){新sfGmapWidgetWidget({经度:“user_location_address_longitude纬度:“user_location_address_latitude”,地址:“user_location_address_address”,查找:“user_location_address_lookup”,地图:“user_location_address_map”});})> < /脚本

小部件的JavaScript部分不同id属性和结合jQuery听众他们某些JavaScript操作执行时被触发。JavaScript更新与经度和纬度的隐藏字段由谷歌提供的地理编码服务。

JavaScript对象有一些有趣的方法:

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

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

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

最后一个JavaScript代码可以在附录A。

更多细节请参考谷歌地图文档在谷歌地图的功能欧宝体育电话API

sfValidatorGMapAddress验证器

sfValidatorGMapAddress类继承了sfValidatorBase已经执行一个验证:具体地说,如果所需的字段设置为价值不能。因此,sfValidatorGMapAddress只需要验证不同的值:纬度,经度地址。的美元的价值变量应该是一个数组,但随着用户输入不应该信任,验证器检查所有键的存在,这样内部验证器传递有效值。

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

请注意

验证器总是提出了一个sfValidatorError异常值是无效的。这就是为什么验证是包围try / catch块。在这个验证器,验证器会重新抛出一个新的无效的例外,相当于一个无效的验证错误的sfValidatorGMapAddress验证器。

测试

测试为什么重要?验证器是用户输入和应用程序之间的胶水。如果验证器是有缺陷的,应用程序是脆弱的。幸运的是,symfony提欧宝娱乐app下载地址供了石灰这是一个非常容易使用的测试库。

我们如何测试验证器?正如之前提到的,一个验证器验证错误引发一个异常。测试可以发送有效和无效值的验证器和查看异常在正确的情况下。

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

sfForm: bind ()方法被调用,执行清洁()每一个验证器的方法。这个测试被实例化再现了这种行为sfValidatorGMapAddress直接验证器和测试不同的值。

最终的想法

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

这项工作在Creative Commons许可Attribution-Share都3.0 Unported许可执照。