PluginProbe
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder / 3.3.1
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder v3.3.1
3.3.1 V-3.3.0 3.2.2 3.2.1 3.2.0 3.1.4 3.1.3 3.1.2 3.1.1 3.1.0 V3.0.3 V3.0.2 -3.0.1 V_3.0.0 1.1.1 1.1.8 1.2 1.3 1.4 1.4.18 1.5.2 1.9 2.0 2.10.0 2.10.1 All 138 releases
bit-form / includes / Frontend / ConversationalFormView.php

ConversationalFormView.php in Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder 3.3.1, at includes/Frontend/ConversationalFormView.php

156 lines 5.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace BitCode\BitForm\Frontend;
4
5 use BitCode\BitForm\Core\Database\FormModel;
6 use BitCode\BitForm\Core\Form\FormManager;
7 use BitCode\BitForm\Core\Util\Render;
8 use BitCode\BitForm\Frontend\Form\FrontendFormHandler;
9 use BitCode\BitForm\Frontend\Form\View\Conversational\ConversationalHelpers;
10
11 class ConversationalFormView
12 {
13 public static function preview()
14 {
15 // Read-only: REQUEST_URI used to extract form ID from URL path for view dispatch. No state mutation.
16 $requestUri = isset($_SERVER['REQUEST_URI']) ? esc_url_raw(wp_unslash($_SERVER['REQUEST_URI'])) : '';
17 $uri = explode('/', $requestUri);
18
19 if (is_array($uri) && count($uri) > 0) {
20 $formID = $uri[count($uri) - 1];
21 $attr = ['form_id' => $formID, 'form_preview' => true];
22
23 $frontendFormHandler = new FrontendFormHandler();
24 $formViewObject = $frontendFormHandler->handleFrontendRenderRequest($attr);
25 if ('string' === gettype($formViewObject)) {
26 Render::view('views/form-not-found');
27 exit;
28 }
29
30 $formHTML = $formViewObject->html;
31 $font = $formViewObject->font;
32 $bfGlobals = $formViewObject->bfGlobals;
33 $configTag = isset($formViewObject->configTag) ? $formViewObject->configTag : '';
34 $formContent = isset($formViewObject->formContent) ? $formViewObject->formContent : null;
35
36 if (defined('BITAPPS_DEV') && BITAPPS_DEV) {
37 set_transient('bitform_form_preview', true);
38 $frontendFormHandler->generateJs($formID);
39 $title = 'BitForm Preview page';
40 Render::view('views/preview-page', compact('formID', 'title', 'formHTML', 'font', 'bfGlobals', 'configTag', 'formContent'));
41 }
42 }
43 }
44
45 private static function getCustomUrlFormId()
46 {
47 $urlMap = get_transient('bitform_conversational_url_map');
48 if (false === $urlMap) {
49 $urlMap = self::buildConversationalUrlMap();
50 set_transient('bitform_conversational_url_map', $urlMap, DAY_IN_SECONDS);
51 }
52
53 if (empty($urlMap)) {
54 return null;
55 }
56
57 $currentUrl = get_site_url() . (isset($_SERVER['REQUEST_URI']) ? esc_url_raw(wp_unslash($_SERVER['REQUEST_URI'])) : '');
58 $parsedCurrentUrl = wp_parse_url($currentUrl);
59
60 foreach ($urlMap as $formID => $customUrlSlug) {
61 $customUrl = get_site_url() . '/' . $customUrlSlug;
62 $parsedCustomUrl = wp_parse_url($customUrl);
63 $pathMatched = isset($parsedCustomUrl['path']) && $parsedCustomUrl['path'] === ($parsedCurrentUrl['path'] ?? '');
64 if (!$pathMatched) {
65 continue;
66 }
67 if (!isset($parsedCustomUrl['query'])) {
68 return $formID;
69 }
70 parse_str($parsedCustomUrl['query'], $parsedCustomQueries);
71 parse_str($parsedCurrentUrl['query'] ?? '', $parsedCurrentQueries);
72 if (empty(array_diff_assoc($parsedCustomQueries, $parsedCurrentQueries))) {
73 return $formID;
74 }
75 }
76
77 return null;
78 }
79
80 private static function buildConversationalUrlMap()
81 {
82 $formModel = new FormModel();
83 $forms = $formModel->get(['id', 'form_content']);
84 $urlMap = [];
85 if (is_wp_error($forms) || !is_array($forms)) {
86 return $urlMap;
87 }
88 foreach ($forms as $form) {
89 $formContent = json_decode($form->form_content);
90 if (empty($formContent->formInfo->standaloneSettings->active)) {
91 continue;
92 }
93 if (empty($formContent->formInfo->conversationalSettings->enable)) {
94 continue;
95 }
96 $standaloneSettings = $formContent->formInfo->standaloneSettings;
97 if (empty($standaloneSettings->customUrl)) {
98 continue;
99 }
100 $urlMap[$form->id] = $standaloneSettings->customUrl;
101 }
102 return $urlMap;
103 }
104
105 public static function conversationalFormView()
106 {
107 if (is_admin()) {
108 return;
109 }
110 // Read-only: form ID and preview flag from query string for conversational form dispatch. No state mutation.
111 $formID = isset($_GET['bit-conversational-form']) ? sanitize_text_field(wp_unslash($_GET['bit-conversational-form'])) : '';
112 $formType = 'conversational';
113 if (empty($formID)) {
114 $formID = self::getCustomUrlFormId();
115 }
116
117 if (empty($formID)) {
118 return '';
119 }
120
121 $formID = intval($formID);
122
123 $isPreview = isset($_GET['bf_preview']);
124
125 ConversationalHelpers::setPreviewMode($isPreview);
126
127 $attr = ['type'=> $formType, 'form_id' => $formID, 'form_preview' => true];
128
129 $FormManager = FormManager::getInstance($formID);
130 $formContent = $FormManager->getFormContent();
131 if (empty($formContent->formInfo->conversationalSettings->enable)) {
132 return;
133 }
134
135 $frontendFormHandler = new FrontendFormHandler();
136 $formViewObject = $frontendFormHandler->handleFrontendRenderRequest($attr);
137 if ('string' === gettype($formViewObject)) {
138 Render::view('views/form-not-found');
139 exit;
140 }
141
142 $formHTML = $formViewObject->html;
143 $font = $formViewObject->font;
144 $bfGlobals = $formViewObject->bfGlobals;
145 $configTag = isset($formViewObject->configTag) ? $formViewObject->configTag : '';
146 $formContent = isset($formViewObject->formContent) ? $formViewObject->formContent : null;
147
148 set_transient('bitform_form_preview', true);
149 $frontendFormHandler->generateJs($formID, null, $formType);
150 $title = 'Bit Form';
151 Render::view('views/conversational-form', compact('formID', 'title', 'formHTML', 'font', 'bfGlobals', 'configTag', 'isPreview', 'formContent'));
152
153 exit(200);
154 }
155 }
156