请参阅正确答案以获得所请求问题的解决方案。
您好, 最近我一直在zend框架中搜索电话验证,我认为它是Validator框架中缺少的组件。因此,我创建了自定义电话验证器,我想与您分享。
将下面的代码放在require_once php语句可访问的文件中。在这里,我们假设此代码粘贴在文件telephoneValidator.php。
中class Custom_Validator_Telephone extends Zend_Validate_Abstract
{
const INVALID = 'This field is required';
protected $_messageTemplates = array(
self::INVALID => "Incorrect telephone number"
);
public function __construct()
{
}
public function isValid($value)
{
if(preg_match("/^(\+)?(\([0-9]+\)\-?\s?)*([0-9]+\-[0-9]+)*([0-9]+)*$/", trim($value)))
{
return true;
}
else
{
$this->_error(self::INVALID);
return false;
}
}
}
如何使用它:使用addElement方法将$ tel Zend_Element放在Zend_Form对象中
require_once("telephoneValidator.php")
$tel = new Zend_Form_Element_Text($fieldName);
$telValidator = new Custom_Validator_Telephone();
$tel->addValidator($telValidator, true)
->setAllowEmpty(false)
->addValidator('NotEmpty', true, array('messages' => array(
'isEmpty' => $label.' is required')))
->setLabel("Telephone Number");
$form->addElement($tel);
可以使用Zend_Validate_Abstract类的 setMessage 方法修改此验证程序的错误消息
$telValidator->setMessage("%value% is not correct telephone number");
$tel->addValidator($telValidator, true)
此验证器可以使用以下格式的电话号码正常工作
+(92) 345-5141637
+(92)-345-5141637
(92) 345-5141637
(92)-345-5141637
+(92)-345-5141637
92-345-5141637
+92-345-5141637
+923455141637
923455141637
(92)-(345)-5141637
我还没有对电话号码进行长度检查,但是需要从输入的电话号码创建过滤数字的过滤器,然后使用 StringLength 验证器。 虽然我是Zend框架的新手,但我想知道如何使用Zend框架的自动加载器自动将我的类包含在自定义文件夹里面应用程序文件夹中。例如,我在应用程序文件夹中的 MajorClasses文件夹中有自定义类,请告诉我自动包含MajorClasses文件夹中的所有类的方法只是指定其名称,因为该文件夹中可能有许多文件但我想让它们自动包含在内。 这在Zend框架中是否可行?
答案 0 :(得分:1)
你为什么发布完整的电话?您的问题是如何在Zend中启用自动加载自定义文件?正确?
在Zend 1.10.7中,你可以将以下内容添加到public / index.php上面你的bootstrap->运行命令
require_once "Zend/Loader/Autoloader.php";
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->registerNamespace('Custom');
您可以根据需要注册任意数量的自定义命名空间。在这种情况下,Custom是一个新的命名空间,因此您的类应该按如下命名。
class Custom_Validator_Telephone extends Zend_Validate_Abstract
现在关于你的目录结构,首先问你的MajorClasses文件夹是在application / ???如果可以的话,在同一个文件中,如上所述,应该运行一个set_include_path()函数。在其中设置库路径,现在我们可以添加新目录的路径。
// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
realpath(APPLICATION_PATH . '/../library'),
get_include_path(),
APPLICATION_PATH.'/MajorClasses'.PATH_SEPARATOR,
)));
WITHIN MajorClasses文件夹,您现在必须创建FOR EACH命名空间的目录。因此,如果你有自定义命名空间,你创建了目录,你也必须创建Validator目录,因为你是这样命名的,所以你的路径就是。
application/MajorClasses/Custom/Validator/Telephone.php
Telephone.php应该是您的类文件的名称,类文件名始终是类名中的最后一个名称空间。
我错过了什么吗?
答案 1 :(得分:1)
这个问题来自Zend Resource auotloading http://framework.zend.com/manual/en/zend.loader.autoloader-resource.html
简而言之,为了包含特定文件夹下的所有文件,我们需要遵循以下规则。
1)假设MajorClasses文件夹下的所有文件都是由Custom启动的,即类 Custom_validator_Telephone ,因此我们这个文件夹的命名空间是自定义。为了在此文件夹下包含文件,我们需要创建zend资源自动加载器的实例
$resourceLoader = new Zend_Loader_Autoloader_Resource(array(
'basePath' => "/path/to/MajorClasses",
'namespace' => 'Custom'
));
2)现在我们已准备好资源自动加载器,我们需要为此对象添加资源,例如,如果我在MajorClasses文件夹中有名称验证器的文件夹,并且此文件夹内的所有文件都以 Custom_Validator 然后此文件夹的命名空间为 Validator ,因为我们已将Custom定义为父资源对象的前缀。
$resourceLoader->addResourceType('validator', 'validators/', 'Validator');
这里
3)现在我们可以将Telephone.php放在验证器文件夹中,如果我们将上面的代码放在bootstrap的任何函数中,例如: _initPlaceHolders然后我们可以在应用程序的任何地方创建 Custom_Validator_Telephone 的实例,而无需使用require_once语句。
$telValidator = new Custom_Validator_Telephone();