PluginProbe ʕ •ᴥ•ʔ
Everest Forms – Contact Form, Payment Form, Quiz, Survey & Custom Form Builder with AI / 3.0.5
Everest Forms – Contact Form, Payment Form, Quiz, Survey & Custom Form Builder with AI v3.0.5
3.6.0 3.5.3 3.5.2 3.5.1 3.5.0 3.4.8 3.4.7 3.4.6 1.1.0 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.5.1 1.1.6 1.1.7 1.1.8 1.1.9 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.9 1.5.0 1.5.1 1.5.10 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.6.1 1.6.7 1.7.0 1.7.0.1 1.7.0.2 1.7.0.3 1.7.1 1.7.2 1.7.2.1 1.7.2.2 1.7.3 1.7.4 1.7.5 1.7.5.1 1.7.5.2 1.7.6 1.7.7 1.7.7.1 1.7.7.2 1.7.8 1.7.9 1.8.0 1.8.0.1 1.8.1 1.8.2 1.8.2.1 1.8.2.2 1.8.2.3 1.8.3 1.8.4 1.8.5 1.8.6 1.8.7 1.8.8 1.8.9 1.9.0 1.9.0.1 1.9.1 1.9.2 1.9.3 1.9.4 1.9.4.1 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.0.1 2.0.1 2.0.2 2.0.3 2.0.3.1 2.0.4 2.0.4.1 2.0.5 2.0.6 2.0.7 2.0.8 2.0.8.1 2.0.9 3.0.0 3.0.0.1 3.0.1 3.0.2 3.0.3 3.0.3.1 3.0.4 3.0.4.1 3.0.4.2 3.0.5 3.0.5.1 3.0.5.2 3.0.6 3.0.6.1 3.0.7.1 3.0.8 3.0.8.1 3.0.9 3.0.9.1 3.0.9.2 3.0.9.3 3.0.9.4 3.0.9.5 3.1.0 3.1.1 3.1.2 3.2.0 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 3.3.0 3.4.0 3.4.1 3.4.2 3.4.2.1 3.4.3 3.4.4 3.4.5 trunk 1.0 1.0.1 1.0.2 1.0.3
everest-forms / includes / admin / builder / class-evf-builder-fields.php
everest-forms / includes / admin / builder Last commit date
class-evf-builder-fields.php 2 years ago class-evf-builder-page.php 1 year ago class-evf-builder-settings.php 1 year ago
class-evf-builder-fields.php
414 lines
1 <?php
2 /**
3 * EverestForms Builder Fields
4 *
5 * @package EverestForms\Admin
6 * @since 1.2.0
7 */
8
9 defined( 'ABSPATH' ) || exit;
10
11 if ( class_exists( 'EVF_Builder_Fields', false ) ) {
12 return new EVF_Builder_Fields();
13 }
14
15 /**
16 * EVF_Builder_Fields class.
17 */
18 class EVF_Builder_Fields extends EVF_Builder_Page {
19
20 /**
21 * Contains information for multi-part forms.
22 *
23 * Forms that do not contain parts return false, otherwise returns an array
24 * that contains the number of total pages and page counter used when
25 * displaying part rows.
26 *
27 * @since 1.3.2
28 *
29 * @var array
30 */
31 public static $parts = array();
32
33 /**
34 * Constructor.
35 */
36 public function __construct() {
37 $this->id = 'fields';
38 $this->label = __( 'Fields', 'everest-forms' );
39 $this->sidebar = true;
40
41 parent::__construct();
42 }
43
44 /**
45 * Hook in tabs.
46 */
47 public function init_hooks() {
48 if ( is_object( $this->form ) ) {
49 add_action( 'everest_forms_builder_fields', array( $this, 'output_fields' ) );
50 add_action( 'everest_forms_builder_fields_options', array( $this, 'output_fields_options' ) );
51 add_action( 'everest_forms_builder_fields_preview', array( $this, 'output_fields_preview' ) );
52 }
53 }
54
55 /**
56 * Outputs the builder sidebar.
57 */
58 public function output_sidebar() {
59 ?>
60 <div class="everest-forms-fields-tab">
61 <a href="#" id="add-fields" class="fields active"><?php esc_html_e( 'Add Fields', 'everest-forms' ); ?></a>
62 <a href="#" id="field-options" class="options"><?php esc_html_e( 'Field Options', 'everest-forms' ); ?></a>
63 <?php do_action( 'everest_forms_builder_fields_tab', $this->form ); ?>
64 </div>
65 <div class="everest-forms-tab-content">
66 <div class="everest-forms-add-fields">
67 <div class="everest-forms-input-group everest-forms-search-input evf-mb-3">
68 <input id="everest-forms-search-fields" class="everest-forms-input-control everest-forms-search-fields" type="text" placeholder="<?php esc_attr_e( 'Search fields&hellip;', 'everest-forms' ); ?>" />
69 <div class="everest-forms-input-group__append">
70 <div class="everest-forms-input-group__text">
71 <svg xmlns="http://www.w3.org/2000/svg" height="20px" width="20px" viewBox="0 0 24 24" fill="#a1a4b9"><path d="M21.71,20.29,18,16.61A9,9,0,1,0,16.61,18l3.68,3.68a1,1,0,0,0,1.42,0A1,1,0,0,0,21.71,20.29ZM11,18a7,7,0,1,1,7-7A7,7,0,0,1,11,18Z"/></svg>
72 </div>
73 </div>
74 </div>
75 <div class="hidden everest-forms-fields-not-found">
76 <img src="<?php echo esc_attr( plugin_dir_url( EVF_PLUGIN_FILE ) . 'assets/images/fields-not-found.png' ); ?>" />
77 <h3 class="everest-forms-fields-not-found__title"><?php esc_html_e( 'Oops!', 'everest-forms' ); ?></h3>
78 <span><?php esc_html_e( 'There is not such field that you are searching for.', 'everest-forms' ); ?></span>
79 </div>
80 <?php do_action( 'everest_forms_builder_fields', $this->form ); ?>
81 </div>
82 <div class="everest-forms-field-options">
83 <?php do_action( 'everest_forms_builder_fields_options', $this->form ); ?>
84 </div>
85 <?php do_action( 'everest_forms_builder_fields_tab_content', $this->form ); ?>
86 </div>
87 <?php
88 }
89
90 /**
91 * Outputs the builder content.
92 */
93 public function output_content() {
94 ?>
95 <div class="everest-forms-preview-wrap">
96 <div class="everest-forms-preview">
97 <div class="everest-forms-title-desc">
98 <input id= "evf-edit-form-name" type="text" class="everest-forms-form-name everest-forms-name-input" value ="<?php echo isset( $this->form->post_title ) ? esc_html( $this->form->post_title ) : esc_html__( 'Form not found.', 'everest-forms' ); ?>" disabled autocomplete="off" required>
99 <span id="edit-form-name" class = "evf-icon dashicons dashicons-edit"></span>
100 </div>
101 <div class="everest-forms-field-wrap">
102 <?php do_action( 'everest_forms_builder_fields_preview', $this->form ); ?>
103 </div>
104 <?php evf_debug_data( $this->form_data ); ?>
105 </div>
106 </div>
107 <?php
108 }
109
110 /**
111 * Output fields group buttons.
112 */
113 public function output_fields() {
114 $form_fields = evf()->form_fields->form_fields();
115
116 if ( ! empty( $form_fields ) ) {
117 foreach ( $form_fields as $group => $form_field ) {
118 ?>
119 <div class="everest-forms-add-fields-group open">
120 <a href="#" class="everest-forms-add-fields-heading" data-group="<?php echo esc_attr( $group ); ?>"><?php echo esc_html( evf_get_fields_group( $group ) ); ?><i class="handlediv"></i></a>
121 <div class="evf-registered-buttons">
122 <?php
123 foreach ( $form_field as $field ) :
124 $field_plan = isset( $field->plan ) ? $field->plan : '';
125 $addon_slug = isset( $field->addon ) ? $field->addon : '';
126 $field_links = isset( $field->links ) ? json_encode( $field->links ) : '';
127 ?>
128 <button type="button" id="everest-forms-add-fields-<?php echo esc_attr( $field->type ); ?>" class="evf-registered-item <?php echo sanitize_html_class( $field->class ); ?>" data-field-type="<?php echo esc_attr( $field->type ); ?>" data-field-plan="<?php echo esc_attr( $field_plan ); ?>" data-addon-slug="<?php echo esc_attr( $addon_slug ); ?>" data-links="<?php echo esc_attr( $field_links ); ?>">
129 <?php if ( isset( $field->icon ) ) : ?>
130 <i class="<?php echo esc_attr( $field->icon ); ?>"></i>
131 <?php endif; ?>
132 <?php echo esc_html( $field->name ); ?>
133 </button>
134 <?php endforeach; ?>
135 </div>
136 </div>
137 <?php
138 }
139 }
140 }
141
142 /**
143 * Output fields setting options.
144 */
145 public function output_fields_options() {
146 $fields = isset( $this->form_data['form_fields'] ) ? $this->form_data['form_fields'] : array();
147 $recaptcha_type = get_option( 'everest_forms_recaptcha_type', 'v2' );
148 if ( isset( $this->form_data['settings']['recaptcha_support'] ) && '1' === $this->form_data['settings']['recaptcha_support'] ) {
149 if ( 'v2' === $recaptcha_type || 'v3' === $recaptcha_type ) {
150 $recaptcha_type = 'recaptcha';
151 }
152 $fields['IWX5HFxv2j-18'] = array(
153 'id' => 'IWX5HFxv2j-18',
154 'type' => $recaptcha_type,
155 'label' => '',
156 'meta-key' => $recaptcha_type . '_7543',
157 );
158 }
159
160 if ( ! empty( $fields ) ) {
161 foreach ( $fields as $field ) {
162 if ( in_array( $field['type'], evf()->form_fields->get_pro_form_field_types(), true ) ) {
163 continue;
164 }
165
166 $field_option_class = apply_filters(
167 'everest_forms_builder_field_option_class',
168 array(
169 'everest-forms-field-option',
170 'everest-forms-field-option-' . esc_attr( $field['type'] ),
171 ),
172 $field
173 );
174
175 ?>
176 <div class="<?php echo esc_attr( implode( ' ', $field_option_class ) ); ?>" id="everest-forms-field-option-<?php echo esc_attr( $field['id'] ); ?>" data-field-id="<?php echo esc_attr( $field['id'] ); ?>" >
177 <input type="hidden" name="form_fields[<?php echo esc_attr( $field['id'] ); ?>][id]" value="<?php echo esc_attr( $field['id'] ); ?>" class="everest-forms-field-option-hidden-id" />
178 <input type="hidden" name="form_fields[<?php echo esc_attr( $field['id'] ); ?>][type]" value="<?php echo esc_attr( $field['type'] ); ?>" class="everest-forms-field-option-hidden-type" />
179 <?php do_action( 'everest_forms_builder_fields_options_' . $field['type'], $field ); ?>
180 </div>
181 <?php
182 }
183 } else {
184 printf( '<p class="no-fields">%s</p>', esc_html__( 'You don\'t have any fields yet.', 'everest-forms' ) );
185 }
186 }
187
188 /**
189 * Outputs fields preview content.
190 */
191 public function output_fields_preview() {
192 $form_data = $this->form_data;
193 $form_id = absint( $form_data['id'] );
194 $fields = isset( $form_data['form_fields'] ) ? $form_data['form_fields'] : array();
195 $structure = isset( $form_data['structure'] ) ? $form_data['structure'] : array( 'row_1' => array() );
196 $row_ids = array_map(
197 function ( $row_id ) {
198 return str_replace( 'row_', '', $row_id );
199 },
200 array_keys( $structure )
201 );
202
203 /**
204 * BW compatiable for multi-parts form.
205 *
206 * @todo Remove in Major EVF version 1.6.0
207 */
208 if ( defined( 'EVF_MULTI_PART_PLUGIN_FILE' ) ) {
209 include_once ABSPATH . 'wp-admin/includes/plugin.php';
210 $plugin_data = get_plugin_data( EVF_MULTI_PART_PLUGIN_FILE, false, false );
211
212 if ( version_compare( $plugin_data['Version'], '1.3.0', '<' ) ) {
213 $settings_defaults = array(
214 'indicator' => 'progress',
215 'indicator_color' => '#7e3bd0',
216 'nav_align' => 'center',
217 );
218
219 if ( isset( $form_data['settings']['enable_multi_part'] ) && evf_string_to_bool( $form_data['settings']['enable_multi_part'] ) ) {
220 $settings = isset( $form_data['settings']['multi_part'] ) ? $form_data['settings']['multi_part'] : array();
221
222 if ( ! empty( $form_data['multi_part'] ) ) {
223 self::$parts = array(
224 'total' => count( $form_data['multi_part'] ),
225 'current' => 1,
226 'parts' => array_values( $form_data['multi_part'] ),
227 'settings' => wp_parse_args( $settings, $settings_defaults ),
228 );
229 }
230 } else {
231 self::$parts = array(
232 'total' => '',
233 'current' => '',
234 'parts' => array(),
235 'settings' => $settings_defaults,
236 );
237 }
238 }
239 }
240
241 // Allow Multi-Part to be customized.
242 self::$parts[ $form_id ] = apply_filters( 'everest_forms_parts_data', self::$parts, $form_data, $form_id );
243
244 // Output the fields preview.
245 echo '<div class="evf-admin-field-container">';
246 echo '<div class="evf-admin-field-wrapper">';
247
248 /**
249 * Hook: everest_forms_display_builder_fields_before.
250 *
251 * @hooked EverestForms_MultiPart::display_builder_fields_before() Multi-Part markup open.
252 */
253 do_action( 'everest_forms_display_builder_fields_before', $form_data, $form_id );
254 if ( isset( $this->form_data['settings']['recaptcha_support'] ) && '1' === $this->form_data['settings']['recaptcha_support'] ) {
255 $num_rows = count( $structure );
256
257 // Create a new row with the next available row number.
258 $new_row_key = 'row_' . ( $num_rows + 1 );
259 $new_row = array(
260 $new_row_key => array(
261 'grid_1' => array(
262 'IWX5HFxv2j-18',
263 ),
264 ),
265 );
266 $structure = array_merge( $structure, $new_row );
267 }
268
269 foreach ( $structure as $row_id => $row_data ) {
270 $row = str_replace( 'row_', '', $row_id );
271 $row_grid = isset( $form_data['structure'][ 'row_' . $row ] ) ? $form_data['structure'][ 'row_' . $row ] : array();
272 $form_grid = apply_filters( 'everest_forms_default_form_grid', 4 );
273 $total_grid = $form_grid;
274 $active_grid = ( count( $row_grid ) > 0 ) ? count( $row_grid ) : ( isset( $this->form_data['settings']['recaptcha_support'] ) && '1' === $this->form_data['settings']['recaptcha_support'] ? 1 : 2 );
275 $active_grid = $active_grid > $total_grid ? $total_grid : $active_grid;
276
277 /**
278 * Hook: everest_forms_display_row_before.
279 */
280 do_action( 'everest_forms_display_builder_row_before', $row_id, $form_data, $form_id );
281
282 $repeater_field = apply_filters( 'everest_forms_display_repeater_fields', false, $row_grid, $fields );
283
284 echo '<div class="evf-admin-row" data-row-id="' . absint( $row ) . '"' . ( ! empty( $repeater_field ) ? esc_attr( $repeater_field ) : '' ) . '>';
285 echo '<div class="evf-toggle-row">';
286 if ( empty( $repeater_field ) ) {
287 echo '<div class="evf-duplicate-row"><span class="dashicons dashicons-media-default" title="Duplicate Row"></span></div>';
288 echo '<div class="evf-delete-row"><span class="dashicons dashicons-trash" title="Delete Row"></span></div>';
289 echo '<div class="evf-show-grid"><span class="dashicons dashicons-edit" title="Edit"></span></div>';
290 if ( defined( 'EFP_VERSION' ) ) {
291 echo '<div class="evf-row-setting"><span class="dashicons dashicons-admin-settings" title="Row Setting"></span></div>';
292 }
293 }
294 echo '<div class="evf-toggle-row-content">';
295 echo '<span>' . esc_html__( 'Row Settings', 'everest-forms' ) . '</span>';
296 echo '<small>' . esc_html__( 'Select the type of row', 'everest-forms' ) . '</small>';
297 echo '<div class="clear"></div>';
298
299 for ( $grid_active = 1; $grid_active <= $total_grid; $grid_active++ ) {
300 $class = 'evf-grid-selector';
301
302 if ( $grid_active === $active_grid ) {
303 $class .= ' active';
304 }
305
306 echo '<div class="' . esc_attr( $class ) . '" data-evf-grid="' . absint( $grid_active ) . '">';
307
308 $gaps = 15;
309 $width = ( 100 - $gaps ) / $grid_active;
310 $margin = ( $gaps / $grid_active ) / 2;
311
312 for ( $row_icon = 1; $row_icon <= $grid_active; $row_icon++ ) {
313 echo '<span style="width:' . (float) $width . '%; margin-left:' . (float) $margin . '%; margin-right:' . (float) $margin . '%"></span>';
314 }
315
316 echo '</div>';
317 }
318
319 echo '</div>';
320 echo '</div>';
321 echo '<div class="clear evf-clear"></div>';
322
323 $grid_class = 'evf-admin-grid evf-grid-' . ( $active_grid );
324 for ( $grid_start = 1; $grid_start <= $active_grid; $grid_start++ ) {
325 echo '<div class="' . esc_attr( $grid_class ) . ' " data-grid-id="' . absint( $grid_start ) . '">';
326 $grid_fields = isset( $row_grid[ 'grid_' . $grid_start ] ) && is_array( $row_grid[ 'grid_' . $grid_start ] ) ? $row_grid[ 'grid_' . $grid_start ] : ( isset( $this->form_data['settings']['recaptcha_support'] ) && '1' === $this->form_data['settings']['recaptcha_support'] ? array(
327 'IWX5HFxv2j-18',
328 ) : array() );
329 $recaptcha_type = get_option( 'everest_forms_recaptcha_type', 'v2' );
330 if ( isset( $this->form_data['settings']['recaptcha_support'] ) && '1' === $this->form_data['settings']['recaptcha_support'] ) {
331 if ( 'v2' === $recaptcha_type || 'v3' === $recaptcha_type ) {
332 $recaptcha_type = 'recaptcha';
333 }
334 $fields['IWX5HFxv2j-18'] = array(
335 'id' => 'IWX5HFxv2j-18',
336 'type' => $recaptcha_type,
337 'label' => '',
338 'meta-key' => $recaptcha_type . '_7543',
339 );
340 }
341 foreach ( $grid_fields as $field_id ) {
342 if ( isset( $fields[ $field_id ] ) && ! in_array( $fields[ $field_id ]['type'], evf()->form_fields->get_pro_form_field_types(), true ) ) {
343 $this->field_preview( $fields[ $field_id ] );
344 }
345 }
346 echo '</div>';
347 }
348 echo '<div class="clear evf-clear"></div>';
349 echo '</div >';
350
351 /**
352 * Hook: everest_forms_display_builder_row_after.
353 *
354 * @hooked EverestForms_MultiPart::display_builder_row_after() Multi-Part markup (close previous part, open next).
355 */
356 do_action( 'everest_forms_display_builder_row_after', $row_id, $form_data, $form_id );
357 }
358
359 /**
360 * Hook: everest_forms_display_builder_fields_after.
361 *
362 * @hooked EverestForms_MultiPart::display_builder_fields_after() Multi-Part markup open.
363 */
364 do_action( 'everest_forms_display_builder_fields_after', $form_data, $form_id );
365
366 echo '</div>';
367 echo '<div class="clear evf-clear"></div>';
368 if ( defined( 'EVF_REPEATER_FIELDS_VERSION' ) ) {
369 echo '<div class="evf-repeater-row-wrapper">'; // Repeater Row Wrapper starts.
370 }
371
372 echo '<div class="evf-add-row" data-total-rows="' . count( $structure ) . '" data-next-row-id="' . (int) max( $row_ids ) . '"><span class="everest-forms-btn everest-forms-btn-primary dashicons dashicons-plus-alt">' . esc_html__( 'Add Row', 'everest-forms' ) . '</span></div>';
373
374 if ( defined( 'EVF_REPEATER_FIELDS_VERSION' ) ) {
375 echo '<div class="evf-add-row repeater-row" data-total-rows="' . count( $structure ) . '" data-next-row-id="' . (int) max( $row_ids ) . '"><span class="everest-forms-btn everest-forms-btn-primary dashicons dashicons-plus-alt">' . esc_html__( 'Add Repeater Row', 'everest-forms' ) . '</span></div>';
376 echo '</div>'; // Repeater Row Wrapper ends.
377 }
378 echo '</div >';
379 }
380
381 /**
382 * Single Field preview.
383 *
384 * @param array $field Field data and settings.
385 */
386 public function field_preview( $field ) {
387 $css = ! empty( $field['size'] ) ? 'size-' . esc_attr( $field['size'] ) : '';
388 $css .= ! empty( $field['label_hide'] ) && '1' === $field['label_hide'] ? ' label_hide' : '';
389 $css .= ! empty( $field['sublabel_hide'] ) && '1' === $field['sublabel_hide'] ? ' sublabel_hide' : '';
390 $css .= ! empty( $field['required'] ) && '1' === $field['required'] ? ' required' : '';
391 $css .= ! empty( $field['input_columns'] ) && '2' === $field['input_columns'] ? ' everest-forms-list-2-columns' : '';
392 $css .= ! empty( $field['input_columns'] ) && '3' === $field['input_columns'] ? ' everest-forms-list-3-columns' : '';
393 $css .= ! empty( $field['input_columns'] ) && 'inline' === $field['input_columns'] ? ' everest-forms-list-inline' : '';
394 $css = apply_filters( 'everest_forms_field_preview_class', $css, $field );
395 printf( '<div class="everest-forms-field everest-forms-field-%1$s %2$s" id="everest-forms-field-%3$s" data-field-id="%3$s" data-field-type="%4$s">', esc_attr( $field['type'] ), esc_attr( $css ), esc_attr( $field['id'] ), esc_attr( $field['type'] ) );
396 printf( '<div class="evf-field-action">' );
397 if ( 'repeater-fields' !== $field['type'] ) {
398 printf( '<a href="#" class="everest-forms-field-duplicate" title="%s"><span class="dashicons dashicons-media-default"></span></a>', esc_html__( 'Duplicate Field', 'everest-forms' ) );
399 printf( '<a href="#" class="everest-forms-field-delete" title="%s"><span class="dashicons dashicons-trash"></span></a>', esc_html__( 'Delete Field', 'everest-forms' ) );
400 printf( '<a href="#" class="everest-forms-field-setting" title="%s"><span class="dashicons dashicons-admin-generic"></span></a>', esc_html__( 'Settings', 'everest-forms' ) );
401 } else {
402 printf( '<a href="#" class="evf-duplicate-row" title="%s"><span class="dashicons dashicons-media-default"></span></a>', esc_html__( 'Duplicate Repeater', 'everest-forms' ) );
403 printf( '<a href="#" class="evf-delete-row" title="%s"><span class="dashicons dashicons-trash"></span></a>', esc_html__( 'Delete Repeater', 'everest-forms' ) );
404 }
405 printf( '</div>' );
406
407 do_action( 'everest_forms_builder_fields_preview_' . $field['type'], $field );
408
409 echo '</div>';
410 }
411 }
412
413 return new EVF_Builder_Fields();
414