【问题标题】:How can i access a temporarily argument (password-reenter) in a Validator with PHP in TYPO3 without make an extra sql-field?如何在 TYPO3 中使用 PHP 访问验证器中的临时参数(密码重新输入)而不创建额外的 sql 字段?
【发布时间】:2018-03-13 21:26:54
【问题描述】:

TYPO3-版本:8.7.7

我想在 PHP 中的 TYPO3 验证器中访问 $this->request->getArguments()

我在流体中设置了一个临时字段:

<label for="reenter_password" class="reenter_password{rm:hasError(property:'reenter_password',then:' text-danger')}">
    Reenter Password*
</label><br>
<f:form.password name="reenter_password" id="reenter_password"/>

如果我在&lt;f:form.password name="reenter_password" id="reenter_password"/&gt; 中设置property 而不是name,我会收到以下错误:

#1297759968:属性路径“”的属性映射时出现异常:在“RM\RmRegistration\Domain\Model\User”类型的目标对象中找不到属性“reenter_password”。

我不想设置 Model-Property,因为该属性应该只用于检查密码字段是否相等,而不应该获取 TCA 或 SQL-Table 用于存储。

这是我的操作,我在其中调用验证器:

/**
 * Complete New User Registeration
 *
 * @param User $newRegisteredUser
 * @validate $newRegisteredUser \RM\RmRegistration\Validation\Validator\NewRegisteredUser
 * @validate $newRegisteredUser \RM\RmRegistration\Validation\Validator\CompleteProfileUser
 */
public function completeNewRegisteredUserAction(User $newRegisteredUser)
{
    // Store Changes, Update and Persist
    $newRegisteredUser->setPassword($this->saltThisPassword($newRegisteredUser->getPassword()));
    $this->userRepository->update($newRegisteredUser);
    $this->objectManager->get('TYPO3\\CMS\\Extbase\\Persistence\\Generic\\PersistenceManager')->persistAll();
}

在验证器中,我可以通过以下方式进入密码字段:

\TYPO3\CMS\Core\Utility\GeneralUtility::_POST()['tx_rmregistration_registration']['reenter_password']

但是是否可以将 Value 临时提供给 UserModel 以在 Validator 中进行检查,如下所示:

// Compare Entered Passwords
if ($user->getPassword() == $user->getReenteredPassword()) {
    return TRUE;
} else {
    return FALSE;
}

【问题讨论】:

    标签: typo3 fluid extbase typo3-8.7.x


    【解决方案1】:

    为密码验证过程创建一个自己的(查看)模型,或为 $newRegisteredUser 提供一个(瞬态或非瞬态)属性以用于重新输入的密码。然后使用自己的验证器 (see here)。

    class UserValidator extends \TYPO3\CMS\Extbase\Validation\Validator\AbstractValidator {
    
        /**
         * Object Manager
         *
         * @var \TYPO3\CMS\Extbase\Object\ObjectManager
         * @inject
         */
        protected $objectManager;
    
        /**
         * Is valid
         *
         * @param mixed $user
         * @return boolean
         */
        public function isValid($user) {
            if ($user->getPassword() !== $user->getPasswordConfirmation()) {
                $error = $this->objectManager->get(
                        'TYPO3\CMS\Extbase\Validation\Error',
                        'Password and password confirmation do not match.', time());
                $this->result->forProperty('passwordConfirmation')->addError($error);
                return FALSE;
            }
            return TRUE;
        }
    
    }
    

    并像这样在控制器中使用:

    /**
     * action create
     *
     * @param \Vendor\Ext\Domain\Model\User $user
     * @validate $user \Vendor\Ext\Domain\Validator\UserValidator
     *
     * @return void
     */
    public function createAction(\Vendor\Ext\Domain\Model\User $user) {
    
    }
    

    【讨论】:

    • 谢谢,我只添加了 protected $passwordReenter = ''; 包括注释,以及模型的 getter 和 setter,并在我的 Fluid-Template 中将名称更改为属性。它有效。
    猜你喜欢
    • 1970-01-01
    • 2022-11-26
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多