diff --git a/addons/default/visiosoft/advs-module/resources/config/settings/sections.php b/addons/default/visiosoft/advs-module/resources/config/settings/sections.php index a689b5385..8c0a8a34a 100644 --- a/addons/default/visiosoft/advs-module/resources/config/settings/sections.php +++ b/addons/default/visiosoft/advs-module/resources/config/settings/sections.php @@ -31,6 +31,7 @@ return [ 'hide_standard_price_field', 'hide_options_field', 'listing_page_image', + 'show_breadcrumb_when_creating_ad', ], ], 'ads_image' => [ diff --git a/addons/default/visiosoft/advs-module/resources/config/settings/settings.php b/addons/default/visiosoft/advs-module/resources/config/settings/settings.php index 5581683da..b7a24c416 100644 --- a/addons/default/visiosoft/advs-module/resources/config/settings/settings.php +++ b/addons/default/visiosoft/advs-module/resources/config/settings/settings.php @@ -290,4 +290,11 @@ return [ 'default_value' => 5, ], ], + 'show_breadcrumb_when_creating_ad' => [ + 'type' => 'anomaly.field_type.boolean', + 'config' => [ + 'default_value' => true, + 'mode' => 'checkbox' + ], + ], ]; diff --git a/addons/default/visiosoft/advs-module/resources/lang/en/setting.php b/addons/default/visiosoft/advs-module/resources/lang/en/setting.php index 65b8e4f3e..d4db6a482 100644 --- a/addons/default/visiosoft/advs-module/resources/lang/en/setting.php +++ b/addons/default/visiosoft/advs-module/resources/lang/en/setting.php @@ -179,5 +179,8 @@ return [ 'user_filter_limit' => [ 'name' => 'User Filter Limit', 'instructions' => 'In the admin panel' - ] + ], + 'show_breadcrumb_when_creating_ad' => [ + 'name' => 'Show Breadcrumb When Creating an Ad', + ], ]; diff --git a/addons/default/visiosoft/advs-module/resources/views/new-ad/post-cat.twig b/addons/default/visiosoft/advs-module/resources/views/new-ad/post-cat.twig index 6c6aba785..45666e944 100644 --- a/addons/default/visiosoft/advs-module/resources/views/new-ad/post-cat.twig +++ b/addons/default/visiosoft/advs-module/resources/views/new-ad/post-cat.twig @@ -6,7 +6,9 @@ {% block content %}
- {% include "visiosoft.module.advs::new-ad/partials/breadcrumb" %} + {% if setting_value('visiosoft.module.advs::show_breadcrumb_when_creating_ad') %} + {% include "visiosoft.module.advs::new-ad/partials/breadcrumb" %} + {% endif %}
diff --git a/addons/default/visiosoft/advs-module/src/AdvsModuleServiceProvider.php b/addons/default/visiosoft/advs-module/src/AdvsModuleServiceProvider.php index 1070f7bb7..3fd214124 100644 --- a/addons/default/visiosoft/advs-module/src/AdvsModuleServiceProvider.php +++ b/addons/default/visiosoft/advs-module/src/AdvsModuleServiceProvider.php @@ -10,6 +10,7 @@ use Visiosoft\AdvsModule\Adv\AdvRepository; use Anomaly\Streams\Platform\Model\Advs\AdvsAdvsEntryModel; use Visiosoft\AdvsModule\Adv\AdvModel; use Visiosoft\AdvsModule\Adv\Form\AdvFormBuilder; +use Visiosoft\AdvsModule\Adv\Listeners\AddTableCategoryColumn; use Visiosoft\AdvsModule\Http\Middleware\redirectDiffrentLang; use Visiosoft\AdvsModule\Http\Middleware\SetLang; use Visiosoft\AdvsModule\Listener\AddAdvsSettingsScript; @@ -33,42 +34,10 @@ use Visiosoft\LocationModule\Country\CountryRepository; class AdvsModuleServiceProvider extends AddonServiceProvider { - - /** - * Additional addon plugins. - * - * @type array|null - */ protected $plugins = [ AdvsModulePlugin::class, ]; - /** - * The addon Artisan commands. - * - * @type array|null - */ - protected $commands = []; - - /** - * The addon's scheduled commands. - * - * @type array|null - */ - protected $schedules = []; - - /** - * The addon API routes. - * - * @type array|null - */ - protected $api = []; - - /** - * The addon routes. - * - * @type array|null - */ protected $routes = [ // Admin AdvsController 'admin/advs' => [ @@ -244,59 +213,17 @@ class AdvsModuleServiceProvider extends AddonServiceProvider ]; - /** - * The addon middleware. - * - * @type array|null - */ protected $middleware = [ SetLang::class, redirectDiffrentLang::class, ]; - /** - * Addon group middleware. - * - * @var array - */ - protected $groupMiddleware = [ - //'web' => [ - // Visiosoft\AdvsModule\Http\Middleware\ExampleMiddleware::class, - //], - ]; - - /** - * Addon route middleware. - * - * @type array|null - */ - protected $routeMiddleware = []; - - /** - * The addon event listeners. - * - * @type array|null - */ protected $listeners = [ TableIsQuerying::class => [ AddAdvsSettingsScript::class, ], ]; - /** - * The addon alias bindings. - * - * @type array|null - */ - protected $aliases = [ - //'Example' => Visiosoft\AdvsModule\Example::class - ]; - - /** - * The addon class bindings. - * - * @type array|null - */ protected $bindings = [ // AdvsCfValuesEntryModel::class => CfValueModel::class, // AdvsCustomFieldAdvsEntryModel::class => CustomFieldAdvModel::class, @@ -327,50 +254,12 @@ class AdvsModuleServiceProvider extends AddonServiceProvider ProductoptionsValueRepositoryInterface::class => ProductoptionsValueRepository::class, ]; - /** - * Additional service providers. - * - * @type array|null - */ - protected $providers = [ - //\ExamplePackage\Provider\ExampleProvider::class - ]; - - /** - * The addon view overrides. - * - * @type array|null - */ protected $overrides = [ 'streams::form/form' => 'visiosoft.module.advs::form/form', //'streams::errors/404' => 'module::errors/404', //'streams::errors/500' => 'module::errors/500', ]; - /** - * The addon mobile-only view overrides. - * - * @type array|null - */ - protected $mobile = [ - //'streams::errors/404' => 'module::mobile/errors/404', - //'streams::errors/500' => 'module::mobile/errors/500', - ]; - - /** - * Register the addon. - */ - public function register() - { - // Run extra pre-boot registration logic here. - // Use method injection or commands to bring in services. - } - - /** - * Boot the addon. - * @param AddonCollection $addonCollection - * @param FileModel $fileModel - */ public function boot(AddonCollection $addonCollection, FileModel $fileModel) { // Run extra post-boot registration logic here. @@ -405,18 +294,4 @@ class AdvsModuleServiceProvider extends AddonServiceProvider // Disable file versioning $fileModel->disableVersioning(); } - - /** - * Map additional addon routes. - * - * @param Router $router - */ - // public function map(Router $router) - // { - // // Register dynamic routes here for example. - // // Use method injection or commands to bring in services. - // } - public function map(Router $router) - { - } } diff --git a/addons/default/visiosoft/advs-module/src/Http/Controller/Admin/AdvsController.php b/addons/default/visiosoft/advs-module/src/Http/Controller/Admin/AdvsController.php index 6a00e9400..d865a67dc 100644 --- a/addons/default/visiosoft/advs-module/src/Http/Controller/Admin/AdvsController.php +++ b/addons/default/visiosoft/advs-module/src/Http/Controller/Admin/AdvsController.php @@ -1,6 +1,5 @@ [ + 'sort_column' => 'cat1', 'value' => function (EntryInterface $entry, CategoryModel $categoryModel) { $category = $categoryModel->getCat($entry->cat1); if (!is_null($category)) diff --git a/addons/default/visiosoft/advs-module/src/Http/Controller/advsController.php b/addons/default/visiosoft/advs-module/src/Http/Controller/advsController.php index 615f1d37f..5c1db1afd 100644 --- a/addons/default/visiosoft/advs-module/src/Http/Controller/advsController.php +++ b/addons/default/visiosoft/advs-module/src/Http/Controller/advsController.php @@ -20,7 +20,6 @@ use Visiosoft\AdvsModule\Adv\Event\viewAd; use Visiosoft\AdvsModule\Adv\Form\AdvFormBuilder; use Visiosoft\AdvsModule\Option\Contract\OptionRepositoryInterface; use Visiosoft\AdvsModule\OptionConfiguration\Contract\OptionConfigurationRepositoryInterface; -use Visiosoft\AdvsModule\OptionConfiguration\OptionConfigurationModel; use Visiosoft\AdvsModule\Productoption\Contract\ProductoptionRepositoryInterface; use Visiosoft\AdvsModule\ProductoptionsValue\Contract\ProductoptionsValueRepositoryInterface; use Visiosoft\AlgoliaModule\Search\SearchModel; diff --git a/addons/default/visiosoft/base-theme/resources/views/addons/anomaly/users-module/register.twig b/addons/default/visiosoft/base-theme/resources/views/addons/anomaly/users-module/register.twig index a1a2bb511..6d8a34eb4 100644 --- a/addons/default/visiosoft/base-theme/resources/views/addons/anomaly/users-module/register.twig +++ b/addons/default/visiosoft/base-theme/resources/views/addons/anomaly/users-module/register.twig @@ -5,6 +5,8 @@ {% endblock %} {% block content %} + {% set enableCaptcha = setting_value('visiosoft.module.profile::google_captcha_site_key') and setting_value('visiosoft.module.profile::google_captcha_secret_key') %} +
@@ -20,6 +22,10 @@ 'url':form.options.url })|raw }} + {% if enableCaptcha %} + + {% endif %} + {% include 'visiosoft.theme.base::addons/anomaly/users-module/partials/register-form' %}
@@ -49,7 +55,7 @@ {{ form_close() }}
- {{ addBlock('register/corporate-register')|raw }} + {{ addBlock('register/corporate-register', {'enableCaptcha': enableCaptcha})|raw }}
@@ -76,6 +82,14 @@
+ {% if enableCaptcha %} + {% set reCAPTCHASiteKey = setting_value('visiosoft.module.profile::google_captcha_site_key') %} + + {{ asset_add('scripts.js', asset_download('https://www.google.com/recaptcha/api.js?render=' ~ reCAPTCHASiteKey, 60*60*24)) }} + {{ asset_add("scripts.js", "visiosoft.module.profile::assets/js/captcha.js") }} + {% endif %} {{ asset_add("scripts.js", "visiosoft.theme.base::js/register.js") }} {% endblock %} diff --git a/addons/default/visiosoft/profile-module/composer.json b/addons/default/visiosoft/profile-module/composer.json index 04878d89c..c36b753bb 100644 --- a/addons/default/visiosoft/profile-module/composer.json +++ b/addons/default/visiosoft/profile-module/composer.json @@ -10,6 +10,7 @@ ] }, "require": { - "maatwebsite/excel": "*" + "maatwebsite/excel": "*", + "google/recaptcha": "1.2.*" } } diff --git a/addons/default/visiosoft/profile-module/resources/assets/js/captcha.js b/addons/default/visiosoft/profile-module/resources/assets/js/captcha.js new file mode 100644 index 000000000..b30cc9437 --- /dev/null +++ b/addons/default/visiosoft/profile-module/resources/assets/js/captcha.js @@ -0,0 +1,6 @@ +grecaptcha.ready(function() { + grecaptcha.execute(reCAPTCHASiteKey) + .then(function(token) { + $('.recaptcha-token').val(token) + }); +}); diff --git a/addons/default/visiosoft/profile-module/resources/config/settings/sections.php b/addons/default/visiosoft/profile-module/resources/config/settings/sections.php index 85d63e090..824048352 100644 --- a/addons/default/visiosoft/profile-module/resources/config/settings/sections.php +++ b/addons/default/visiosoft/profile-module/resources/config/settings/sections.php @@ -4,13 +4,18 @@ return [ 'monitoring' => [ 'stacked' => false, 'tabs' => [ - 'general_setting' => [ 'title' => 'visiosoft.module.profile::section.general_setting', 'fields' => [ 'show_my_ads', 'upload_avatar', 'show_tax_office' ], ], + 'recaptcha' => [ + 'title' => 'visiosoft.module.profile::section.recaptcha', + 'fields' => [ + 'google_captcha_site_key', 'google_captcha_secret_key', 'score_threshold' + ], + ], ], ], ]; diff --git a/addons/default/visiosoft/profile-module/resources/config/settings/settings.php b/addons/default/visiosoft/profile-module/resources/config/settings/settings.php index 6308c2cbd..f9bea65e9 100644 --- a/addons/default/visiosoft/profile-module/resources/config/settings/settings.php +++ b/addons/default/visiosoft/profile-module/resources/config/settings/settings.php @@ -13,11 +13,25 @@ return [ 'default_value' => 1 ], ], - 'show_tax_office' => [ 'type' => 'anomaly.field_type.boolean', 'config' => [ 'default_value' => true, ], ], + 'google_captcha_site_key' => [ + 'type' => 'anomaly.field_type.text', + ], + 'google_captcha_secret_key' => [ + 'type' => 'anomaly.field_type.text', + ], + "score_threshold" => [ + "type" => "anomaly.field_type.decimal", + "config" => [ + "default_value" => 0.5, + "decimals" => 1, + "min" => 0.0, + "max" => 1.0, + ] + ], ]; \ No newline at end of file diff --git a/addons/default/visiosoft/profile-module/resources/lang/en/message.php b/addons/default/visiosoft/profile-module/resources/lang/en/message.php index 49cef7e64..fbd74ccb0 100644 --- a/addons/default/visiosoft/profile-module/resources/lang/en/message.php +++ b/addons/default/visiosoft/profile-module/resources/lang/en/message.php @@ -38,4 +38,8 @@ return [ // Mail 'update_email_mail_subject' => 'Email Updated!', 'update_email_mail_message' => 'Your Email Has Been Updated!', + + // Register + 'recaptcha_field_is_required' => 'reCaptcha field is required.', + 'failed_to_validate_captcha' => 'Failed to validate captcha.', ]; diff --git a/addons/default/visiosoft/profile-module/resources/lang/en/section.php b/addons/default/visiosoft/profile-module/resources/lang/en/section.php index 3564a569b..33c358b85 100644 --- a/addons/default/visiosoft/profile-module/resources/lang/en/section.php +++ b/addons/default/visiosoft/profile-module/resources/lang/en/section.php @@ -8,4 +8,5 @@ return [ 'title' => 'Adress', ], 'general_setting' => 'General Settings', + 'recaptcha' => 'reCAPTCHA', ]; diff --git a/addons/default/visiosoft/profile-module/resources/lang/en/setting.php b/addons/default/visiosoft/profile-module/resources/lang/en/setting.php index d97d7cb1d..9c1e08a97 100644 --- a/addons/default/visiosoft/profile-module/resources/lang/en/setting.php +++ b/addons/default/visiosoft/profile-module/resources/lang/en/setting.php @@ -7,8 +7,17 @@ return [ 'upload_avatar' => [ 'name' => 'Avatar Upload', ], - 'show_tax_office' => [ 'name' => 'Show Tax Office Field', ], + 'google_captcha_site_key' => [ + 'name' => 'Google Captcha Site Key', + ], + 'google_captcha_secret_key' => [ + 'name' => 'Google Captcha Secret Key', + ], + 'score_threshold' => [ + 'name' => 'Score Threshold', + 'instructions' => 'A value between 0 and 1. The higher the threshold the more strict ReCaptcha is in trying to determine if a user is a bot or not.', + ], ]; diff --git a/addons/default/visiosoft/profile-module/src/Profile/Register2/Register2FormBuilder.php b/addons/default/visiosoft/profile-module/src/Profile/Register2/Register2FormBuilder.php index f4c0d6c22..29a291005 100644 --- a/addons/default/visiosoft/profile-module/src/Profile/Register2/Register2FormBuilder.php +++ b/addons/default/visiosoft/profile-module/src/Profile/Register2/Register2FormBuilder.php @@ -3,7 +3,6 @@ use Anomaly\Streams\Platform\Ui\Form\FormBuilder; use Visiosoft\ProfileModule\Profile\Register2\Command\SetOptions; use Anomaly\UsersModule\User\UserModel; -use Visiosoft\ProfileModule\Profile\Validation\ValidateRegister; /** * Class RegisterFormBuilder @@ -31,80 +30,6 @@ class Register2FormBuilder extends FormBuilder */ protected $model = UserModel::class; - /** - * The form fields. - * - * @var array - */ - protected $fields = [ - 'username' => [ - 'required' => true, - ], - 'first_name' => [ - 'instructions' => false, - 'required' => true, - ], - 'last_name' => [ - 'instructions' => false, - 'required' => true, - ], - 'phone' => [ - 'type' => 'anomaly.field_type.text', - 'required' => true, - 'rules' => [ - 'valid_register', - ], - 'validators' => [ - 'valid_register' => [ - 'message' => false, - 'handler' => ValidateRegister::class, - ], - ], - ], - 'email' => [ - 'instructions' => false, - ], - 'password' => [ - 'instructions' => false, - ], - "accept_terms" => [ - "type" => "anomaly.field_type.boolean", - "required" => true, - "config" => [ - "default_value" => false, - "mode" => "checkbox", - "label" => 'visiosoft.module.profile::field.accept_terms_label', - ] - ], - "accept_protection_law" => [ - "type" => "anomaly.field_type.boolean", - "required" => true, - "config" => [ - "default_value" => false, - "mode" => "checkbox", - "label" => 'visiosoft.module.profile::field.accept_protection_law_label', - ] - ], - "accept_privacy_terms" => [ - "type" => "anomaly.field_type.boolean", - "required" => true, - "config" => [ - "default_value" => false, - "mode" => "checkbox", - "label" => 'visiosoft.module.profile::field.accept_privacy_terms_label', - ] - ], - "receive_sms_emails" => [ - "type" => "anomaly.field_type.boolean", - "required" => true, - "config" => [ - "default_value" => false, - "mode" => "checkbox", - "label" => 'visiosoft.module.profile::field.receive_sms_emails_label', - ] - ], - ]; - /** * The form actions. * diff --git a/addons/default/visiosoft/profile-module/src/Profile/Register2/Register2FormFields.php b/addons/default/visiosoft/profile-module/src/Profile/Register2/Register2FormFields.php new file mode 100644 index 000000000..7e8d3ed54 --- /dev/null +++ b/addons/default/visiosoft/profile-module/src/Profile/Register2/Register2FormFields.php @@ -0,0 +1,109 @@ + [ + 'required' => true, + 'type' => 'anomaly.field_type.text', + 'config' => [ + "max" => 0, + ], + 'rules' => [ + 'valid_recaptcha' + ], + 'validators' => [ + 'valid_recaptcha' => [ + 'message' => false, + 'handler' => ReCaptchaRule::class + ] + ] + ], + ]; + } + + $builder->setFields( + array_merge( + $register, + [ + 'username' => [ + 'required' => true, + ], + 'first_name' => [ + 'instructions' => false, + 'required' => true, + ], + 'last_name' => [ + 'instructions' => false, + 'required' => true, + ], + 'phone' => [ + 'type' => 'anomaly.field_type.text', + 'required' => true, + 'rules' => [ + 'valid_register', + ], + 'validators' => [ + 'valid_register' => [ + 'message' => false, + 'handler' => ValidateRegister::class, + ], + ], + ], + 'email' => [ + 'instructions' => false, + ], + 'password' => [ + 'instructions' => false, + ], + "accept_terms" => [ + "type" => "anomaly.field_type.boolean", + "required" => true, + "config" => [ + "default_value" => false, + "mode" => "checkbox", + "label" => 'visiosoft.module.profile::field.accept_terms_label', + ] + ], + "accept_protection_law" => [ + "type" => "anomaly.field_type.boolean", + "required" => true, + "config" => [ + "default_value" => false, + "mode" => "checkbox", + "label" => 'visiosoft.module.profile::field.accept_protection_law_label', + ] + ], + "accept_privacy_terms" => [ + "type" => "anomaly.field_type.boolean", + "required" => true, + "config" => [ + "default_value" => false, + "mode" => "checkbox", + "label" => 'visiosoft.module.profile::field.accept_privacy_terms_label', + ] + ], + "receive_sms_emails" => [ + "type" => "anomaly.field_type.boolean", + "required" => true, + "config" => [ + "default_value" => false, + "mode" => "checkbox", + "label" => 'visiosoft.module.profile::field.receive_sms_emails_label', + ] + ], + ] + ) + ); + } +} diff --git a/addons/default/visiosoft/profile-module/src/Profile/Register2/Register2FormHandler.php b/addons/default/visiosoft/profile-module/src/Profile/Register2/Register2FormHandler.php index 3dd4ba818..cf49a76ab 100644 --- a/addons/default/visiosoft/profile-module/src/Profile/Register2/Register2FormHandler.php +++ b/addons/default/visiosoft/profile-module/src/Profile/Register2/Register2FormHandler.php @@ -62,7 +62,8 @@ class Register2FormHandler $fields['accept_terms'], $fields['accept_protection_law'], $fields['accept_privacy_terms'], - $fields['receive_sms_emails'] + $fields['receive_sms_emails'], + $fields['recaptcha_token'] ); $register = $users->create($fields); diff --git a/addons/default/visiosoft/profile-module/src/Rules/ReCaptchaRule.php b/addons/default/visiosoft/profile-module/src/Rules/ReCaptchaRule.php new file mode 100644 index 000000000..e12f90c46 --- /dev/null +++ b/addons/default/visiosoft/profile-module/src/Rules/ReCaptchaRule.php @@ -0,0 +1,37 @@ +message = $message; + } + + public function handle($attribute, $value) + { + if (empty($value)) { + $this->message->error(trans('visiosoft.module.profile::message.recaptcha_field_is_required')); + + return false; + } + + $recaptcha = new ReCaptcha(setting_value('visiosoft.module.profile::google_captcha_secret_key')); + + $resp = $recaptcha->setExpectedHostname(request()->server('SERVER_NAME')) + ->setScoreThreshold(setting_value('visiosoft.module.profile::score_threshold')) + ->verify($value, request()->server('REMOTE_ADDR')); + + if (!$resp->isSuccess()) { + $this->message->error('visiosoft.module.profile::message.failed_to_validate_captcha'); + + return false; + } + + return true; + } +} \ No newline at end of file