PluginProbe
Fluent Forms – Customizable Contact Forms, Survey, Quiz, & Conversational Form Builder / 6.2.3
Fluent Forms – Customizable Contact Forms, Survey, Quiz, & Conversational Form Builder v6.2.3
6.2.14 6.2.13 6.2.12 6.2.10 6.2.11 6.2.9 6.2.8 6.2.7 6.2.6 6.2.5 6.2.4 6.2.3 6.2.2 3.6.22 3.6.31 3.6.40 3.6.41 3.6.42 3.6.50 3.6.51 3.6.60 3.6.61 3.6.62 3.6.64 3.6.65 All 196 releases
fluentform / app / Hooks / Handlers / ActivationHandler.php

ActivationHandler.php in Fluent Forms – Customizable Contact Forms, Survey, Quiz, & Conversational Form Builder 6.2.3, at app/Hooks/Handlers/ActivationHandler.php

218 lines 18.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace FluentForm\App\Hooks\Handlers;
4
5 defined('ABSPATH') or die;
6
7 use FluentForm\App\Modules\Acl\Acl;
8 use FluentForm\Database\DBMigrator;
9 use FluentForm\Database\Migrations\Logs;
10 use FluentForm\Database\Migrations\SubmissionDetails;
11
12 class ActivationHandler
13 {
14 public function handle($network_wide = false)
15 {
16 global $wpdb;
17 if ($network_wide) {
18 // Retrieve all site IDs from this network (WordPress >= 4.6 provides easy to use functions for that).
19 if (function_exists('get_sites') && function_exists('get_current_network_id')) {
20 $site_ids = get_sites(['fields' => 'ids', 'network_id' => get_current_network_id()]);
21 } else {
22 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Multisite activation, direct query needed
23 $site_ids = $wpdb->get_col("SELECT blog_id FROM $wpdb->blogs WHERE site_id = $wpdb->siteid;");
24 }
25 // Install the plugin for all these sites.
26 foreach ($site_ids as $site_id) {
27 switch_to_blog($site_id);
28 $this->migrate();
29 restore_current_blog();
30 }
31 } else {
32 $this->migrate();
33 $this->maybeMigrateDefaultForms();
34 }
35
36 $this->setCronSchedule();
37 }
38
39 public function migrate()
40 {
41 DBMigrator::run();
42 Acl::setPermissions();
43 $this->setDefaultGlobalSettings();
44 $this->setCurrentVersion();
45 $this->maybeMigrateDB();
46 }
47
48 private function setDefaultGlobalSettings()
49 {
50 if (!get_option('_fluentform_global_form_settings')) {
51 update_option('_fluentform_global_form_settings', [
52 'layout' => [
53 'labelPlacement' => 'top',
54 'asteriskPlacement' => 'asterisk-right',
55 'helpMessagePlacement' => 'with_label',
56 'errorMessagePlacement' => 'inline',
57 'cssClassName' => '',
58 ],
59 'misc' => [
60 'isIpLogingDisabled' => false,
61 'isAnalyticsDisabled' => true,
62 'file_upload_locations' => '',
63 'admin_top_nav_status' => 'yes',
64 'default_admin_date_time' => 'time_diff',
65 ],
66
67 ], 'no');
68 }
69 }
70
71 private function setCurrentVersion()
72 {
73 update_option('_fluentform_installed_version', FLUENTFORM_VERSION, 'no');
74 }
75
76 public function maybeMigrateDB()
77 {
78 // First we have to check if global modules is set or not
79 $this->migrateGlobalAddOns();
80
81 if (!get_option('fluentform_entry_details_migrated')) {
82 SubmissionDetails::migrate();
83 }
84
85 if (!get_option('fluentform_db_fluentform_logs_added')) {
86 Logs::migrate();
87 }
88 }
89
90 public function migrateGlobalAddOns()
91 {
92 $globalModules = get_option('fluentform_global_modules_status');
93 // Modules already set
94 if (is_array($globalModules)) {
95 return;
96 }
97
98 $possibleGloablModules = [
99 'mailchimp' => '_fluentform_mailchimp_details',
100 'activecampaign' => '_fluentform_activecampaign_settings',
101 'campaign_monitor' => '_fluentform_campaignmonitor_settings',
102 'constatantcontact' => '_fluentform_constantcontact_settings',
103 'getresponse' => '_fluentform_getresponse_settings',
104 'icontact' => '_fluentform_icontact_settings',
105 ];
106
107 $possibleMetaModules = [
108 'webhook' => 'fluentform_webhook_feed',
109 'zapier' => 'fluentform_zapier_feed',
110 'slack' => 'slack',
111 ];
112
113 $moduleStatuses = [];
114 foreach ($possibleGloablModules as $moduleName => $settingsKey) {
115 if (get_option($settingsKey)) {
116 $moduleStatuses[$moduleName] = 'yes';
117 } else {
118 $moduleStatuses[$moduleName] = 'no';
119 }
120 }
121
122 global $wpdb;
123
124 foreach ($possibleMetaModules as $moduleName => $metaName) {
125 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Activation check, direct query needed
126 $row = $wpdb->get_row($wpdb->prepare("SELECT * FROM `{$wpdb->prefix}fluentform_form_meta` WHERE `meta_key` = %s LIMIT 1", $metaName));
127
128 if ($row) {
129 $moduleStatuses[$moduleName] = 'yes';
130 } else {
131 $moduleStatuses[$moduleName] = 'no';
132 }
133 }
134
135 update_option('fluentform_global_modules_status', $moduleStatuses, 'no');
136 }
137
138 public function maybeMigrateDefaultForms()
139 {
140 global $wpdb;
141 $formsTable = $wpdb->prefix . 'fluentform_forms';
142 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQL.NotPrepared, PluginCheck.Security.DirectDB.UnescapedDBParameter -- Activation check, direct query needed, table name is safe (wpdb->prefix)
143 $firstForm = $wpdb->get_row('SELECT * FROM ' . $formsTable . ' LIMIT 1');
144
145 if (!$firstForm) {
146 $forms = [
147 '[{"id":"9","title":"Contact Form Demo","status":"published","appearance_settings":null,"form_fields":{"fields":[{"index":0,"element":"input_name","attributes":{"name":"names","data-type":"name-element"},"settings":{"container_class":"","admin_field_label":"Name","conditional_logics":[]},"fields":{"first_name":{"element":"input_text","attributes":{"type":"text","name":"first_name","value":"","id":"","class":"","placeholder":"First Name"},"settings":{"container_class":"","label":"First Name","help_message":"","visible":true,"validation_rules":{"required":{"value":false,"message":"This field is required"}},"conditional_logics":[]},"editor_options":{"template":"inputText"}},"middle_name":{"element":"input_text","attributes":{"type":"text","name":"middle_name","value":"","id":"","class":"","placeholder":"","required":false},"settings":{"container_class":"","label":"Middle Name","help_message":"","error_message":"","visible":false,"validation_rules":{"required":{"value":false,"message":"This field is required"}},"conditional_logics":[]},"editor_options":{"template":"inputText"}},"last_name":{"element":"input_text","attributes":{"type":"text","name":"last_name","value":"","id":"","class":"","placeholder":"Last Name","required":false},"settings":{"container_class":"","label":"Last Name","help_message":"","error_message":"","visible":true,"validation_rules":{"required":{"value":false,"message":"This field is required"}},"conditional_logics":[]},"editor_options":{"template":"inputText"}}},"editor_options":{"title":"Name Fields","element":"name-fields","icon_class":"ff-edit-name","template":"nameFields"},"uniqElKey":"el_1570866006692"},{"index":1,"element":"input_email","attributes":{"type":"email","name":"email","value":"","id":"","class":"","placeholder":"Email Address"},"settings":{"container_class":"","label":"Email","label_placement":"","help_message":"","admin_field_label":"","validation_rules":{"required":{"value":true,"message":"This field is required"},"email":{"value":true,"message":"This field must contain a valid email"}},"conditional_logics":[]},"editor_options":{"title":"Email Address","icon_class":"ff-edit-email","template":"inputText"},"uniqElKey":"el_1570866012914"},{"index":2,"element":"input_text","attributes":{"type":"text","name":"subject","value":"","class":"","placeholder":"Subject"},"settings":{"container_class":"","label":"Subject","label_placement":"","admin_field_label":"Subject","help_message":"","validation_rules":{"required":{"value":false,"message":"This field is required"}},"conditional_logics":{"type":"any","status":false,"conditions":[{"field":"","value":"","operator":""}]}},"editor_options":{"title":"Simple Text","icon_class":"ff-edit-text","template":"inputText"},"uniqElKey":"el_1570878958648"},{"index":3,"element":"textarea","attributes":{"name":"message","value":"","id":"","class":"","placeholder":"Your Message","rows":4,"cols":2},"settings":{"container_class":"","label":"Your Message","admin_field_label":"","label_placement":"","help_message":"","validation_rules":{"required":{"value":true,"message":"This field is required"}},"conditional_logics":{"type":"any","status":false,"conditions":[{"field":"","value":"","operator":""}]}},"editor_options":{"title":"Text Area","icon_class":"ff-edit-textarea","template":"inputTextarea"},"uniqElKey":"el_1570879001207"}],"submitButton":{"uniqElKey":"el_1524065200616","element":"button","attributes":{"type":"submit","class":""},"settings":{"align":"left","button_style":"default","container_class":"","help_message":"","background_color":"#1a7efb","button_size":"md","color":"#ffffff","button_ui":{"type":"default","text":"Submit Form","img_url":""}},"editor_options":{"title":"Submit Button"}}},"has_payment":"0","type":"","conditions":null,"created_by":"1","created_at":"2021-06-08 04:56:28","updated_at":"2021-06-08 04:56:28","metas":[{"meta_key": "template_name","value": "basic_contact_form"},{"meta_key":"formSettings","value":"{\"confirmation\":{\"redirectTo\":\"samePage\",\"messageToShow\":\"Thank you for your message. We will get in touch with you shortly\",\"customPage\":null,\"samePageFormBehavior\":\"hide_form\",\"customUrl\":null},\"restrictions\":{\"limitNumberOfEntries\":{\"enabled\":false,\"numberOfEntries\":null,\"period\":\"total\",\"limitReachedMsg\":\"Maximum number of entries exceeded.\"},\"scheduleForm\":{\"enabled\":false,\"start\":null,\"end\":null,\"selectedDays\":[\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\",\"Sunday\"],\"pendingMsg\":\"Form submission is not started yet.\",\"expiredMsg\":\"Form submission is now closed.\"},\"requireLogin\":{\"enabled\":false,\"requireLoginMsg\":\"You must be logged in to submit the form.\"},\"denyEmptySubmission\":{\"enabled\":false,\"message\":\"Sorry, you cannot submit an empty form. Let\'s hear what you wanna say.\"}},\"layout\":{\"labelPlacement\":\"top\",\"helpMessagePlacement\":\"with_label\",\"errorMessagePlacement\":\"inline\",\"cssClassName\":\"\",\"asteriskPlacement\":\"asterisk-right\"},\"delete_entry_on_submission\":\"no\",\"appendSurveyResult\":{\"enabled\":false,\"showLabel\":false,\"showCount\":false}}"},{"meta_key":"advancedValidationSettings","value":"{\"status\":false,\"type\":\"all\",\"conditions\":[{\"field\":\"\",\"operator\":\"=\",\"value\":\"\"}],\"error_message\":\"\",\"validation_type\":\"fail_on_condition_met\"}"},{"meta_key":"double_optin_settings","value":"{\"status\":\"no\",\"confirmation_message\":\"Please check your email inbox to confirm this submission\",\"email_body_type\":\"global\",\"email_subject\":\"Please confirm your form submission\",\"email_body\":\"<h2>Please Confirm Your Submission<\/h2><p>&nbsp;<\/p><p style=\"text-align: center;\"><a style=\"color: #ffffff; background-color: #454545; font-size: 16px; border-radius: 5px; text-decoration: none; font-weight: normal; font-style: normal; padding: 0.8rem 1rem; border-color: #0072ff;\" href=\"#confirmation_url#\">Confirm Submission<\/a><\/p><p>&nbsp;<\/p><p>If you received this email by mistake, simply delete it. Your form submission won\'t proceed if you don\'t click the confirmation link above.<\/p>\",\"email_field\":\"\",\"skip_if_logged_in\":\"yes\",\"skip_if_fc_subscribed\":\"no\"}"}]}]',
148 '[{"id":"8","title":"Subscription Form","status":"published","appearance_settings":null,"form_fields":{"fields":[{"index":1,"element":"container","attributes":[],"settings":{"container_class":"","conditional_logics":{"type":"any","status":false,"conditions":[{"field":"","value":"","operator":""}]}},"columns":[{"fields":[{"index":1,"element":"input_email","attributes":{"type":"email","name":"email","value":"","id":"","class":"","placeholder":"Your Email Address"},"settings":{"container_class":"","label":"","label_placement":"","help_message":"","admin_field_label":"Email","validation_rules":{"required":{"value":true,"message":"This field is required"},"email":{"value":true,"message":"This field must contain a valid email"}},"conditional_logics":[],"is_unique":"no","unique_validation_message":"Email address need to be unique."},"editor_options":{"title":"Email Address","icon_class":"ff-edit-email","template":"inputText"},"uniqElKey":"el_16231279686950.8779857923682932"}]},{"fields":[{"index":15,"element":"custom_submit_button","attributes":{"class":"","type":"submit"},"settings":{"button_style":"","button_size":"md","align":"left","container_class":"","current_state":"normal_styles","background_color":"","color":"","hover_styles":{"backgroundColor":"#ffffff","borderColor":"#1a7efb","color":"#1a7efb","borderRadius":"","minWidth":"100%"},"normal_styles":{"backgroundColor":"#1a7efb","borderColor":"#1a7efb","color":"#ffffff","borderRadius":"","minWidth":"100%"},"button_ui":{"text":"Subscribe","type":"default","img_url":""},"conditional_logics":{"type":"any","status":false,"conditions":[{"field":"","value":"","operator":""}]}},"editor_options":{"title":"Custom Submit Button","icon_class":"dashicons dashicons-arrow-right-alt","template":"customButton"},"uniqElKey":"el_16231279798380.5947400167493171"}]}],"editor_options":{"title":"Two Column Container","icon_class":"ff-edit-column-2"},"uniqElKey":"el_16231279284710.40955091024524304"}],"submitButton":{"uniqElKey":"el_1524065200616","element":"button","attributes":{"type":"submit","class":""},"settings":{"align":"left","button_style":"default","container_class":"","help_message":"","background_color":"#1a7efb","button_size":"md","color":"#ffffff","button_ui":{"type":"default","text":"Subscribe","img_url":""}},"editor_options":{"title":"Submit Button"}}},"has_payment":"0","type":"form","conditions":null,"created_by":"1","created_at":"2021-06-08 04:51:36","updated_at":"2021-06-08 04:54:02","metas":[{"meta_key": "template_name","value": "inline_subscription"},{"meta_key":"formSettings","value":"{\"confirmation\":{\"redirectTo\":\"samePage\",\"messageToShow\":\"Thank you for your message. We will get in touch with you shortly\",\"customPage\":null,\"samePageFormBehavior\":\"hide_form\",\"customUrl\":null},\"restrictions\":{\"limitNumberOfEntries\":{\"enabled\":false,\"numberOfEntries\":null,\"period\":\"total\",\"limitReachedMsg\":\"Maximum number of entries exceeded.\"},\"scheduleForm\":{\"enabled\":false,\"start\":null,\"end\":null,\"pendingMsg\":\"Form submission is not started yet.\",\"expiredMsg\":\"Form submission is now closed.\"},\"requireLogin\":{\"enabled\":false,\"requireLoginMsg\":\"You must be logged in to submit the form.\"},\"denyEmptySubmission\":{\"enabled\":false,\"message\":\"Sorry, you cannot submit an empty form. Let\'s hear what you wanna say.\"}},\"layout\":{\"labelPlacement\":\"top\",\"helpMessagePlacement\":\"with_label\",\"errorMessagePlacement\":\"inline\",\"asteriskPlacement\":\"asterisk-right\"}}"},{"meta_key":"notifications","value":"{\"name\":\"Admin Notification Email\",\"sendTo\":{\"type\":\"email\",\"email\":\"{wp.admin_email}\",\"field\":\"email\",\"routing\":[{\"email\":null,\"field\":null,\"operator\":\"=\",\"value\":null}]},\"fromName\":\"\",\"fromEmail\":\"\",\"replyTo\":\"\",\"bcc\":\"\",\"subject\":\"[{inputs.names}] New Form Submission\",\"message\":\"<p>{all_data}<\\\/p>\\n<p>This form submitted at: {embed_post.permalink}<\\\/p>\",\"conditionals\":{\"status\":false,\"type\":\"all\",\"conditions\":[{\"field\":null,\"operator\":\"=\",\"value\":null}]},\"enabled\":false,\"email_template\":\"\"}"},{"meta_key":"step_data_persistency_status","value":"no"},{"meta_key":"_primary_email_field","value":"email"}]}]',
149 ];
150
151 foreach ($forms as $index => $formJson) {
152 $structure = json_decode($formJson, true)[0];
153
154 $insertData = [
155 'title' => $structure['title'],
156 'type' => $structure['type'],
157 'status' => 'published',
158 'created_by' => get_current_user_id(),
159 'created_at' => current_time('mysql'),
160 'updated_at' => current_time('mysql'),
161 'form_fields' => json_encode($structure['form_fields']),
162 ];
163
164 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery -- Activation, inserting default forms
165 $wpdb->insert($formsTable, $insertData, [
166 '%s',
167 '%s',
168 '%s',
169 '%d',
170 '%s',
171 '%s',
172 '%s',
173 ]);
174
175 $formId = $wpdb->insert_id;
176
177 foreach ($structure['metas'] as $meta) {
178 $meta['value'] = trim(preg_replace('/\s+/', ' ', $meta['value']));
179
180 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery -- Activation, inserting default form meta
181 $wpdb->insert($wpdb->prefix . 'fluentform_form_meta', [
182 'form_id' => $formId,
183 'meta_key' => $meta['meta_key'],
184 'value' => $meta['value'],
185 ], [
186 '%d',
187 '%s',
188 '%s',
189 ]);
190 }
191 }
192 }
193 }
194
195 public function setCronSchedule()
196 {
197 add_filter('cron_schedules', function ($schedules) {
198 $schedules['ff_every_five_minutes'] = [
199 'interval' => 300,
200 'display' => 'Every 5 Minutes (FluentForm)',
201 ];
202
203 return $schedules;
204 }, 10, 1);
205
206
207 $hookName = 'fluentform_do_scheduled_tasks';
208 if (!wp_next_scheduled($hookName)) {
209 wp_schedule_event(time(), 'ff_every_five_minutes', $hookName);
210 }
211
212 $emailReportHookName = 'fluentform_do_email_report_scheduled_tasks';
213 if (!wp_next_scheduled($emailReportHookName)) {
214 wp_schedule_event(time(), 'daily', $emailReportHookName);
215 }
216 }
217 }
218