Валидация для формы без перезагрузки страницы, как подключить проверку капчи?

Здравствуйте, долго реализовывал с помощью знающих людей в коде js, сделал валидацию, поставил в админку, там нет капчи, так же решил поставить на комментарии данный метод валидации.

Есть проблема, как добавить в валидацию что бы капча проверялась ???
Сайт на фраемворке кохана 3.1, валидацию с перезагрузкой страницы отключил. решил сделать через js.

Данный метод работает так, при нажатии на отправить, идет проверка формы, далее js скрипт перекидывает в валидации по id где она выводится, у меня стоит через скрол. это видно в скрипте.

<!-- валидация для формы -->
<script type='text/javascript'>	
function checkForm(obj, elems) {	
var element, pattern;	
for (var i = 0; i < obj.elements.length; i++) {// пробегаемся по всем элементам формы	
element = obj.elements[i];	
// Проверяем только нужные поля	
if (elems != undefined)	
if (elems.join().indexOf(element.type) < 0) continue;	
// И только если есть чего говорить юзеру в случае ошибки	
if (!element.getAttribute("check_message")) continue;	
if (pattern = element.getAttribute("check_pattern")) {  // если задан рег	
pattern = new RegExp(pattern, "g");	
if (!pattern.test(element.value)) {	

document.getElementById('validationka').style.display = "block"
document.getElementById('validationka').innerHTML =element.getAttribute("check_message");	
<!-- при нажатии на кнопку добавить, срабатывает валидация и перекидывает к валидации -->
window.scrollTo(0, 50);

element.focus();
return false;	
}	
} else if(/^\s*$/.test(element.value)) {// иначе просто проверка что поле не пустое	

document.getElementById('validationka').style.display = "block"
document.getElementById('validationka').innerHTML = element.getAttribute("check_message");	
<!-- при нажатии на кнопку добавить, срабатывает валидация и перекидывает к валидации -->
window.scrollTo(0, 50);

element.focus();	
return false;	
}	
}	
return true;	
}	
</script>


<form method="post" onSubmit="return checkForm(this)" id="addcom" action="/main/send">

<input type=text id="name" name="name" check_message="Введите имя, поле обязательно для заполнения" value="<?=$data['name']?>">

<input type=text id="email" name="email" check_message="Введите Email, поле обязательно для заполнения" value="<?=$data['email']?>">

<textarea name="comment" check_message="Введите текс комментария, поле обязательно для заполнения" rows="3"><?=$data['comment']?></textarea>

<div class="fullnewscapcha"><?=$captcha;?></div>
<input type="text" placeholder="Сюда" name="captcha" id="captcha">

<button type="submit" name="submit" id="submit" class="btn btn-primary">Добавить комментарий</button>
</form>


Вывод валидации:
<div id="validationka"></div>

Вот акшион отправки
// комментарий к новостям
public function action_send()
{
$uri = $this->request->referrer() != NULL ? $this->request->referrer() : '';
$data = $_POST;
if (Captcha::valid($data['captcha']))
{
ORM::factory('Review')->values($data)->create();
Session::instance()->set('message', array(
'class' => 'success',
'text'  => 'Ваш комментарий будет добавлен после проверки'
));
Session::instance()->delete('data');
}
else
{
Session::instance()->set('message', array(
'class' => 'danger',
'text'  => 'Не правильно ввели код с картинки'
));
Session::instance()->set('data', $data);
}
$this->request->redirect($uri);
}


в коде не понимаю, проверки там нет не какой, только на капчу, и выводит текста если сообщение отправлено и если ошибка то пишет что нужно ввести капчу, может можно как то подключить к данной форме js, или убрать форму и сделать прям файле где input и т.д, где сама форма. хотел на все поля проверку сделать.
  • Вопрос задан
  • 2617 просмотров
Пригласить эксперта
Ответы на вопрос 2
IonDen
@IonDen
JavaScript developer. IonDen.com
Капчу можно проверить только отдельным ajax запросом на сервер. Изучите свою капчу, посмотрите её API.
Ответ написан
dohlik
@dohlik
1. Возвращаете обратно экшен, в котором проходила валидация и сохранение комментария (с перезагрузкой страницы). В нем будет проверка как данных собственно комментария, так и капчи.
2. Добавляете проверку на is_ajax(), в зависимости от результата отдаете редирект или HTML-код вьюшки (для не-аякс запросов), либо JSON или еще что-то (можно смотреть на заголовки, можно не париться и отдавать всегда json). В json'е будет результат операции ('result' => true, к примеру) и список ошибок валидации ('errors' => {'field' : 'error', ...}. Если сохранение успешно, то отдавать id комментария или еще что-то, смотря что планируете делать в случае успеха.
3. При сабмите формы отправляете ajax-запрос с данными (+капча). Если есть ошибки (смотрим на result, на errors и тд), то выводим их на форму.

Соответственно, у пользователей с отключенным js добавление комментариев работает с перезагрузкой страницы, а для остальных есть ajax. При этом экшен один на всех.

В любом случае, никогда не полагайтесь только на ClientSide-валидацию. На ServerSide (то есть в пхп) в любом случае все эти проверки делать надо будет.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы