Проблема с передачей переменных URL-адреса при отправке формы сообщения с помощью CakePHP FormHelper
-
20-09-2019 - |
Вопрос
Я пишу свое первое приложение CakePHP и просто пишу вторую часть формы сброса пароля, в которой пользователь получил электронное письмо, содержащее ссылку на сайт, и когда он нажимает на нее, ему предлагается ввести и подтвердить новый пароль.
URL страницы такой:
/users/reset_password_confirm/23f9a5d7d1a2c952c01afacbefaba41a26062b17
Вид такой:
<?php echo $form->create('User', array('action' => 'reset_password_confirm')); ?>
<?php
echo $form->input('password', array('label' => 'Password'));
echo $form->input('confirm_password', array('type' => 'password', 'label' => 'Confirm password'));
echo $form->hidden('static_hash');
?>
<?php echo $form->end('Reset password'); ?>
Однако это создает форму вроде:
<form id="UserResetPasswordConfirmForm" method="post" action="/users/reset_password_confirm/8">
Проблема в том, что идентификатор пользователя (в данном случае 8) добавляется к действию формы.На самом деле это не проблема, но когда я хочу передать хеш своему контроллеру:
function reset_password_confirm($static_hash=null) {
// function body
}
$static_hash
теперь заполняется цифрой 8, а не хешем из URL-адреса.
Я знаю, что мог бы разобраться с этим, создав тег формы самостоятельно, а не используя $form->create
но есть ли более крутой способ сделать это?
Решение
$form->create('User', array('action' => '…', 'id' => false));
Просто явно установите параметры, которые вы не хотите передавать. null
или false
.К сожалению, это тот случай, когда Cake пытается быть слишком умным ради своего же блага.;о)
Вероятно, вы также могли бы сделать что-то подобное, чтобы снова отправить POST на тот же URL-адрес:
$form->create('User', $this->here);
Другие советы
Как насчет передачи его в качестве параметра вместо данных формы:
<?php
echo $form->create('User', array('action' => 'reset_password_confirm', $static_hash));
echo $form->input('password', array('label' => 'Password'));
echo $form->input('confirm_password', array('type' => 'password', 'label' => 'Confirm password'));
echo $form->end('Reset password');
?>
и в контроллере:
function reset_password_confirm($static_hash = null) {
// Check if form is submitted
if (!empty($this->data)) {
// if it submitted then do your logic
} else {
$this->set('static_hash', $static_hash); // Else, pass the hash to the view, so it can be passed again when form is submitted
}
}
Надеюсь, это поможет :)