PluginProbe
JetFormBuilder — Dynamic Blocks Form Builder / 1.5.0
JetFormBuilder — Dynamic Blocks Form Builder v1.5.0
3.6.5.2 3.6.5.1 3.6.5 3.6.4.2 3.6.4.1 3.6.4 3.6.3.1 3.6.3 3.6.2.2 3.6.2.1 3.6.2 3.6.1.1 3.6.1 3.6.0.1 trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.1.0 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 All 130 releases
← All changes | includes/request/request-handler.php +209 -156 trunk1.5.0 View file →
@@ -1,156 +1,209 @@
1 -<?php
2 -
3 -
4 -namespace Jet_Form_Builder\Request;
5 -
6 -use Jet_Form_Builder\Actions\Events\Bad_Request\Bad_Request_Event;
7 -use Jet_Form_Builder\Blocks\Block_Helper;
8 -use Jet_Form_Builder\Classes\Resources\Media_Block_Value;
9 -use Jet_Form_Builder\Exceptions\Action_Exception;
10 -use Jet_Form_Builder\Exceptions\Request_Exception;
11 -use JFB_Modules\Security\Exceptions\Spam_Exception;
12 -use Jet_Form_Builder\Request\Exceptions\Sanitize_Value_Exception;
13 -use JFB_Modules\Logger;
14 -
15 -// If this file is called directly, abort.
16 -if ( ! defined( 'WPINC' ) ) {
17 - die;
18 -}
19 -
20 -class Request_Handler {
21 -
22 - // phpcs:ignore PSR2.Classes.PropertyDeclaration.Underscore
23 - public $_fields = array();
24 -
25 - /**
26 - * Get submitted form data
27 - *
28 - * @throws Action_Exception|Spam_Exception|Request_Exception
29 - */
30 - public function set_form_data() {
31 - $this->_fields = Block_Helper::get_blocks_by_post(
32 - jet_fb_handler()->get_form_id()
33 - );
34 -
35 - do_action( 'jet-form-builder/request' );
36 - }
37 -
38 -
39 - /**
40 - * @deprecated 3.1.0
41 - *
42 - * @param string|array $name 'field_name'|'repeater_name.field_name'|['repeater_name', 'field_name']
43 - */
44 - public function exclude( $name ) {
45 - jet_fb_context()->make_secure( $name );
46 - }
47 -
48 - /**
49 - * @deprecated 3.1.0
50 - *
51 - * @return array
52 - */
53 - public function get_types(): array {
54 - return iterator_to_array( jet_fb_context()->iterate_fields_types() );
55 - }
56 -
57 - /**
58 - * @deprecated 3.1.0
59 - *
60 - * @return array
61 - */
62 - public function get_attrs(): array {
63 - return iterator_to_array( jet_fb_context()->iterate_fields_settings() );
64 - }
65 -
66 - /**
67 - * @deprecated 3.1.0
68 - *
69 - * @param string|array $name 'field_name'|'repeater_name.0.field_name'|['repeater_name', 0, 'field_name']
70 - * @param string $field_type
71 - *
72 - * @return bool
73 - */
74 - public function is_type( $name, string $field_type ): bool {
75 - return jet_fb_context()->get_field_type( $name ) === $field_type;
76 - }
77 -
78 - /**
79 - * @deprecated 3.1.0
80 - * @param $name
81 - *
82 - * @return string
83 - */
84 - public function get_type( $name ): string {
85 - return jet_fb_context()->get_field_type( $name );
86 - }
87 -
88 - /**
89 - * @deprecated 3.1.0
90 - *
91 - * @return array
92 - */
93 - public function get_request(): array {
94 - return jet_fb_context()->get_request();
95 - }
96 -
97 - /**
98 - * @deprecated 3.1.0
99 - *
100 - * @return array
101 - */
102 - public function get_files(): array {
103 - return array_merge(
104 - jet_fb_context()->resolve_files(),
105 - jet_fb_context()->get_files()
106 - );
107 - }
108 -
109 - /**
110 - * @deprecated 3.1.0
111 - * @param string $name
112 - *
113 - * @return false|Media_Block_Value
114 - */
115 - public function get_file( string $name ) {
116 - return jet_fb_context()->get_file( $name );
117 - }
118 -
119 - /**
120 - * @deprecated 3.1.0
121 - *
122 - * @param $field_name
123 - * @param $attr_name
124 - * @param false $if_not_exist
125 - *
126 - * @return mixed
127 - */
128 - public function get_attr(
129 - $field_name,
130 - $attr_name,
131 - $if_not_exist = false
132 - ) {
133 - $attr = jet_fb_context()->get_setting( $attr_name, $field_name );
134 -
135 - return false === $attr ? $if_not_exist : $attr;
136 - }
137 -
138 -
139 - /**
140 - * @param $field_name
141 - * @param string $attr_name
142 - * @param bool $if_empty
143 - *
144 - * @return array
145 - * @deprecated since 2.0.0
146 - * Use jfb_request_handler()->get_attr instead
147 - */
148 - public function get_field_attrs_by_name(
149 - $field_name,
150 - $attr_name = '',
151 - $if_empty = false
152 - ) {
153 - return $this->get_attr( $field_name, $attr_name, $if_empty );
154 - }
155 -
156 -}
1 +<?php
2 +
3 +
4 +namespace Jet_Form_Builder\Request;
5 +
6 +use Jet_Form_Builder\Blocks\Modules\Fields_Errors\Error_Handler;
7 +use Jet_Form_Builder\Classes\Tools;
8 +use Jet_Form_Builder\Exceptions\Request_Exception;
9 +use Jet_Form_Builder\Live_Form;
10 +use Jet_Form_Builder\Plugin;
11 +
12 +class Request_Handler {
13 + public $request;
14 + public $errors;
15 +
16 + public $repeaters = array();
17 +
18 + public $_fields = array();
19 + public $_request_values;
20 + public $_response_data;
21 +
22 + const REPEATERS_SETTINGS = '__repeaters_settings';
23 + const WP_NONCE_KEY = '_wpnonce';
24 +
25 + public function set_request( $request ) {
26 + $this->request = $request;
27 +
28 + Parser_Manager::instance();
29 + }
30 +
31 + public function get_request() {
32 + return $this->_request_values;
33 + }
34 +
35 + private function merge_with_base_request( $data ) {
36 + foreach ( $this->request as $name => $field ) {
37 + $data[ '__' . $name ] = $field;
38 + }
39 + $data[ self::REPEATERS_SETTINGS ] = $this->repeaters;
40 +
41 + return $data;
42 + }
43 +
44 +
45 + /**
46 + * Get form values from request
47 + *
48 + * @return [type] [description]
49 + */
50 + public function get_values_from_request() {
51 +
52 + if ( $this->request['is_ajax'] ) {
53 +
54 + $prepared = array();
55 + // phpcs:disable WordPress.Security.NonceVerification.Missing
56 + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
57 + $raw = ! empty( $_POST['values'] ) ? Tools::sanitize_recursive( wp_unslash( $_POST['values'] ) ) : array();
58 + // phpcs:enable WordPress.Security.NonceVerification.Missing
59 +
60 + if ( empty( $raw ) ) {
61 + return $prepared;
62 + }
63 +
64 + foreach ( $raw as $data ) {
65 +
66 + $name = $data['name'];
67 + $value = $data['value'];
68 +
69 + if ( preg_match( '/\[\d\]\[/', $name ) ) {
70 +
71 + $name_parts = explode( '[', $name );
72 +
73 + $name = $name_parts[0];
74 + $index = absint( rtrim( $name_parts[1], ']' ) );
75 + $key = rtrim( $name_parts[2], ']' );
76 +
77 + if ( empty( $prepared[ $name ] ) ) {
78 + $prepared[ $name ] = array();
79 + }
80 +
81 + if ( empty( $prepared[ $name ][ $index ] ) ) {
82 + $prepared[ $name ][ $index ] = array();
83 + }
84 +
85 + if ( isset( $name_parts[3] ) ) {
86 +
87 + if ( empty( $prepared[ $name ][ $index ][ $key ] ) ) {
88 + $prepared[ $name ][ $index ][ $key ] = array();
89 + }
90 +
91 + $prepared[ $name ][ $index ][ $key ][] = $value;
92 +
93 + } else {
94 + $prepared[ $name ][ $index ][ $key ] = $value;
95 + }
96 + } elseif ( false !== strpos( $name, '[]' ) ) {
97 +
98 + $name = str_replace( '[]', '', $name );
99 +
100 + if ( empty( $prepared[ $name ] ) ) {
101 + $prepared[ $name ] = array();
102 + }
103 +
104 + $prepared[ $name ][] = $value;
105 +
106 + } else {
107 + $prepared[ $name ] = $value;
108 + }
109 + }
110 +
111 + return $prepared;
112 +
113 + } else {
114 + // phpcs:ignore WordPress.Security.NonceVerification.Missing
115 + return $_POST;
116 + }
117 +
118 + }
119 +
120 + /**
121 + * @throws Request_Exception
122 + */
123 + public function init_form_data() {
124 + $this->_fields = Plugin::instance()->form->get_form_blocks( $this->request['form_id'] );
125 + $this->_request_values = $this->get_values_from_request();
126 +
127 + $nonce = isset( $this->_request_values[ self::WP_NONCE_KEY ] )
128 + ? $this->_request_values[ self::WP_NONCE_KEY ]
129 + : '';
130 +
131 + Live_Form::instance()->set_form_id( $this->request['form_id'] );
132 +
133 + if ( ! wp_verify_nonce( $nonce, Live_Form::instance()->get_nonce_id() ) ) {
134 + throw ( new Request_Exception( 'Invalid nonce.' ) )->dynamic_error();
135 + }
136 +
137 + }
138 +
139 +
140 + /**
141 + * Get submitted form data
142 + *
143 + * @return array [type] [description]
144 + * @throws Request_Exception
145 + */
146 + public function get_form_data() {
147 +
148 + $this->init_form_data();
149 +
150 + $this->_response_data = Parser_Manager::instance()->get_values_fields( $this->_fields, $this->_request_values );
151 +
152 + if ( ! Error_Handler::instance()->empty_errors() ) {
153 + throw new Request_Exception(
154 + 'validation_failed',
155 + Error_Handler::instance()->errors(),
156 + $this->_response_data
157 + );
158 + }
159 +
160 + if ( ! Plugin::instance()->captcha->verify( $this->request['form_id'], $this->request['is_ajax'] ) ) {
161 + throw new Request_Exception( 'captcha_failed' );
162 + }
163 +
164 + $data = apply_filters( 'jet-form-builder/form-handler/form-data', $this->_response_data, $this );
165 +
166 + return $this->merge_with_base_request( $data );
167 + }
168 +
169 + public function save_repeater( $name, $value ) {
170 + $this->repeaters[ $name ] = $value;
171 + }
172 +
173 + public function get_field_attrs_by_name( $field_name, $attr_name = '', $default_val = '' ) {
174 + return $this->_get_field_attrs_by_name( $this->_fields, $field_name, $attr_name, $default_val );
175 + }
176 +
177 + public function _get_field_attrs_by_name( $source, $field_name, $attr_name = '', $default_val = '' ) {
178 + foreach ( $source as $field ) {
179 + if ( empty( $field['attrs'] )
180 + || ! isset( $field['attrs']['name'] )
181 + || $field_name !== $field['attrs']['name']
182 + ) {
183 + if ( ! empty( $field['innerBlocks'] ) ) {
184 + return $this->_get_field_attrs_by_name(
185 + $field['innerBlocks'],
186 + $field_name,
187 + $attr_name,
188 + $default_val
189 + );
190 + }
191 + continue;
192 + }
193 + $attrs = $field['attrs'];
194 +
195 + if ( ! $attr_name ) {
196 + return $attrs;
197 + }
198 + if ( ! isset( $attrs[ $attr_name ] ) ) {
199 + return $default_val;
200 + }
201 +
202 + return $attrs[ $attr_name ];
203 + }
204 +
205 + return $default_val;
206 + }
207 +
208 +
209 +}