У меня есть компонент с формой, а затем код для обработки отправки. Проблема в том, что если я спамлю кнопку, она отправит форму несколько раз. Решением этого было бы добавление отключенного состояния через Javascript, чтобы пользователь не мог этого сделать.
Из соображений безопасности я не хочу, чтобы это происходило вообще, и предотвращало серверную сторону. У меня есть токен и в конфиге включен CSRF
'enableCsrfProtection' => true,
Вот моя форма
{{ form_open({ request: 'onSubmit' }) }}
<div class="form-group">
<label class="control-label" for="subject_name">Subject's name</label>
<input id="subject_name" name="subject_name" type="text" placeholder="" class="form-control input-md" required="">
</div>
<div class="form-group">
<label class="control-label">Postcode</label>
<input id="postcode" name="postcode" class="form-control input-md" type="text" required>
</div>
<div class="form-group">
<button id="submit" type="submit" value="submit" class="btn btn-lg btn-gold pull-right"><i class="fa fa-lock"></i> Request Job</button>
</div>
</form>
и в сгенерированном html
Обработчик/Сессия/Токен
<input name="_handler" type="hidden" value="onSubmit">
<input name="_session_key" type="hidden" value="7Eg9bK4pcT2NOgWwUS0UFUckjkSMRC1UDBkBhPwO">
<input name="_token" type="hidden" value="00nbkK3EAo2I8WGWSh85qkMjHYig6aldrd3oe8HZ">
Затем в моем коде компонентов
public function onSubmit()
{
$name = post('subject_name');
$postcode = post('postcode');
if (Session::token() != Input::get('_token'))
{
/* Invalid token */
return print('Token invalid');
}
$job = new Job;
$job = $job->name = $name;
$job = $job->postcode = $postcode;
$job->save();
}
Тем не менее, я спамлю кнопку отправки, и она будет выполняться несколько раз. Как я могу добавить возможность выполнять только один раз?
Session::set('form_posted', true);
в конце метода, а затем добавьте в начале проверку, которая проверяет, установлено ли оно или нет. Если он установлен, ничего не делайте. - person Magnus Eriksson   schedule 21.08.2019