Как я могу получить доступ к временному аргументу (повторный ввод пароля) в валидаторе с PHP в TYPO3 без создания дополнительного sql-поля?

TYPO3-Версия: 8.7.7

Я хочу получить доступ к $this->request->getArguments() в валидаторе для TYPO3 на PHP.

Я установил временное поле в жидкости с помощью:

<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"/>

Если я установил property вместо name в <f:form.password name="reenter_password" id="reenter_password"/>, я получаю следующую ошибку:

# 1297759968: Исключение при сопоставлении свойств в пути к свойству "": свойство "reenter_password" не было найдено в целевом объекте типа "RM \ RmRegistration \ Domain \ Model \ User".

Я не хочу устанавливать свойство модели, потому что это свойство должно использоваться только для проверки равенства с полем пароля и не должно получать TCA или SQL-таблицу для хранения.

Вот мое действие, в котором я вызываю валидаторы:

/**
 * 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']

Но возможно ли получить временное значение в UserModel, чтобы проверить его в валидаторе следующим образом:

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

person MonTea    schedule 13.03.2018    source источник


Ответы (1)


Создайте собственную (просмотреть) модель для процесса проверки пароля или дайте $ newRegisteredUser свойство (временное или нет) для повторно введенного пароля. Затем используйте собственный валидатор (см. Здесь).

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) {

}
person JKB    schedule 14.03.2018
comment
Спасибо, я добавил только protected $passwordReenter = '';, включая аннотацию, и геттер и сеттер в модель, и изменил имя на свойство в моем Fluid-шаблоне. Оно работает. - person MonTea; 20.03.2018