Browse Source

изменена структура расположения демо-файлов, добавлен пример создания демо-формы с jQuery Validation Plugin и reCAPTCHA v3

master
Repellent 5 years ago
parent
commit
49a4f10e44
  1. 8
      README.md
  2. 15
      contactsnew/class.contactsnew.php
  3. 0
      contactsnew/demo/demo.php
  4. 303
      contactsnew/demo/demo_jqval.php
  5. 8
      contactsnew/demo/index.php
  6. 3
      contactsnew/lang/bg.txt
  7. 3
      contactsnew/lang/en.txt
  8. 3
      contactsnew/lang/ru.txt
  9. 3
      contactsnew/lang/ua.txt
  10. 2
      contactsnew/module.php
  11. 1
      contactsnew/templates/form_edit.tpl

8
README.md

@ -1,6 +1,6 @@
## contactsnew
# Модуль Контакты New v1.2.5
# Модуль Контакты New v1.2.6
![Module Contacts new](https://gitget.ru/img/module_con_new.png "Module Contacts new")
@ -14,6 +14,12 @@
## Changelog:
10.04.2019 - Версия 1.2.6 - изменена структура расположения демо-файлов, добавлен пример создания демо-формы с jQuery Validation Plugin и reCAPTCHA v3,
API ключи для reCAPTCHA v3 необходимо установить непосредственно в AVE.cms (версия 3.23 начиная с обновления в репозитории от 24.03.2019) в разделе
Системные настройки->Дополнительные настройки. В шаблоне демо-формы в js скрипте параметр data.score < 0.5 - означает минимальную оценку для успешной верификации reCAPTCHA.
Следите, что бы библиотека jQuery была подключена на странице только один раз и вверху , в секции &lt;head&gt; , т.е. первой по отношению к jquery.validate.min.js
07.04.2019 - Версия 1.2.5 - интегрирован jQuery Validation Plugin, в шаблон "Атрибуты тега поля" добавлен просмотр и копирование значения атрибута name,
создающимся модулем и запрещенному к изменениям.

15
contactsnew/class.contactsnew.php

@ -887,19 +887,30 @@ class ContactsNew
if (!empty($_REQUEST['demo']))
{
$demo = array();
include(BASE_DIR . '/modules/contactsnew/demo.php');
$req_demo = '';
// если выбрана демоформа jQuery Validation Plugin и reCAPTCHA v3
if ($_REQUEST['demo'] == 'jqval_cap') {
include(BASE_DIR . '/modules/contactsnew/demo/demo_jqval.php');
} else {
include(BASE_DIR . '/modules/contactsnew/demo/demo.php');
}
$_REQUEST = array_merge($_REQUEST,$demo);
// обновляем форму с данными примера
$this->form_save($fid);
// подставляем в шаблон новые id полей
$demo['form_tpl'] = preg_replace_callback('/\[tag:fld:(\d+)]/', create_function('$matches','return "[tag:fld:" . $_REQUEST["demo_change"][(int)$matches[1]] . "]";'),$demo['form_tpl']);
// если выбрана демоформа jQuery Validation Plugin и reCAPTCHA v3
if ($_REQUEST['demo'] == 'jqval_cap') {
// подставляем в шаблон новые значения атрибутов name
$demo['form_tpl'] = preg_replace_callback('/form-jqval_cap\[(\d+)]/', create_function('$matches','return "form-jqval_cap[" . $_REQUEST["demo_change"][(int)$matches[1]] . "]";'),$demo['form_tpl']);
}
$AVE_DB->Query("
UPDATE " . PREFIX . "_module_contactsnew_forms
SET
form_tpl = '" . addslashes($demo['form_tpl']) . "'
WHERE id = '" . $fid . "'
");
return $fid;
return $fid;
}
}

0
contactsnew/demo.php → contactsnew/demo/demo.php

303
contactsnew/demo/demo_jqval.php

@ -0,0 +1,303 @@
<?php
$form_tpl = array(
'jqval_cap' =>
'<div id=\\"[tag:formalias]\\" class=\\"col-sm-8 col-sm-offset-2\\">
<div class=\\"page-header\\">
<div class=\\"alert alert-info text-center\\" role=\\"alert\\">
<h4>Демо интеграции в Модуль Контакты New v1.2.5<br><br> <a href=\\"https://jqueryvalidation.org/\\">jQuery Validation Plugin</a> &nbsp;&nbsp;и&nbsp;&nbsp; <a href=\\"https://developers.google.com/recaptcha/docs/v3\\">reCAPTCHA v3</a></h4>
</div>
<div class=\\"alert alert-warning alert-dismissable\\">
Если форма не работает, убедитесь, что библиотека jQuery (jquery.min.js - по умолчанию подключается модулем) подключена на странице только один раз! и расположена в секции &lt;head&gt; , а также подключен скрипт jquery.form.min.js (по умолчанию подключается модулем в разделе Скрипты и стили, необходимые для оформления и функционирования формы)
<button type=\\"button\\" class=\\"close\\" data-dismiss=\\"alert\\" aria-hidden=\\"true\\">&times;</button>
</div>
</div>
<div class=\\"panel panel-default\\">
<div class=\\"panel-heading\\">
<h3 class=\\"panel-title\\">[tag:formtitle]</h3>
</div>
<div class=\\"panel-body\\">
<form id=\\"form-[tag:formalias]\\" method=\\"post\\" enctype=\\"multipart/form-data\\" class=\\"form-horizontal\\" role=\\"form\\" action=\\"\\">
[tag:fld:email]
[tag:fld:subject]
[tag:fld:6]
[tag:fld:7]
[tag:fld:8]
[tag:fld:9]
<div class=\\"form-group\\">
<div class=\\"col-sm-offset-4 col-sm-4\\">
<button type=\\"submit\\" class=\\"btn btn-primary\\">Отправить</button>
</div>
</div>
</form>
</div>
</div>
</div>
<script type=\\"text/javascript\\">
$( document ).ready( function () {
$( \\"#form-[tag:formalias]\\" ).validate( {
rules: {
\\"form-jqval_cap[1]\\": {
required: true,
email: true
},
\\"form-jqval_cap[2]\\": {
required: true,
minlength: 4
},
\\"form-jqval_cap[6]\\": {
required: true,
minlength: 2
},
\\"form-jqval_cap[7]\\": {
required: true,
maxlength: 4
},
\\"form-jqval_cap[8]\\": \\"required\\"
},
messages: {
\\"form-jqval_cap[1]\\": {
required: \\"Поле \\\'Email\\\' обязательно к заполнению\\",
email: \\"Пожалуйста, введите действительный адрес электронной почты\\"
},
\\"form-jqval_cap[2]\\": {
required: \\"Поле \\\'Тема\\\' обязательно к заполнению\\",
minlength: \\"Название темы должно содержать не менее 4 символов\\"
},
\\"form-jqval_cap[6]\\": {
required: \\"Поле \\\'Никнейм\\\' обязательно к заполнению\\",
minlength: \\"Никнейм не может быть менее 2 символов\\"
},
\\"form-jqval_cap[7]\\": {
required: \\"Поле \\\'Текст сообщения\\\' обязательно к заполнению\\",
maxlength: \\"Текст сообщения не может превышать 4 символов\\"
},
\\"form-jqval_cap[8]\\": \\"Чекбокс должен быть активным\\"
},
errorElement: \\"em\\",
errorPlacement: function ( error, element ) {
// Add the help-block class to the error element
error.addClass( \\"help-block\\" );
if ( element.prop( \\"type\\" ) === \\"checkbox\\" ) {
error.insertAfter( element.parent( \\"label\\" ) );
} else {
error.insertAfter( element );
}
},
highlight: function ( element, errorClass, validClass ) {
$( element ).parents( \\".col-sm-5\\" ).addClass( \\"has-error\\" ).removeClass( \\"has-success\\" );
},
unhighlight: function (element, errorClass, validClass) {
$( element ).parents( \\".col-sm-5\\" ).addClass( \\"has-success\\" ).removeClass( \\"has-error\\" );
},
submitHandler: function(form) {
if ($(\\".app_err_msg\\").length) {$(\\\'.app_err_msg\\\').remove();}
grecaptcha.ready(function() {
grecaptcha.execute(\\\'Публичный ключ reCAPTCHA v3\\\', {action: \\\'submit_form\\\'})
.then(function(token) {
$.ajax({
type: \\\'post\\\',
url: \\\'[tag:path]inc/recaptcha3srvcode.php\\\',
data: {token: token},
dataType: \\\'json\\\'
}).done(function(data) {
if (data.score < 0.5)
{$(\\\'#form-[tag:formalias]\\\').append(\\\'<div class=\\"app_err_msg alert alert-danger text-center\\" role=\\"alert\\"><h4>Вы не прошли валидацию защитой от спама reCAPTCHA</h4></div>\\\');
$(\\\'button[type=submit]\\\',form).prop(\\\'disabled\\\',true);
}
else {
$(\\\'#hidden_fld_[tag:formalias]\\\').val(\\\'\\\');
$(\\\'#hidden_fld_[tag:formalias]\\\').val(data.score);
form.submit();
}
});
});
});
}
});
});
</script>'
);
$demo = array(
'alias' => 'jqval_cap',
'title' => 'Демо форма с jQuery Validation Plugin и reCAPTCHA v3',
'mail_set' => array(
'from_name' => '',
'from_email' => '',
'subject_tpl' => '[tag:fld:subject]',
'receivers' => array(
array(
'email' => '',
'name' => ''
)
),
'format' => 'text',
),
'rubheader' => '<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://www.recaptcha.net/recaptcha/api.js?render=Публичный ключ reCAPTCHA v3"></script>
<script type="text/javascript" src="[tag:path]modules/contactsnew/js/jquery.form.min.js"></script>
<script type="text/javascript" src="[tag:path]modules/contactsnew/js/jquery.validate.min.js"></script>
',
'form_tpl' => $form_tpl[$_REQUEST['demo']],
'mail_tpl' => '[tag:easymail]',
'finish_tpl' => '<div class="alert alert-success">
Форма успешно отправлена! <a style="cursor: pointer; text-decoration: none;" onclick="window.location.href=this">Обновить страницу</a>
</div>
',
'code_onsubmit' => '',
'code_onvalidate' => '',
'code_onsend' => '',
'fields' => array(
1 => array(
'new' => true,
'form_id' => $fid,
'title' => 'email',
'active' => 1,
'type' => 'input',
'main' => 1,
'setting' => '',
'required' => 0,
'defaultval' => '',
'attributes' => 'id="fld[[tag:id]]" class="form-control" placeholder="[tag:title]"',
'tpl' => '<div class="form-group">
<label class="col-sm-4 control-label" for="fld[[tag:id]]">[tag:title]</label>
<div class="col-sm-5">
[tag:fld]
</div>
</div>'
),
2 => array(
'new' => true,
'form_id' => $fid,
'title' => 'subject',
'active' => 1,
'type' => 'input',
'main' => 1,
'setting' => '',
'required' => 0,
'defaultval' => '',
'attributes' => 'id="fld[[tag:id]]" class="form-control" placeholder="[tag:title]"',
'tpl' => '<div class="form-group">
<label class="col-sm-4 control-label" for="fld[[tag:id]]">[tag:title]</label>
<div class="col-sm-5">
[tag:fld]
</div>
</div>'
),
3 => array(
'new' => true,
'form_id' => $fid,
'title' => 'receivers',
'active' => 0,
'type' => 'select',
'main' => 1,
'setting' => '',
'required' => 0,
'defaultval' => 0,
'attributes' => '',
'tpl' => ''
),
4 => array(
'new' => true,
'form_id' => $fid,
'title' => 'copy',
'active' => 0,
'type' => 'checkbox',
'main' => 1,
'setting' => '',
'required' => 0,
'defaultval' => 1,
'attributes' => '',
'tpl' => ''
),
5 => array(
'new' => true,
'form_id' => $fid,
'title' => 'captcha',
'active' => 0,
'type' => 'input',
'main' => 1,
'setting' => '',
'required' => 1,
'defaultval' => '',
'attributes' => '',
'tpl' => ''
),
6 => array(
'new' => true,
'form_id' => $fid,
'title' => 'Никнейм',
'active' => 1,
'type' => 'input',
'main' => 0,
'setting' => '',
'required' => 0,
'defaultval' => '',
'attributes' => 'id="fld[[tag:id]]" class="form-control" placeholder="[tag:title]"',
'tpl' => '<div class="form-group">
<label class="col-sm-4 control-label" for="fld[[tag:id]]">[tag:title]</label>
<div class="col-sm-5">
[tag:fld]
</div>
</div>'
),
7 => array(
'new' => true,
'form_id' => $fid,
'title' => 'Текст сообщения',
'active' => 1,
'type' => 'textarea',
'main' => 0,
'setting' => '',
'required' => 0,
'defaultval' => '',
'attributes' => 'id="fld[[tag:id]]" class="form-control" placeholder="[tag:title]"',
'tpl' => '<div class="form-group">
<label class="col-sm-4 control-label" for="fld[[tag:id]]">[tag:title]</label>
<div class="col-sm-5">
[tag:fld]
</div>
</div>'
),
8 => array(
'new' => true,
'form_id' => $fid,
'title' => 'Работа чекбокса',
'active' => 1,
'type' => 'checkbox',
'main' => 0,
'setting' => '',
'required' => 0,
'defaultval' => '',
'attributes' => 'id="fld[[tag:id]]" value="agree"',
'tpl' => '<div class="form-group">
<div class="col-sm-5 col-sm-offset-4">
<div class="checkbox">
<label>
[tag:fld]Пример валидации чекбокса
</label>
</div>
</div>
</div>'
),
9 => array(
'new' => true,
'form_id' => $fid,
'title' => 'Оценка отправителя формы сервисом reCAPTCHA',
'active' => 1,
'type' => 'input',
'main' => 0,
'setting' => '',
'required' => 0,
'defaultval' => '',
'attributes' => 'id="hidden_fld_[tag:formalias]" type="hidden"',
'tpl' => '[tag:fld]'
)
)
);

8
contactsnew/demo/index.php

@ -0,0 +1,8 @@
<?php
/**
* Файл-заглушка, предназначенный для запрета показа списка файлов в текущей директории,
* если через адресную строку браузера было прямое общращение к данной директории.
*/
header('Location:/');
exit;
?>

3
contactsnew/lang/bg.txt

@ -182,4 +182,5 @@ title_pub_key_recap = "Открытый ключ reCAPTCHA v3 указанный
found_key_recap_v3 = "В системных настройках обнаружены и будут использоваться модулем API ключи reCAPTCHA v3"
notfound_key_recap_v3_1 ="API ключи reCAPTCHA v3 не обнаружены."
notfound_key_recap_v3_2 =" Вы можете установить их в разделе "
notfound_key_recap_v3_3 ="Системные настройки"
notfound_key_recap_v3_3 ="Системные настройки"
demo_jqval_cap = "с jQuery Validation Plugin и reCAPTCHA v3"

3
contactsnew/lang/en.txt

@ -182,4 +182,5 @@ title_pub_key_recap = "Открытый ключ reCAPTCHA v3 указанный
found_key_recap_v3 = "В системных настройках обнаружены и будут использоваться модулем API ключи reCAPTCHA v3"
notfound_key_recap_v3_1 ="API ключи reCAPTCHA v3 не обнаружены."
notfound_key_recap_v3_2 =" Вы можете установить их в разделе "
notfound_key_recap_v3_3 ="Системные настройки"
notfound_key_recap_v3_3 ="Системные настройки"
demo_jqval_cap = "с jQuery Validation Plugin и reCAPTCHA v3"

3
contactsnew/lang/ru.txt

@ -182,4 +182,5 @@ title_pub_key_recap = "Открытый ключ reCAPTCHA v3 указанный
found_key_recap_v3 = "В системных настройках обнаружены и будут использоваться модулем API ключи reCAPTCHA v3"
notfound_key_recap_v3_1 ="API ключи reCAPTCHA v3 не обнаружены."
notfound_key_recap_v3_2 =" Вы можете установить их в разделе "
notfound_key_recap_v3_3 ="Системные настройки"
notfound_key_recap_v3_3 ="Системные настройки"
demo_jqval_cap = "с jQuery Validation Plugin и reCAPTCHA v3"

3
contactsnew/lang/ua.txt

@ -182,4 +182,5 @@ title_pub_key_recap = "Открытый ключ reCAPTCHA v3 указанный
found_key_recap_v3 = "В системных настройках обнаружены и будут использоваться модулем API ключи reCAPTCHA v3"
notfound_key_recap_v3_1 ="API ключи reCAPTCHA v3 не обнаружены."
notfound_key_recap_v3_2 =" Вы можете установить их в разделе "
notfound_key_recap_v3_3 ="Системные настройки"
notfound_key_recap_v3_3 ="Системные настройки"
demo_jqval_cap = "с jQuery Validation Plugin и reCAPTCHA v3"

2
contactsnew/module.php

@ -16,7 +16,7 @@ if (defined('ACP'))
{
$modul['ModuleName'] = 'Контакты New';
$modul['ModuleSysName'] = 'contactsnew';
$modul['ModuleVersion'] = '1.2.5';
$modul['ModuleVersion'] = '1.2.6';
$modul['ModuleDescription'] = 'Данный модуль предназначен для создания веб-форм (например, обратной связи или простейшего оформления заказа), которые могут состоять из любого набора полей. Для вывода в публичной части сайта используйте тег <strong>[mod_contactsnew:XXX]</strong>, где XXX - это id или алиас формы.';
$modul['ModuleAutor'] = 'vudaltsov UPD Repellent';
$modul['ModuleCopyright'] = '&copy; 2007-2019 AVE.CMS Team';

1
contactsnew/templates/form_edit.tpl

@ -168,6 +168,7 @@ $smarty['_refresh'] = '{#refresh#}';
<td>
<select style="width:300px" name="demo">
<option value="">{#no#}</option>
<option value="jqval_cap">{#demo_jqval_cap#}</option>
<option value="noajax">{#demo_noajax#}</option>
<option value="ajax">{#demo_ajax#}</option>
<option value="ajax_o">{#demo_ajax_o#}</option>

Loading…
Cancel
Save