AJAX
2 years ago
Admin_Page
2 years ago
Custom_WordPress_Columns
2 years ago
Date_Range
2 years ago
Filter_Lists
2 years ago
Form_Submissions
2 years ago
Interval
2 years ago
Menu_Bar_Stats
2 years ago
Migrations
2 years ago
Models
2 years ago
Public_API
2 years ago
Rows
2 years ago
Statistics
2 years ago
Tables
2 years ago
Utils
2 years ago
Campaign_Builder.php
2 years ago
Capability_Manager.php
2 years ago
Chart.php
2 years ago
Chart_Geo.php
2 years ago
Cron_Manager.php
2 years ago
Current_Traffic_Finder.php
2 years ago
Dashboard_Options.php
2 years ago
Dashboard_Widget.php
2 years ago
Database.php
2 years ago
Database_Manager.php
2 years ago
Email_Chart.php
2 years ago
Email_Reports.php
2 years ago
Empty_Report_Option.php
2 years ago
Env.php
2 years ago
Filters.php
2 years ago
Form.php
2 years ago
Geo_Database_Background_Job.php
2 years ago
Geo_Database_Manager.php
2 years ago
Geoposition.php
2 years ago
Icon_Directory.php
2 years ago
Icon_Directory_Factory.php
2 years ago
Illuminate_Builder.php
2 years ago
Independent_Analytics.php
2 years ago
Interrupt.php
2 years ago
Known_Referrers.php
2 years ago
Plugin_Conflict_Detector.php
2 years ago
Plugin_Group.php
2 years ago
Plugin_Group_Option.php
2 years ago
Query.php
2 years ago
Quick_Stat.php
2 years ago
Quick_Stats.php
2 years ago
REST_API.php
2 years ago
Real_Time.php
2 years ago
Report.php
2 years ago
Report_Finder.php
2 years ago
Report_Options_Parser.php
2 years ago
Resource_Identifier.php
2 years ago
Settings.php
2 years ago
Sort_Configuration.php
2 years ago
Track_Resource_Changes.php
2 years ago
View.php
2 years ago
View_Counter.php
2 years ago
Visitors_Over_Time_Finder.php
2 years ago
WP_Option_Cache_Bust.php
2 years ago
WooCommerce_Order.php
2 years ago
WooCommerce_Referrer_Meta_Box.php
2 years ago
Form.php
122 lines
| 1 | <?php |
| 2 | |
| 3 | namespace IAWP; |
| 4 | |
| 5 | /** |
| 6 | * Form tracking requires dynamic columns. If you have 2 forms, there will be 6 new columns. 2 for |
| 7 | * a summary and 2 per form. This class makes it easy to get all the forms a given site has, while |
| 8 | * caching the result, so it doesn't need to re-fetch from the database. |
| 9 | * @internal |
| 10 | */ |
| 11 | class Form |
| 12 | { |
| 13 | private $id; |
| 14 | private $title; |
| 15 | private $plugin_id; |
| 16 | private static $forms = null; |
| 17 | private static $plugins = [['id' => 1, 'name' => 'Fluent Forms', 'slugs' => ['fluentform/fluentform.php']], ['id' => 2, 'name' => 'WPForms', 'slugs' => ['wpforms-lite/wpforms.php', 'wpforms/wpforms.php']], ['id' => 3, 'name' => 'Contact Form 7', 'slugs' => ['contact-form-7/wp-contact-form-7.php']], ['id' => 4, 'name' => 'Gravity Forms', 'slugs' => ['gravityforms/gravityforms.php']], ['id' => 5, 'name' => 'Ninja Forms', 'slugs' => ['ninja-forms/ninja-forms.php']], ['id' => 6, 'name' => 'MailOptin', 'slugs' => ['mailoptin/mailoptin.php']], ['id' => 7, 'name' => 'Convert Pro', 'slugs' => ['convertpro/convertpro.php']], ['id' => 8, 'name' => 'Elementor Pro', 'slugs' => ['elementor-pro/elementor-pro.php']], ['id' => 9, 'name' => 'JetFormBuilder', 'slugs' => ['jetformbuilder/jet-form-builder.php']], ['id' => 10, 'name' => 'Formidable Forms', 'slugs' => ['formidable/formidable.php']], ['id' => 11, 'name' => 'WS Form', 'slugs' => ['ws-form/ws-form.php']], ['id' => 12, 'name' => 'Amelia', 'slugs' => ['ameliabooking/ameliabooking.php']]]; |
| 18 | private function __construct(int $id, string $title, int $plugin_id) |
| 19 | { |
| 20 | $this->id = $id; |
| 21 | $this->title = $title; |
| 22 | $this->plugin_id = $plugin_id; |
| 23 | } |
| 24 | public function id() : int |
| 25 | { |
| 26 | return $this->id; |
| 27 | } |
| 28 | public function title() : string |
| 29 | { |
| 30 | return $this->title; |
| 31 | } |
| 32 | public function icon() : string |
| 33 | { |
| 34 | $lowercase = \strtolower($this->plugin_name()); |
| 35 | $hyphenated = \str_replace(' ', '_', $lowercase); |
| 36 | return $hyphenated; |
| 37 | } |
| 38 | public function plugin_name() : string |
| 39 | { |
| 40 | return \IAWP\Form::find_plugin_by_id($this->plugin_id)['name']; |
| 41 | } |
| 42 | public function is_plugin_active() : bool |
| 43 | { |
| 44 | $active_plugins = \get_option('active_plugins'); |
| 45 | $slugs = \IAWP\Form::find_plugin_by_id($this->plugin_id)['slugs']; |
| 46 | foreach ($slugs as $slug) { |
| 47 | if (\in_array($slug, $active_plugins)) { |
| 48 | return \true; |
| 49 | } |
| 50 | } |
| 51 | return \false; |
| 52 | } |
| 53 | public function submissions_column() : string |
| 54 | { |
| 55 | return "form_submissions_for_{$this->id}"; |
| 56 | } |
| 57 | public function conversion_rate_column() : string |
| 58 | { |
| 59 | return "form_conversion_rate_for_{$this->id}"; |
| 60 | } |
| 61 | public static function has_any_active_form_plugins() : bool |
| 62 | { |
| 63 | $active_plugins = \get_option('active_plugins'); |
| 64 | foreach (\IAWP\Form::$plugins as $plugin) { |
| 65 | foreach ($plugin['slugs'] as $slug) { |
| 66 | if (\in_array($slug, $active_plugins)) { |
| 67 | return \true; |
| 68 | } |
| 69 | } |
| 70 | } |
| 71 | return \false; |
| 72 | } |
| 73 | public static function find_form_by_column_name(string $column_name) : ?\IAWP\Form |
| 74 | { |
| 75 | $id = \intval(\preg_match('/(\\d+)\\z/', $column_name)); |
| 76 | $forms = self::get_forms(); |
| 77 | foreach ($forms as $form) { |
| 78 | if ($id === $form->id()) { |
| 79 | return $form; |
| 80 | } |
| 81 | } |
| 82 | return null; |
| 83 | } |
| 84 | /** |
| 85 | * @return Form[] |
| 86 | */ |
| 87 | public static function get_forms() : array |
| 88 | { |
| 89 | if (\is_array(self::$forms)) { |
| 90 | return self::$forms; |
| 91 | } |
| 92 | $forms_table = \IAWP\Query::get_table_name(\IAWP\Query::FORMS); |
| 93 | $query = \IAWP\Illuminate_Builder::get_builder()->select(['form_id', 'cached_form_title', 'plugin_id'])->from($forms_table); |
| 94 | $forms = \array_filter(\array_map(function ($form) { |
| 95 | if (\is_null(self::find_plugin_by_id($form->plugin_id))) { |
| 96 | return null; |
| 97 | } |
| 98 | return new self($form->form_id, $form->cached_form_title, $form->plugin_id); |
| 99 | }, $query->get()->all())); |
| 100 | \usort($forms, function (\IAWP\Form $a, \IAWP\Form $b) { |
| 101 | // First level sort by plugin name |
| 102 | $plugin_name_comparison = \strcmp($a->plugin_name(), $b->plugin_name()); |
| 103 | // If types are equal, sort by 'name' |
| 104 | if ($plugin_name_comparison === 0) { |
| 105 | return \strcmp($a->title(), $b->title()); |
| 106 | } |
| 107 | return $plugin_name_comparison; |
| 108 | }); |
| 109 | self::$forms = $forms; |
| 110 | return self::$forms; |
| 111 | } |
| 112 | private static function find_plugin_by_id(int $id) : ?array |
| 113 | { |
| 114 | foreach (self::$plugins as $plugin) { |
| 115 | if ($plugin['id'] === $id) { |
| 116 | return $plugin; |
| 117 | } |
| 118 | } |
| 119 | return null; |
| 120 | } |
| 121 | } |
| 122 |