【问题标题】:Zend_Form password confirmation with .ini config - Can it be done?Zend_Form 使用 .ini 配置确认密码 - 可以吗?
【发布时间】:2010-09-10 21:17:33
【问题描述】:

我开始编写一个 ZF (v1.10.3) 应用程序并选择使用 Zend_Config_Ini 来生成我的 Zend_Form 对象。这一切都很好,直到我不得不测试相同的密码输入。这是目前行为不端的部分:

elements.password.type = password

elements.password2.type = password
elements.password2.options.validators.identical.validator = "Identical"
elements.password2.options.validators.identical.options.token = password

它不是比较这两个元素的值,而是将 password2 的值与文字字符串“password”进行比较。所以除了“密码”之外的任何密码都会给我以下验证错误:

The token 'password' does not match the given token '*******'

有没有正确的方法来做到这一点?我通过 Google 找到的将 Zend_Validate_Identical 与 Zend_Config_Ini 一起使用的唯一示例来自一个德国网站,似乎有人推荐了与我上面失败的代码完全相同的“解决方案”。

我知道在 PHP 代码中有很多方法可以做到这一点,但在这一点上我已经非常重视 INI 配置,我宁愿不放弃它或做一个例外,除非我绝对必须这样做。

[编辑] 这是我的完整 newUserForm.ini:

method = "post"
id = "newUserForm"
accept-charset = "utf-8"

elements.username.type = "text"
elements.username.options.label = "Username"
elements.username.options.required = true
elements.username.options.validators.alnum = "Alnum"
elements.username.options.validators.strlen.validator = "StringLength"
elements.username.options.validators.strlen.options.min = "3"
elements.username.options.validators.strlen.options.max = "32"

elements.email.type = "text"
elements.email.options.label = "Email address"
elements.email.options.required = true
elements.email.options.validators.email.validator = "EmailAddress"

elements.password.type = "password"
elements.password.options.label = "Password"
elements.password.options.required = true
elements.password.options.validators.strlen.validator = "StringLength"
elements.password.options.validators.strlen.options.min = "6"

elements.password2.type = "password"
elements.password2.options.label = "Password (confirm)"
elements.password2.options.required = true
elements.password2.options.validators.identical.validator = "Identical"
elements.password2.options.validators.identical.options.token = password

elements.submit.type = "submit"
elements.submit.options.label = "Submit"

这是我的控制器操作:

public function indexAction()
{
    $formConfig = new Zend_Config_Ini(APPLICATION_PATH.'/configs/newUserForm.ini');
    $newUserForm = new Zend_Form($formConfig);
    $request = $this->getRequest();
    if ($request->isPost()) {
        if ($newUserForm->isValid($request->getPost())) {
            // create new user here
            $this->_helper->redirector('index', 'index');
        }
    }
    $this->view->newUserForm = $newUserForm;
}

【问题讨论】:

    标签: php zend-framework configuration zend-form


    【解决方案1】:

    我刚刚使用与您的代码类似的东西进行了尝试,它似乎工作正常。我正在使用 ZF 1.10.6。因此,要么在这两个版本之间修复了一个问题(但我在错误跟踪器中看不到任何类似的东西),要么你的代码中有其他东西导致了问题。能贴出完整的ini文件和表单代码吗?

    这是我的极简测试脚本,供参考。也许你可以看看这是否适合你:

    <?php
    $view = new Zend_View();
    
    $config = new Zend_Config_Ini('formtest.ini');
    $form = new Zend_Form($config->user->signup);
    $form->setView($view);
    
    if (!empty($_POST)) {
        var_dump($form->isValid($_POST));
        var_dump($form->getValues());
    }
    
    echo $form;
    

    formtest.ini:

    user.signup.action = ""
    user.signup.method = "post"
    user.signup.elements.password.type = password
    user.signup.elements.password2.type = password
    user.signup.elements.password2.options.validators.identical.validator = "Identical"
    user.signup.elements.password2.options.validators.identical.options.token = password
    user.signup.elements.submit.type = "submit"
    

    在此测试中,仅当密码 2 为空或两个字段匹配时,表单才会验证。如果它们不匹配,我得到的错误也是“两个给定的令牌不匹配”,这与您的不太匹配。不确定这是否相关。

    【讨论】:

    • 我试过你的INI,还是有同样的问题。我在上面发布了更多代码,但我开始认为框架升级是必要的。
    • 是的,我刚刚尝试使用您的确切 ini 文件,这对我来说也很好。所以尝试升级 ZF 看看是否有帮助。
    • 我碰巧有一些旧版本的 ZF,所以我只是使用 1.10.2 再次尝试了我的测试脚本,然后我遇到了和你一样的问题。所以我相信升级 ZF 会解决您的问题。
    • 我查看了几个版本的 Identical 验证器;它开始在 ZF 1.10.3 和 1.10.6 之间查看表单上下文。
    • 感谢大家为我节省了数小时的头撞墙时间。我升级了 Zend Framework,一切都很好。
    猜你喜欢
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 2018-07-28
    • 2018-10-01
    • 1970-01-01
    • 2020-05-31
    相关资源
    最近更新 更多