【问题标题】:Zend Framework 1.10.7 telephone validatorZend Framework 1.10.7 电话验证器
【发布时间】:2010-08-13 07:55:29
【问题描述】:

请参阅正确答案以获得所请求问题的解决方案。

嗨, 最近我一直在寻找 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 框架中可行吗?

【问题讨论】:

    标签: php zend-framework


    【解决方案1】:

    您为什么要发布完整的电话资料?您的问题是如何在 Zend 中启用自定义文件的自动加载?对吧?

    在 Zend 1.10.7 中,您可以在 bootstrap->run 命令上方的 public/index.php 中添加以下内容

    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,
    )));
    

    在 MajorClasses 文件夹中,您现在必须为每个命名空间创建一个目录。因此,如果您有命名空间 Custom,则创建目录,还必须创建 Validator 目录,因为您是这样命名的,所以您的路径就是。

    application/MajorClasses/Custom/Validator/Telephone.php
    

    Telephone.php 应该是你的类文件名,类文件名总是类名中的最后一个命名空间。

    我错过了什么吗?

    【讨论】:

    • 非常感谢您分享此信息。执行上述步骤后,我可以删除包含 Custom_Validator_Telephone 的文件的 require_once 语句以使用此验证器吗?另外,为了创建此验证器的对象,我将使用 $telValidator = new Custom_Validator_Telephone();或 $telValidator = new Telephone(); ?
    • 请查看正确答案。你给出了很多关于未找到或声明的类的错误。
    • Viper_Sb 的答案是正确的,如果您要创建库风格的功能,请使用普通的自动加载器。资源自动加载器仅适用于您的应用程序或模块中的东西,例如模型、表单等。但是有一个错字。注册自动加载程序的行应该是: $autoloader->registerNamespace('Custom_');
    【解决方案2】:

    这个问题属于 Zend Resource 自动加载http://framework.zend.com/manual/en/zend.loader.autoloader-resource.html

    简而言之,为了包含特定文件夹下的所有文件,我们需要遵循以下规则。

    1) 假设 MajorClasses 文件夹下的所有文件都是由 Custom 启动的,即类 Custom_validator_Telephone,所以我们这个文件夹的命名空间是 Custom。为了在这个文件夹下包含文件,我们需要创建一个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');
    

    这里

    • 第一个参数表示我们正在添加的资源的名称,用于内部识别。
    • 第二个参数定义了相对于我们在实例化资源自动加载器对象时声明的基本路径的文件夹路径,因此该资源的路径是/path/to/MajorClasses/validators/。
    • 第三个参数指定类的命名空间,即它将与资源对象的命名空间连接(在我们的例子中是Custom),所以到目前为止完整类的前缀是Custom_Validator 并且该文件夹中的 php 文件将在剥离 .php 文件扩展名后以此类名称后缀

    3) 现在我们可以将 Telephone.php 放在验证器文件夹中,如果我们将上面的代码放在引导程序的任何函数中,例如_initPlaceHolders 然后我们可以在我们的应用程序的任何地方创建 Custom_Validator_Telephone 的实例,而无需使用 require_once 语句。

    $telValidator = new Custom_Validator_Telephone();
    

    【讨论】:

    • 这种方式对我不起作用,您会看到您的版本不是 1.10.7,因为您专门询问了 1.10.7,如果它不起作用,我给了您该版本的正确答案对于那个版本,你没有那个版本。不要仅仅因为它对你有用就认为你的做法是“正确的”。它给你错误和找不到类的原因是因为你使用的是旧版本。
    • 我正在使用 1.10.7,请参阅其文档 framework.zend.com/manual/en/… 获取资源自动加载器以及 framework.zend.com/manual/en/zend.loader.html 。如何使用它非常清楚。您是指资源自动加载还是其他主题,您的方法是否需要在 application.ini 或 bootstrap 中进行一些额外的设置。
    • 您是否阅读过有关自动装带器的信息?还是只是装载机?就在您的链接旁边framework.zend.com/manual/en/zend.loader.autoloader.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    相关资源
    最近更新 更多