PluginProbe ʕ •ᴥ•ʔ
Everest Forms – Contact Form, Payment Form, Quiz, Survey & Custom Form Builder with AI / 2.0.0
Everest Forms – Contact Form, Payment Form, Quiz, Survey & Custom Form Builder with AI v2.0.0
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 3 years ago class-evf-builder-page.php 3 years ago class-evf-builder-settings.php 3 years ago
class-evf-builder-fields.php
370 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 foreach ( $form_field as $field ) : ?>
123 <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 ); ?>">
124 <?php if ( isset( $field->icon ) ) : ?>
125 <i class="<?php echo esc_attr( $field->icon ); ?>"></i>
126 <?php endif; ?>
127 <?php echo esc_html( $field->name ); ?>
128 </button>
129 <?php endforeach; ?>
130 </div>
131 </div>
132 <?php
133 }
134 }
135 }
136
137 /**
138 * Output fields setting options.
139 */
140 public function output_fields_options() {
141 $fields = isset( $this->form_data['form_fields'] ) ? $this->form_data['form_fields'] : array();
142
143 if ( ! empty( $fields ) ) {
144 foreach ( $fields as $field ) {
145 if ( in_array( $field['type'], evf()->form_fields->get_pro_form_field_types(), true ) ) {
146 continue;
147 }
148
149 $field_option_class = apply_filters(
150 'everest_forms_builder_field_option_class',
151 array(
152 'everest-forms-field-option',
153 'everest-forms-field-option-' . esc_attr( $field['type'] ),
154 ),
155 $field
156 );
157
158 ?>
159 <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'] ); ?>" >
160 <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" />
161 <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" />
162 <?php do_action( 'everest_forms_builder_fields_options_' . $field['type'], $field ); ?>
163 </div>
164 <?php
165 }
166 } else {
167 printf( '<p class="no-fields">%s</p>', esc_html__( 'You don\'t have any fields yet.', 'everest-forms' ) );
168 }
169 }
170
171 /**
172 * Outputs fields preview content.
173 */
174 public function output_fields_preview() {
175 $form_data = $this->form_data;
176 $form_id = absint( $form_data['id'] );
177 $fields = isset( $form_data['form_fields'] ) ? $form_data['form_fields'] : array();
178 $structure = isset( $form_data['structure'] ) ? $form_data['structure'] : array( 'row_1' => array() );
179 $row_ids = array_map(
180 function( $row_id ) {
181 return str_replace( 'row_', '', $row_id );
182 },
183 array_keys( $structure )
184 );
185
186 /**
187 * BW compatiable for multi-parts form.
188 *
189 * @todo Remove in Major EVF version 1.6.0
190 */
191 if ( defined( 'EVF_MULTI_PART_PLUGIN_FILE' ) ) {
192 include_once ABSPATH . 'wp-admin/includes/plugin.php';
193 $plugin_data = get_plugin_data( EVF_MULTI_PART_PLUGIN_FILE, false, false );
194
195 if ( version_compare( $plugin_data['Version'], '1.3.0', '<' ) ) {
196 $settings_defaults = array(
197 'indicator' => 'progress',
198 'indicator_color' => '#7e3bd0',
199 'nav_align' => 'center',
200 );
201
202 if ( isset( $form_data['settings']['enable_multi_part'] ) && evf_string_to_bool( $form_data['settings']['enable_multi_part'] ) ) {
203 $settings = isset( $form_data['settings']['multi_part'] ) ? $form_data['settings']['multi_part'] : array();
204
205 if ( ! empty( $form_data['multi_part'] ) ) {
206 self::$parts = array(
207 'total' => count( $form_data['multi_part'] ),
208 'current' => 1,
209 'parts' => array_values( $form_data['multi_part'] ),
210 'settings' => wp_parse_args( $settings, $settings_defaults ),
211 );
212 }
213 } else {
214 self::$parts = array(
215 'total' => '',
216 'current' => '',
217 'parts' => array(),
218 'settings' => $settings_defaults,
219 );
220 }
221 }
222 }
223
224 // Allow Multi-Part to be customized.
225 self::$parts[ $form_id ] = apply_filters( 'everest_forms_parts_data', self::$parts, $form_data, $form_id );
226
227 // Output the fields preview.
228 echo '<div class="evf-admin-field-container">';
229 echo '<div class="evf-admin-field-wrapper">';
230
231 /**
232 * Hook: everest_forms_display_builder_fields_before.
233 *
234 * @hooked EverestForms_MultiPart::display_builder_fields_before() Multi-Part markup open.
235 */
236 do_action( 'everest_forms_display_builder_fields_before', $form_data, $form_id );
237
238 foreach ( $structure as $row_id => $row_data ) {
239 $row = str_replace( 'row_', '', $row_id );
240 $row_grid = isset( $form_data['structure'][ 'row_' . $row ] ) ? $form_data['structure'][ 'row_' . $row ] : array();
241 $form_grid = apply_filters( 'everest_forms_default_form_grid', 4 );
242 $total_grid = $form_grid;
243 $active_grid = count( $row_grid ) > 0 ? count( $row_grid ) : 2;
244 $active_grid = $active_grid > $total_grid ? $total_grid : $active_grid;
245
246 /**
247 * Hook: everest_forms_display_row_before.
248 */
249 do_action( 'everest_forms_display_builder_row_before', $row_id, $form_data, $form_id );
250
251 $repeater_field = apply_filters( 'everest_forms_display_repeater_fields', false, $row_grid, $fields );
252
253 echo '<div class="evf-admin-row" data-row-id="' . absint( $row ) . '"' . ( ! empty( $repeater_field ) ? esc_attr( $repeater_field ) : '' ) . '>';
254 echo '<div class="evf-toggle-row">';
255 if ( empty( $repeater_field ) ) {
256 echo '<div class="evf-duplicate-row"><span class="dashicons dashicons-media-default" title="Duplicate Row"></span></div>';
257 echo '<div class="evf-delete-row"><span class="dashicons dashicons-trash" title="Delete Row"></span></div>';
258 echo '<div class="evf-show-grid"><span class="dashicons dashicons-edit" title="Edit"></span></div>';
259 if ( defined( 'EFP_VERSION' ) ) {
260 echo '<div class="evf-row-setting"><span class="dashicons dashicons-admin-settings" title="Row Setting"></span></div>';
261 }
262 }
263 echo '<div class="evf-toggle-row-content">';
264 echo '<span>' . esc_html__( 'Row Settings', 'everest-forms' ) . '</span>';
265 echo '<small>' . esc_html__( 'Select the type of row', 'everest-forms' ) . '</small>';
266 echo '<div class="clear"></div>';
267
268 for ( $grid_active = 1; $grid_active <= $total_grid; $grid_active ++ ) {
269 $class = 'evf-grid-selector';
270
271 if ( $grid_active === $active_grid ) {
272 $class .= ' active';
273 }
274
275 echo '<div class="' . esc_attr( $class ) . '" data-evf-grid="' . absint( $grid_active ) . '">';
276
277 $gaps = 15;
278 $width = ( 100 - $gaps ) / $grid_active;
279 $margin = ( $gaps / $grid_active ) / 2;
280
281 for ( $row_icon = 1; $row_icon <= $grid_active; $row_icon ++ ) {
282 echo '<span style="width:' . (float) $width . '%; margin-left:' . (float) $margin . '%; margin-right:' . (float) $margin . '%"></span>';
283 }
284
285 echo '</div>';
286 }
287
288 echo '</div>';
289 echo '</div>';
290 echo '<div class="clear evf-clear"></div>';
291
292 $grid_class = 'evf-admin-grid evf-grid-' . ( $active_grid );
293 for ( $grid_start = 1; $grid_start <= $active_grid; $grid_start ++ ) {
294 echo '<div class="' . esc_attr( $grid_class ) . ' " data-grid-id="' . absint( $grid_start ) . '">';
295 $grid_fields = isset( $row_grid[ 'grid_' . $grid_start ] ) && is_array( $row_grid[ 'grid_' . $grid_start ] ) ? $row_grid[ 'grid_' . $grid_start ] : array();
296 foreach ( $grid_fields as $field_id ) {
297 if ( isset( $fields[ $field_id ] ) && ! in_array( $fields[ $field_id ]['type'], evf()->form_fields->get_pro_form_field_types(), true ) ) {
298 $this->field_preview( $fields[ $field_id ] );
299 }
300 }
301 echo '</div>';
302 }
303 echo '<div class="clear evf-clear"></div>';
304 echo '</div >';
305
306 /**
307 * Hook: everest_forms_display_builder_row_after.
308 *
309 * @hooked EverestForms_MultiPart::display_builder_row_after() Multi-Part markup (close previous part, open next).
310 */
311 do_action( 'everest_forms_display_builder_row_after', $row_id, $form_data, $form_id );
312 }
313
314 /**
315 * Hook: everest_forms_display_builder_fields_after.
316 *
317 * @hooked EverestForms_MultiPart::display_builder_fields_after() Multi-Part markup open.
318 */
319 do_action( 'everest_forms_display_builder_fields_after', $form_data, $form_id );
320
321 echo '</div>';
322 echo '<div class="clear evf-clear"></div>';
323 if ( defined( 'EVF_REPEATER_FIELDS_VERSION' ) ) {
324 echo '<div class="evf-repeater-row-wrapper">'; // Repeater Row Wrapper starts.
325 }
326
327 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>';
328
329 if ( defined( 'EVF_REPEATER_FIELDS_VERSION' ) ) {
330 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>';
331 echo '</div>'; // Repeater Row Wrapper ends.
332 }
333 echo '</div >';
334 }
335
336 /**
337 * Single Field preview.
338 *
339 * @param array $field Field data and settings.
340 */
341 public function field_preview( $field ) {
342 $css = ! empty( $field['size'] ) ? 'size-' . esc_attr( $field['size'] ) : '';
343 $css .= ! empty( $field['label_hide'] ) && '1' === $field['label_hide'] ? ' label_hide' : '';
344 $css .= ! empty( $field['sublabel_hide'] ) && '1' === $field['sublabel_hide'] ? ' sublabel_hide' : '';
345 $css .= ! empty( $field['required'] ) && '1' === $field['required'] ? ' required' : '';
346 $css .= ! empty( $field['input_columns'] ) && '2' === $field['input_columns'] ? ' everest-forms-list-2-columns' : '';
347 $css .= ! empty( $field['input_columns'] ) && '3' === $field['input_columns'] ? ' everest-forms-list-3-columns' : '';
348 $css .= ! empty( $field['input_columns'] ) && 'inline' === $field['input_columns'] ? ' everest-forms-list-inline' : '';
349 $css = apply_filters( 'everest_forms_field_preview_class', $css, $field );
350
351 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'] ) );
352 printf( '<div class="evf-field-action">' );
353 if ( 'repeater-fields' !== $field['type'] ) {
354 printf( '<a href="#" class="everest-forms-field-duplicate" title="%s"><span class="dashicons dashicons-media-default"></span></a>', esc_html__( 'Duplicate Field', 'everest-forms' ) );
355 printf( '<a href="#" class="everest-forms-field-delete" title="%s"><span class="dashicons dashicons-trash"></span></a>', esc_html__( 'Delete Field', 'everest-forms' ) );
356 printf( '<a href="#" class="everest-forms-field-setting" title="%s"><span class="dashicons dashicons-admin-generic"></span></a>', esc_html__( 'Settings', 'everest-forms' ) );
357 } else {
358 printf( '<a href="#" class="evf-duplicate-row" title="%s"><span class="dashicons dashicons-media-default"></span></a>', esc_html__( 'Duplicate Repeater', 'everest-forms' ) );
359 printf( '<a href="#" class="evf-delete-row" title="%s"><span class="dashicons dashicons-trash"></span></a>', esc_html__( 'Delete Repeater', 'everest-forms' ) );
360 }
361 printf( '</div>' );
362
363 do_action( 'everest_forms_builder_fields_preview_' . $field['type'], $field );
364
365 echo '</div>';
366 }
367 }
368
369 return new EVF_Builder_Fields();
370