PluginProbe
WPBot – ChatBot Conversational Forms / 1.4.7
WPBot – ChatBot Conversational Forms v1.4.7
1.5.0 1.4.8 1.4.7 trunk 0.9.2 0.9.3 0.9.5 0.9.6 0.9.7 0.9.8 0.9.9 1.0.0 1.1.0 1.1.1 1.1.2 1.1.3 1.1.4 1.1.6 1.1.7 1.1.8 1.2.0 1.3.0 1.3.1 1.3.2 1.3.3 All 36 releases
conversational-forms / classes / api / forms.php

forms.php in WPBot – ChatBot Conversational Forms 1.4.7, at classes/api/forms.php

672 lines 20.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * CRUD via REST API for forms
5 *
6 * @package Caldera_Forms Modified by QuantumCloud
7 * @author Josh Pollock <Josh@CalderaWP.com>
8 * @license GPL-2.0+
9 * @link
10 * @copyright 2016 CalderaWP LLC
11 */
12 class Qcformbuilder_Forms_API_Forms extends Qcformbuilder_Forms_API_CRUD {
13
14
15 /**
16 * @inheritdoc
17 *
18 * @since 1.5.3
19 */
20 public function add_routes( $namespace ) {
21 parent::add_routes($namespace);
22 register_rest_route( $namespace, $this->id_endpoint_url() . '/revisions',
23 array(
24 'methods' => \WP_REST_Server::READABLE,
25 'callback' => array( $this, 'get_revisions' ),
26 'permission_callback' => array( $this, 'get_item_permissions_check' ),
27 'args' => $this->get_item_args()
28 )
29 );
30
31 register_rest_route( $namespace, $this->id_endpoint_url() . '/preview',
32 array(
33 'methods' => \WP_REST_Server::READABLE,
34 'callback' => array( $this, 'get_preview' ),
35 'permission_callback' => array( $this, 'get_item_permissions_check' ),
36 'args' => $this->get_item_args()
37 )
38 );
39
40 register_rest_route( $namespace, $this->id_endpoint_url() . '/privacy',
41 array(
42 'methods' => \WP_REST_Server::EDITABLE,
43 'callback' => array( $this, 'update_privacy_settings' ),
44 'permission_callback' => array( $this, 'update_item_permissions_check' ),
45 'args' => $this->get_item_args()
46 )
47 );
48
49 register_rest_route( $namespace, $this->id_endpoint_url() . '/toggle-active',
50 array(
51 'methods' => \WP_REST_Server::EDITABLE,
52 'callback' => array( $this, 'toggle_active' ),
53 'permission_callback' => array( $this, 'update_item_permissions_check' ),
54 )
55 );
56
57
58 }
59
60
61
62 /**
63 * @inheritdoc
64 *
65 * @since 1.5.8
66 */
67 public function get_item_args(){
68 $args = parent::get_item_args();
69 $args[ 'preview' ] = array(
70 'type' => 'boolean',
71 'default' => false,
72 'sanitize_callback' => 'rest_sanitize_boolean'
73 );
74
75 return $args;
76 }
77
78 /**
79 * Fields for the privacy route
80 *
81 * @since 1.70
82 *
83 * @return array
84 */
85 protected function privacy_route_args()
86 {
87 return array(
88 'emailIdentifiers' => array(
89 'type' => 'array',
90 'required' => false,
91 'description' => esc_html__( 'Array of fields that can be used to find personally identifying information saved with this form.', 'qcformbuilder-forms' ),
92 'sanitize_callback' => array( 'Qcformbuilder_Forms_API_Util', 'validate_array_of_field_ids' )
93 ),
94 'piiFields' => array(
95 'type' => 'array',
96 'required' => false,
97 'description' => esc_html__( 'Array of fields that contain personally identifying information', 'qcformbuilder-forms' ),
98 'sanitize_callback' => array( 'Qcformbuilder_Forms_API_Util', 'validate_array_of_field_ids' )
99 ),
100 'privacyExporterEnabled' => array(
101 'type' => 'boolean',
102 'required' => false,
103 'description' => esc_html__( 'Array of fields that contain personally identifying information', 'qcformbuilder-forms' ),
104 'sanitize_callback' => 'rest_sanitize_boolean'
105 )
106 );
107 }
108
109 /**
110 * Get a form via REST API
111 *
112 * /wfb-api/v2/forms/<form_id>
113 *
114 * @since 1.5.0
115 *
116 * @param WP_REST_Request $request
117 *
118 * @return Qcformbuilder_Forms_API_Error|Qcformbuilder_Forms_API_Response
119 */
120 public function get_item(WP_REST_Request $request){
121 if( $request->get_param( 'privacy' ) ){
122 return $this->get_privacy_settings( $request );
123 }
124
125 try{
126 $this->form_object_factory( $request[ 'form_id' ], $request );
127 }catch ( Exception $e ){
128 return Qcformbuilder_Forms_API_Response_Factory::error_form_not_found();
129 }
130
131 if ( $request->get_param( 'preview' ) ) {
132 return $this->preview_response();
133 }
134
135
136
137 $response_form = $this->prepare_form_for_response( $this->form, $request );
138 return new Qcformbuilder_Forms_API_Response( $response_form, 200, array( ) );
139
140 }
141
142 /**
143 * Get a form preview via REST API
144 *
145 * /wfb-api/v2/forms/<form_id>/preview
146 *
147 * @since 1.5.8
148 *
149 * @param WP_REST_Request $request Request object
150 *
151 * @return Qcformbuilder_Forms_API_Error|Qcformbuilder_Forms_API_Response
152 */
153 public function get_preview( WP_REST_Request $request ){
154 try{
155 $this->form_object_factory( $request[ 'form_id' ], $request );
156 }catch ( Exception $e ){
157 return Qcformbuilder_Forms_API_Response_Factory::error_form_not_found();
158 }
159
160 return $this->preview_response();
161
162 }
163
164 /**
165 * Get privacy settings for form
166 *
167 * @since 1.7.0
168 *
169 * @param WP_REST_Request $request
170 * @return Qcformbuilder_Forms_API_Response|Qcformbuilder_Forms_API_Error
171 */
172 public function get_privacy_settings( WP_REST_Request $request )
173 {
174 try{
175 $this->form_object_factory( $request[ 'form_id' ], $request );
176 }catch ( Exception $e ){
177 return Qcformbuilder_Forms_API_Response_Factory::error_form_not_found();
178 }
179
180 return new Qcformbuilder_Forms_API_Response( $this->form->toArray() );
181
182 }
183
184 /**
185 * Update a form's privacy settings
186 *
187 * @since 1.7.0
188 *
189 * @param WP_REST_Request $request
190 * @return Qcformbuilder_Forms_API_Error|Qcformbuilder_Forms_API_Response
191 */
192 public function update_privacy_settings( WP_REST_Request $request ){
193 try{
194 $this->form_object_factory( $request[ 'form_id' ], $request );
195 }catch ( Exception $e ){
196 return Qcformbuilder_Forms_API_Response_Factory::error_form_not_found();
197 }
198
199 if( isset( $request[ 'emailIdentifyingFields' ] ) && is_array( $request[ 'emailIdentifyingFields' ] ) ){
200 $this->form->set_email_identifying_fields( $request[ 'emailIdentifyingFields' ] );
201 }
202
203 if( isset( $request[ 'piiFields' ] ) && is_array( $request[ 'piiFields' ] ) ){
204 $this->form->set_pii_fields( $request[ 'piiFields' ] );
205 }
206
207 //This will save settings (form)
208 if( true === boolval($request[ 'privacyExporterEnabled' ] ) ){
209 $this->form = $this->form->enable_privacy_exporter();
210 }else {
211 $this->form->disable_privacy_exporter();
212 }
213 return new Qcformbuilder_Forms_API_Response( $this->form->toArray() );
214
215 }
216
217
218 /**
219 * Get form revisions
220 *
221 * GET /forms/<form-id>/revision
222 *
223 * @since 1.5.3
224 *
225 * @param WP_REST_Request $request
226 *
227 * @return Qcformbuilder_Forms_API_Response
228 */
229 public function get_revisions( WP_REST_Request $request ){
230 $form_id = $request[ 'form_id' ];
231 $revisions = Qcformbuilder_Forms_Forms::get_revisions( $request[ 'form_id' ], true );
232 $response_data = array();
233 foreach ( $revisions as $revision ){
234 $response_data[] = array(
235 'id' => $revision,
236 'edit' => Qcformbuilder_Forms_Admin::form_edit_link( $form_id, $revision )
237 );
238 }
239 if( empty( $response_data ) ){
240 return new Qcformbuilder_Forms_API_Response( array( 'message' => __( 'No Revisions Found For This Form', 'qcformbuilder-forms' ) ) );
241
242 }
243 return new Qcformbuilder_Forms_API_Response( $response_data );
244 }
245
246 /**
247 * Get all form via REST API
248 *
249 * /wfb-api/v2/forms/
250 *
251 * @since 1.5.0
252 *
253 * @param WP_REST_Request $request
254 *
255 * @return Qcformbuilder_Forms_API_Error|Qcformbuilder_Forms_API_Response
256 */
257 public function get_items(WP_REST_Request $request){
258
259 $forms = Qcformbuilder_Forms_Forms::get_forms( $request[ 'details' ] );
260 $prepared = array();
261 if( ! empty( $forms ) && $request[ 'full' ] ){
262 foreach( $forms as $id => $form ){
263 try{
264 $this->form_object_factory( $id, $request );
265 }catch ( Exception $e ){
266 continue;
267 }
268 $prepared[ $id ] = $this->prepare_form_for_response( $this->form, $request );
269 }
270
271 }
272
273 $response = new Qcformbuilder_Forms_API_Response( $prepared, 200, array( ) );
274 $response->set_total_header( count( $forms ) );
275 return $response;
276 }
277
278 /**
279 * @since 1.5.0
280 *
281 * @inheritdoc
282 */
283 public function route_base(){
284 return 'forms';
285 }
286
287 /**
288 * @since 1.5.0
289 *
290 * @inheritdoc
291 */
292 public function request_args(){
293 return array(
294 'details' => array(
295 'required' => false,
296 'default' => true,
297 ),
298 'full' => array(
299 'required' => false,
300 'default' => false,
301 ),
302 );
303 }
304
305
306 /**
307 * Permissions for form read
308 *
309 * @since 1.5.0
310 *
311 * @param WP_REST_Request $request
312 *
313 * @return bool
314 */
315 public function get_items_permissions_check( WP_REST_Request $request ){
316 $allowed = current_user_can( Qcformbuilder_Forms::get_manage_cap( 'entry-view' ), $request[ 'form_id' ] );
317 if( ! $allowed ){
318 $allowed = Qcformbuilder_Forms_API_Util::check_api_token( $request );
319 }
320 /**
321 * Filter permissions for viewing form config via Qcformbuilder Forms REST API
322 *
323 * @since 1.5.0
324 *
325 * @param bool $allowed Is request authorized?
326 * @param string $form_id The form ID
327 * @param WP_REST_Request $request The current request
328 */
329 return apply_filters( 'qcformbuilder_forms_api_allow_form_view', $allowed, $request[ 'form_id' ], $request );
330
331 }
332
333 /**
334 * Permissions for form create/update/delete
335 *
336 * @since 1.5.0
337 *
338 * @param WP_REST_Request $request
339 *
340 * @return bool
341 */
342 public function create_item_permissions_check( WP_REST_Request $request ){
343 $allowed = current_user_can( Qcformbuilder_Forms::get_manage_cap( 'entry-edit' ), $request[ 'form_id' ] );
344
345 /**
346 * Filter permissions for creating, updating or deleting forms via Qcformbuilder Forms REST API
347 *
348 * @since 1.5.0
349 *
350 * @param bool $allowed Is request authorized?
351 * @param string $form_id The form ID
352 * @param WP_REST_Request $request The current request
353 */
354 return apply_filters( 'qcformbuilder_forms_api_allow_form_edit', $allowed, $request[ 'form_id' ], $request );
355
356 }
357
358 /**
359 * Form the endpoint URL that includes item ID
360 *
361 * Used by for get_item() and update_time() and delete_item()
362 *
363 * @since 1.5.0
364 *
365 * @return string
366 */
367 public function id_endpoint_url() {
368 return '/' . $this->route_base() . '/(?P<form_id>[\w-]+)';
369 }
370
371 /**
372 * Create a form
373 *
374 * @since 1.8.0
375 *
376 * @param WP_REST_Request $request Full data about the request.
377 * @return Qcformbuilder_Forms_API_Response|Qcformbuilder_Forms_API_Error
378 */
379 public function create_item( WP_REST_Request $request ) {
380 $data = [];
381 foreach ( array_keys($this->args_for_create()) as $key ){
382 $data[$key] = $request[$key];
383 }
384
385 $new_form = Qcformbuilder_Forms_Forms::create_form( $data );
386 if( ! empty($new_form ) ){
387 try{
388 $this->form_object_factory( $new_form[ 'ID' ], $request );
389 }catch ( Exception $e ){
390 return Qcformbuilder_Forms_API_Response_Factory::error_form_not_found();
391 }
392
393 $response_form = $this->prepare_form_for_response( $this->form, $request );
394 return new Qcformbuilder_Forms_API_Response( $response_form, 200, array( ) );
395 }
396 return Qcformbuilder_Forms_API_Response_Factory::error_form_not_created();
397
398 }
399
400 /**
401 * @inheritdoc
402 * @since 1.8.0
403 */
404 public function args_for_create(){
405 $templates = Qcformbuilder_Forms_Admin::internal_form_templates();
406 return [
407 'ID' => [
408 'type' => 'string',
409 'description' => __( 'The desired form ID', 'qcformbuilder-forms' ),
410 'required' => false,
411 'default' => '',
412 'sanitize_callback' => 'qcformbuilder_forms_very_safe_string'
413 ],
414 'name' => [
415 'type' => 'string',
416 'description' => __( 'The name for the form', 'qcformbuilder-forms' ),
417 'required' => false,
418 'default' => '',
419 'sanitize_callback' => 'qcformbuilder_forms_very_safe_string'
420 ],
421 'type' => [
422 'type' => 'string',
423 'description' => __( 'The type of form to create', 'qcformbuilder-forms' ),
424 'required' => true,
425 'default' => 'primary',
426 'enum' => [
427 'primary',
428 'revision'
429 ]
430 ],
431 'template' => [
432 'description' => __( 'The form template to use', 'qcformbuilder-forms' ),
433 'type' => 'string',
434 'required' => false,
435 'enum' => array_keys($templates)
436 ],
437 'clone' => [
438 'description' => __( 'The ID of a form to clone', 'qcformbuilder-forms' ),
439 'type' => 'string',
440 'required' => false,
441 ]
442 ];
443 }
444
445 /**
446 * Format repsonse for form
447 *
448 * @param Qcformbuilder_Forms_API_Form $form
449 * @param WP_REST_Request $request
450 *
451 * @return array|mixed
452 */
453 protected function prepare_form_for_response( Qcformbuilder_Forms_API_Form $form, WP_REST_Request $request ){
454
455 $form = $this->prepare_field_details( $form, $request );
456
457 $form = $this->prepare_processors_for_response( $form );
458
459 $form = $this->prepare_mailer_for_response( $form );
460
461 return $form;
462
463 }
464
465 /**
466 * Prepare field details section of form response
467 *
468 * @since 1.5.0
469 *
470 * @param Qcformbuilder_Forms_API_Form $form Form config
471 *
472 * @return array
473 */
474 protected function prepare_field_details( Qcformbuilder_Forms_API_Form $form, WP_REST_Request $request ){
475 $order = $form->get_fields();
476 $entry_list = $form->get_entry_list_fields();
477 if(is_null($order)) {
478 $order = [];
479 }
480
481 $form = $form->toArray();
482
483 $form[ 'field_details' ] = array(
484 'order' => array(),
485 'entry_list' => array()
486 );
487
488 array_walk( $order, array( $this, 'prepare_field' ) );
489 array_walk( $entry_list, array( $this, 'prepare_field' ) );
490
491 if( false == $request[ 'entry_list_only_fields' ] ){
492 foreach ( $order as $field_id => $field ){
493 $type = Qcformbuilder_Forms_Field_Util::get_type( Qcformbuilder_Forms_Field_Util::get_field( $field_id, $form ) );
494 if ( Qcformbuilder_Forms_Fields::not_support( $type, 'entry_list' ) ){
495 unset( $order[ $field_id ] );
496 }
497 }
498
499 foreach ( $entry_list as $field_id => $field ){
500 $type = Qcformbuilder_Forms_Field_Util::get_type( Qcformbuilder_Forms_Field_Util::get_field( $field_id, $form ) );
501 if ( Qcformbuilder_Forms_Fields::not_support( $type, 'entry_list' ) ){
502 unset( $entry_list[ $field_id ] );
503 }
504 }
505
506 }
507
508 $form[ 'field_details' ][ 'order' ] = $order;
509 $entry_list_defaults = array(
510 'id' => array(
511 'id' => 'id',
512 'label' => __( 'ID', 'qcformbuilder-forms' )
513 ),
514 'datestamp' => array(
515 'id' => 'datestamp',
516 'label' => __( 'Submitted', 'qcformbuilder-forms' )
517 ),
518 );
519
520 if( is_array( $entry_list ) && ! empty( $entry_list ) ){
521 $form[ 'field_details' ][ 'entry_list' ] = array_merge( $entry_list_defaults, $entry_list );
522 }else{
523 $form[ 'field_details' ][ 'entry_list' ] = $entry_list_defaults;
524 }
525
526 return $form;
527
528 }
529
530 /**
531 * Reduce field to id/label
532 *
533 * Designed to be callback for array_walk used in $this->prepare_field_details
534 *
535 * @since 1.5.0
536 *
537 * @param $field
538 */
539 protected function prepare_field( &$field ){
540 if( ! empty( $field[ 'label' ] ) ){
541 $label = sanitize_text_field($field[ 'label' ]);
542 }elseif ( ! empty( $field[ 'name' ] ) ){
543 $label = sanitize_text_field($field[ 'name' ]);
544 }else{
545 $label = $field[ 'ID' ];
546 }
547 $field = array(
548 'id' => qcformbuilder_forms_very_safe_string( $field[ 'ID' ] ),
549 'label' => $label
550 );
551 }
552
553 /**
554 * @param $form
555 * @return mixed
556 */
557 protected function prepare_processors_for_response($form) {
558 if (!empty($form['processors'])) {
559 $processors = array();
560 foreach ($form['processors'] as $id => $processor) {
561 $processors[$id] = array(
562 'type' => $processor['type'],
563 'id' => $id
564 );
565 }
566 $form['processors'] = $processors;
567 return $form;
568
569 }
570 return $form;
571 }
572
573 /**
574 * @param $form
575 * @return mixed
576 */
577 protected function prepare_mailer_for_response($form) {
578 if (!empty($form['mailer'])) {
579 if (!empty($form['mailer']['on_insert'])) {
580
581 $form['mailer'] = array(
582 'active' => true
583 );
584 return $form;
585 } else {
586 $form['mailer'] = array(
587 'active' => false
588 );
589 return $form;
590 }
591 } else {
592
593 $form['mailer'] = array(
594 'active' => false
595 );
596 return $form;
597 }
598 }
599
600 /**
601 * Create form preview response
602 *
603 * @since 1.5.8
604 *
605 * @return Qcformbuilder_Forms_API_Response
606 */
607 protected function preview_response(){
608 $html = Qcformbuilder_Forms::render_form($this->form->toArray());
609
610 $css = array_merge(
611 Qcformbuilder_Forms_Render_Assets::get_core_styles(),
612 Qcformbuilder_Forms_Render_Assets::get_field_styles()
613 );
614 $js = array_merge(
615 Qcformbuilder_Forms_Render_Assets::get_core_scripts(),
616 Qcformbuilder_Forms_Render_Assets::get_field_scripts()
617 );
618
619 $prepared_css = array();
620 $prepared_js = array();
621 foreach ( $css as $key => $url ){
622 $slug = Qcformbuilder_Forms_Render_Assets::make_slug( $key );
623 if( ! wp_style_is( $slug ) ){
624 continue;
625 }
626 $prepared_css[ $slug ] = esc_url( $url );
627 }
628 foreach ( $js as $key => $url ){
629 $slug = Qcformbuilder_Forms_Render_Assets::make_slug( $key );
630 if( ! wp_script_is( $slug ) ){
631 continue;
632 }
633 $prepared_js[ $slug ] = esc_url( $url );
634 }
635 $data = array(
636 'html' => $html,
637 'css' => $prepared_css,
638 'js' => $prepared_js,
639 );
640 return new Qcformbuilder_Forms_API_Response($data, 200, array());
641 }
642
643
644 /**
645 * Toggle a form's active/inactive state
646 *
647 * @since 1.8.0
648 *
649 * @param WP_REST_Request $request
650 * @return Qcformbuilder_Forms_API_Error|Qcformbuilder_Forms_API_Response
651 */
652 public function toggle_active(\WP_REST_Request $request ){
653 add_filter( 'qcformbuilder_forms_save_revision', '__return_false' );
654 try{
655 $form = Qcformbuilder_Forms_Forms::get_form( $request[ 'form_id' ] );
656 }catch ( Exception $e ){
657 return Qcformbuilder_Forms_API_Response_Factory::error_form_not_found();
658 }
659
660 if ( ! empty( $form[ 'form_draft' ] ) ) {
661 Qcformbuilder_Forms_Forms::form_state( $form );
662 }else{
663 Qcformbuilder_Forms_Forms::form_state( $form , false );
664 }
665
666 add_filter( 'qcformbuilder_forms_save_revision', '__return_true' );
667 return new Qcformbuilder_Forms_API_Response(
668 ['active' => $form[ 'form_draft' ]]
669 );
670 }
671
672 }