PluginProbe
Depicter — Popup & Slider Builder / trunk
Depicter — Popup & Slider Builder vtrunk
4.8.1 trunk 1.0.0 1.1.0 1.1.2 1.1.4 1.1.6 1.1.7 1.1.8 1.1.9 1.2.0 1.3.0 1.3.1 1.3.2 1.3.3 1.3.5 1.3.8 1.5.0 1.5.1 1.5.2 1.5.5 1.6.0 1.6.1 1.6.2 1.7.0 All 76 releases
depicter / app / src / Services / LeadService.php

LeadService.php in Depicter — Popup & Slider Builder trunk, at app/src/Services/LeadService.php

311 lines 10.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Depicter\Services;
4
5 use Averta\Core\Utility\Arr;
6 use Averta\Core\Utility\Data;
7 use Averta\Core\Utility\Validator;
8 use Averta\WordPress\Utility\Sanitize;
9 use WPEmerge\Requests\RequestInterface;
10
11 class LeadService
12 {
13 /**
14 * List of reserved field names
15 */
16 const RESERVED_FILED_NAMES = ['_sourceId', '_contentId', '_contentName', '_csrfToken', 'action', '_g_recaptcha_token', '_g_recaptcha_error'];
17
18 public function add($sourceId, $contentId, RequestInterface $request)
19 {
20 try {
21 $contentName = Sanitize::textfield($request->body('_contentName', ''));
22
23 $leadId = \Depicter::leadRepository()->create($sourceId, $contentId, $contentName);
24
25 if (!$leadId) {
26 return [
27 'success' => false,
28 'errors' => [__('Error while creating the lead', 'depicter')]
29 ];
30 }
31
32 \Depicter::analytics()->track( $sourceId, 'submission' );
33
34 $formFields = $request->getParsedBody();
35
36 foreach ($formFields as $fieldName => $fieldValue) {
37 if (in_array($fieldName, self::RESERVED_FILED_NAMES)) {
38 continue;
39 }
40
41 $leadFields = \Depicter::leadFieldRepository()->create(
42 $leadId,
43 Sanitize::textfield($fieldName),
44 Sanitize::textfield($fieldValue),
45 $this->getFieldType($fieldName, $fieldValue)
46 );
47
48 if (!$leadFields) {
49 return [
50 'success' => false,
51 'errors' => [__('Error while saving the fields', 'depicter')]
52 ];
53 }
54 }
55
56 $analyticsMetadata = $this->extractAnalyticsMetaDataOfLead($request);
57 if ( !empty( $analyticsMetadata ) ) {
58 foreach ( $analyticsMetadata as $data ) {
59 \Depicter::leadFieldRepository()->create(
60 $leadId,
61 Sanitize::textfield($data['name']),
62 Sanitize::textfield($data['value']),
63 Sanitize::textfield($data['type'])
64 );
65 }
66 }
67
68 do_action( 'depicter/lead/created', $leadId, $sourceId, $contentId );
69
70 return ['success' => true];
71
72 } catch (\Exception $e) {
73 return [
74 'success' => false,
75 'errors' => [$e->getMessage()]
76 ];
77 }
78 }
79
80 public function get($args = [])
81 {
82 $default = [
83 's' => '',
84 'sources' => '',
85 'dateStart' => '',
86 'dateEnd' => '',
87 'order' => 'DESC',
88 'orderBy' => 'id',
89 'page' => 1,
90 'perPage' => 20
91 ];
92
93 $args = Arr::merge($args, $default);
94 $hits = [];
95 $commonFields = [];
96
97 try {
98 $results = \Depicter::leadRepository()->getResults($args);
99 if (!empty($results['leads'])) {
100 foreach ($results['leads'] as $lead) {
101 $document = \Depicter::documentRepository()->select(['id', 'name', 'type'])->findById($lead['source_id']);
102 $leadFields = \Depicter::leadFieldRepository()->select(['name', 'value', 'type'])->where('lead_id', $lead['id'])->get();
103 $fields = [];
104 $metadata = [];
105 $identifier = '';
106 if (!empty($leadFields)) {
107 $leadFields = $leadFields->toArray();
108 foreach ($leadFields as $leadField) {
109
110 if ( in_array( $leadField['name'], $this->getAnalyticsMetaDataKeys() ) ) {
111 $metadata[] = [
112 'name' => $leadField['name'],
113 'value' => $leadField['value'],
114 'type' => $leadField['type']
115 ];
116 continue;
117 }
118 $fields[] = [
119 'name' => $leadField['name'],
120 'value' => $leadField['value'],
121 'type' => $leadField['type']
122 ];
123
124 if ($leadField['name'] === 'email') {
125 $identifier = $leadField['value'];
126 if (!in_array('email', $commonFields)) {
127 $commonFields[] = 'email';
128 }
129 }
130
131 if ($leadField['name'] === 'name' && !in_array('name', $commonFields)) {
132 $commonFields[] = 'name';
133 }
134
135 if ($leadField['name'] === 'phone' && !in_array('phone', $commonFields)) {
136 $commonFields[] = 'phone';
137 }
138 }
139 }
140 $hits[] = [
141 'id' => $lead['id'],
142 'createdAt' => $lead['created_at'],
143 'identifier' => $identifier,
144 'source' => [
145 'id' => $document->id,
146 'name' => $document->name,
147 'type' => $document->type
148 ],
149 'content' => [
150 'id' => $lead['content_id'],
151 'name' => $lead['content_name']
152 ],
153 'fields' => $fields,
154 'metadata' => $metadata
155 ];
156 }
157 }
158
159 return [
160 'hasMore' => isset($results['numberOfPages']) && $results['numberOfPages'] > $results['page'],
161 'page' => $args['page'],
162 'perpage' => $args['perPage'],
163 'totalPages' => $results['numberOfPages'] ?? 1,
164 'totalHits' => $results['numberOfLeads'],
165 'hits' => Arr::camelizeKeys($hits, '_', [], true),
166 'commonFields' => $commonFields
167 ];
168 } catch (\Exception $e) {
169 return [
170 'errors' => [$e->getMessage()]
171 ];
172 }
173 }
174
175 /**
176 * Tries to retrieve the type of field based on name or value
177 *
178 * @param string $fieldName Field name
179 * @param string $fieldValue Field value
180 *
181 * @return string
182 */
183 protected function getFieldType($fieldName, $fieldValue = '')
184 {
185 $default = 'text';
186
187 $knowFieldNames = [
188 'name' => 'text',
189 'first-name' => 'text',
190 'last-name' => 'text',
191 'email' => 'email',
192 'phone' => 'tel',
193 'address' => 'text',
194 'website' => 'url',
195 'checkbox' => 'bool',
196 ];
197
198 if (!empty($knowFieldNames[ $fieldName ])) {
199 return $knowFieldNames[ $fieldName ];
200 }
201 if (empty($fieldValue)) {
202 return $default;
203 }
204 if (Validator::isEmail($fieldValue)) {
205 return 'email';
206 }
207 if (Validator::isUrl($fieldValue)) {
208 return 'url';
209 }
210 if (Validator::isTel($fieldValue)) {
211 return 'tel';
212 }
213 if (Data::isTrue($fieldValue)) {
214 return 'bool';
215 }
216
217 return $default;
218 }
219
220 /**
221 * Extracts analytics metadata of a lead from the request
222 *
223 * @param RequestInterface $request
224 *
225 * @return array
226 */
227 protected function extractAnalyticsMetaDataOfLead(RequestInterface $request) {
228 $fields = [
229 [
230 'name' => 'ipAddress',
231 'type' => 'text',
232 'value' => \Depicter::geoLocate()->getIP()
233 ],
234 [
235 'name' => 'country',
236 'type' => 'text',
237 'value' => \Depicter::geoLocate()->getCountry()
238 ],
239 [
240 'name' => 'submittedAtUtc',
241 'type' => 'date',
242 'value' => gmdate('Y-m-d H:i:s')
243 ],
244 [
245 'name' => 'timeZone',
246 'type' => 'text',
247 'value' => \Depicter::geoLocate()->getTimeZone()
248 ],
249 [
250 'name' => 'deviceType',
251 'type' => 'text',
252 'value' => wp_is_mobile() ? 'mobile' : 'desktop'
253 ]
254 ];
255
256 if ( ! $referrer = Sanitize::textfield( $request->query('referrerURL', '') ) ) {
257 $fields[] = [
258 'name' => 'referrerURL',
259 'type' => 'text',
260 'value' => $referrer
261 ];
262 }
263
264 if ( ! $pageURL = Sanitize::textfield( $request->query('pageURL', '') ) ) {
265 $fields[] = [
266 'name' => 'pageURL',
267 'type' => 'text',
268 'value' => $pageURL
269 ];
270 }
271
272 if ( !empty( $request->getHeaderLine('User-Agent') ) ) {
273 $fields[] = [
274 'name' => 'userAgent',
275 'type' => 'text',
276 'value' => $request->getHeaderLine('User-Agent')
277 ];
278 }
279
280 if ( !empty( $request->getHeaderLine('Accept-Language') ) ) {
281 $rawLocale = $request->getHeaderLine('Accept-Language'); // sth like: en-US,en;q=0.9,de;q=0.8,fr;q=0.7
282 $parts = explode(',', $rawLocale);
283 $locale = strtolower(trim($parts[0])); // e.g., "en-us"
284 if ( !empty( $locale ) ) {
285 $fields[] = [
286 'name' => 'locale',
287 'type' => 'text',
288 'value' => $locale
289 ];
290 }
291 }
292
293 return $fields;
294 }
295
296 protected function getAnalyticsMetaDataKeys(): array
297 {
298 return [
299 'ipAddress',
300 'submittedAtUtc',
301 'country',
302 'referrerURL',
303 'pageURL',
304 'timeZone',
305 'deviceType',
306 'userAgent',
307 'locale'
308 ];
309 }
310 }
311