PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.27
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.27
6.35 6.34 6.33.1 6.33 6.32.1 6.32 6.31 6.25 6.25.1 6.26 6.26.1 6.27 6.28 6.29 6.3 6.3.1 6.3.2 6.30 6.4 6.4.1 6.4.2 6.5 6.5.1 6.5.2 6.5.3 All 141 releases
formidable / classes / models / FrmTableHTMLGenerator.php

FrmTableHTMLGenerator.php in Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More 6.27, at classes/models/FrmTableHTMLGenerator.php

457 lines 9.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 if ( ! defined( 'ABSPATH' ) ) {
3 die( 'You are not allowed to call this page directly.' );
4 }
5
6 /**
7 * @since 2.04
8 */
9 class FrmTableHTMLGenerator {
10
11 /**
12 * @var string
13 *
14 * @since 2.04
15 */
16 private $type = '';
17
18 /**
19 * @var array
20 *
21 * @since 2.04
22 */
23 private $style_settings = array();
24
25 /**
26 * @var bool
27 *
28 * @since 2.04
29 */
30 private $use_inline_style = true;
31
32 /**
33 * @var string
34 *
35 * @since 2.04
36 * @since 5.0.16 Changed scope from `private` to `protected`.
37 */
38 protected $direction = 'ltr';
39
40 /**
41 * @var bool
42 *
43 * @since 2.04
44 */
45 private $odd = true;
46
47 /**
48 * @var string
49 *
50 * @since 2.04
51 * @since 5.0.16 Changed scope from `private` to `protected`.
52 */
53 protected $table_style = '';
54
55 /**
56 * @var string
57 *
58 * @since 2.04
59 * @since 5.0.16 Changed scope from `private` to `protected`.
60 */
61 protected $td_style = '';
62
63 /**
64 * Cell padding.
65 *
66 * @since 6.25
67 *
68 * @var string
69 */
70 protected $cell_padding = '7px 9px';
71
72 /**
73 * Table width.
74 *
75 * @since 6.25
76 *
77 * @var string
78 */
79 protected $width = '';
80
81 /**
82 * Used to add a class in tables. Set in Pro.
83 *
84 * @var bool
85 *
86 * @since 5.4.2
87 */
88 public $is_child = false;
89
90 /**
91 * FrmTableHTMLGenerator constructor.
92 *
93 * @param string $type
94 * @param array $atts
95 */
96 public function __construct( $type, $atts = array() ) {
97 $this->type = $type;
98
99 if ( isset( $atts['cell_padding'] ) ) {
100 $this->cell_padding = $atts['cell_padding'];
101 }
102
103 if ( isset( $atts['width'] ) ) {
104 $this->width = $atts['width'];
105 }
106
107 $this->init_style_settings( $atts );
108 $this->init_use_inline_style( $atts );
109 $this->init_direction( $atts );
110 $this->init_table_style();
111 $this->init_td_style();
112 }
113
114 /**
115 * Set the style_settings property
116 *
117 * @since 2.04
118 *
119 * @param array $atts
120 *
121 * @return void
122 */
123 private function init_style_settings( $atts ) {
124 $style_settings = array(
125 'border_color' => 'dddddd',
126 'bg_color' => 'f7f7f7',
127 'text_color' => '444444',
128 'font_size' => '12px',
129 'border_width' => '1px',
130 'alt_bg_color' => 'ffffff',
131 );
132 $this->style_settings = apply_filters( 'frm_show_entry_styles', $style_settings );
133
134 foreach ( $this->style_settings as $key => $setting ) {
135 if ( isset( $atts[ $key ] ) && $atts[ $key ] !== '' ) {
136 $this->style_settings[ $key ] = $atts[ $key ];
137 }
138
139 if ( $this->is_color_setting( $key ) ) {
140 $this->style_settings[ $key ] = $this->get_color_markup( $this->style_settings[ $key ] );
141 }
142 }
143
144 $this->style_settings['class'] = $atts['class'] ?? '';
145 }
146
147 /**
148 * Set the use_inline_style property
149 *
150 * @since 2.04
151 *
152 * @param array $atts
153 *
154 * @return void
155 */
156 private function init_use_inline_style( $atts ) {
157 if ( isset( $atts['inline_style'] ) && ! $atts['inline_style'] ) {
158 $this->use_inline_style = false;
159 }
160 }
161
162 /**
163 * Set the direction property
164 *
165 * @since 2.04
166 *
167 * @param array $atts
168 *
169 * @return void
170 */
171 private function init_direction( $atts ) {
172 if ( isset( $atts['direction'] ) && $atts['direction'] === 'rtl' ) {
173 $this->direction = 'rtl';
174 }
175 }
176
177 /**
178 * Set the table_style property
179 *
180 * @since 2.04
181 *
182 * @return void
183 */
184 private function init_table_style() {
185 if ( $this->use_inline_style === true ) {
186 $this->table_style = ' style="' . esc_attr( 'border-spacing:0;font-size:' . $this->style_settings['font_size'] . ';line-height:135%;' );
187 $this->table_style .= esc_attr( 'border-bottom:' . $this->style_settings['border_width'] . ' solid ' . $this->style_settings['border_color'] . ';' ) . '"';
188 }
189
190 if ( ! empty( $this->style_settings['class'] ) ) {
191 $this->table_style .= ' class="' . esc_attr( $this->style_settings['class'] ) . '"';
192 }
193
194 if ( ! empty( $this->width ) ) {
195 $this->table_style .= ' width="' . esc_attr( $this->width ) . '"';
196 }
197 }
198
199 /**
200 * Set the td_style property
201 *
202 * @since 2.04
203 *
204 * @return void
205 */
206 private function init_td_style() {
207 if ( $this->use_inline_style === true ) {
208 $td_style_attributes = 'text-align:' . ( $this->direction === 'rtl' ? 'right' : 'left' ) . ';';
209 $td_style_attributes .= 'color:' . $this->style_settings['text_color'] . ';padding:' . $this->cell_padding . ';vertical-align:top;';
210 $td_style_attributes .= 'border-top:' . $this->style_settings['border_width'] . ' solid ' . $this->style_settings['border_color'] . ';';
211
212 $this->td_style = ' style="' . esc_attr( $td_style_attributes ) . '"';
213 }
214 }
215
216 /**
217 * Removes border CSS from HTML.
218 *
219 * @since 6.25
220 *
221 * @param string $html The HTML.
222 * @param string $position The border position. Default is `top`.
223 *
224 * @return string
225 */
226 public function remove_border( $html, $position = 'top' ) {
227 $search = sprintf(
228 'border-%1$s:%2$s solid %3$s;',
229 $position,
230 $this->style_settings['border_width'],
231 $this->style_settings['border_color']
232 );
233
234 return str_replace( $search, '', $html );
235 }
236
237 /**
238 * Determine if setting is for a color, e.g. text color, background color, or border color
239 *
240 * @since 2.05
241 *
242 * @param string $setting_key Name of setting.
243 *
244 * @return bool
245 */
246 private function is_color_setting( $setting_key ) {
247 return str_contains( $setting_key, 'color' );
248 }
249
250 /**
251 * Get color markup from color setting value
252 *
253 * @since 2.05
254 *
255 * @param string $color_markup value of a color setting, with format #FFFFF, FFFFFF, or white.
256 *
257 * @return string
258 */
259 private function get_color_markup( $color_markup ) {
260 $color_markup = trim( $color_markup );
261
262 // Check if each character in string is valid hex digit
263 if ( FrmAppHelper::ctype_xdigit( $color_markup ) ) {
264 $color_markup = '#' . $color_markup;
265 }
266
267 return $color_markup;
268 }
269
270 /**
271 * Get the table row background color
272 *
273 * @since 2.04
274 *
275 * @return string
276 */
277 private function table_row_background_color() {
278 return $this->odd ? $this->style_settings['bg_color'] : $this->style_settings['alt_bg_color'];
279 }
280
281 /**
282 * Get the table row style
283 *
284 * @since 2.04
285 * @since 5.0.16 Changed scope from `private` to `protected`.
286 * @since 6.25 Changed scope from `protected` to `public`.
287 *
288 * @return string
289 */
290 public function tr_style() {
291 if ( $this->type === 'shortcode' ) {
292 $tr_style = ' style="[frm-alt-color]"';
293 } elseif ( $this->use_inline_style ) {
294 $tr_style = ' style="background-color:' . $this->table_row_background_color() . ';"';
295 } else {
296 $tr_style = '';
297 }
298
299 return $tr_style;
300 }
301
302 /**
303 * Gets table style.
304 *
305 * @since 6.25
306 *
307 * @return string
308 */
309 public function get_table_style() {
310 return $this->table_style;
311 }
312
313 /**
314 * Gets td style.
315 *
316 * @since 6.25
317 *
318 * @return string
319 */
320 public function get_td_style() {
321 return $this->td_style;
322 }
323
324 /**
325 * Switch the odd property from true to false or false to true
326 *
327 * @since 2.04
328 * @since 5.0.16 Changed scope from `private` to `protected`.
329 *
330 * @return void
331 */
332 protected function switch_odd() {
333 if ( $this->type !== 'shortcode' ) {
334 $this->odd = ! $this->odd;
335 }
336 }
337
338 /**
339 * Generate a table header
340 *
341 * @since 2.04
342 *
343 * @return string
344 */
345 public function generate_table_header() {
346 return '<table cellspacing="0"' . $this->table_style . '><tbody>' . "\r\n";
347 }
348
349 /**
350 * Generate a table footer
351 *
352 * @since 2.04
353 *
354 * @return string
355 */
356 public function generate_table_footer() {
357 return '</tbody></table>';
358 }
359
360 /**
361 * Generate a two cell row for an HTML table
362 *
363 * @since 2.04
364 *
365 * @param string $label The label.
366 * @param string $value The value.
367 * @param array $args Additional arguments. May include "field_type" string.
368 *
369 * @return string
370 */
371 public function generate_two_cell_table_row( $label, $value, $args = array() ) {
372 $row = '<tr' . $this->tr_style();
373 $row .= $this->add_row_class( $value === '' );
374 $row .= '>';
375 $label = '<th scope="row"' . $this->td_style . '>' . wp_kses_post( $label ) . '</th>';
376 $value = '<td' . $this->td_style . '>' . $this->filter_value_for_display( $value, $args ) . '</td>';
377
378 if ( 'rtl' === $this->direction ) {
379 $row .= $value;
380 $row .= $label;
381 } else {
382 $row .= $label;
383 $row .= $value;
384 }
385
386 $row .= '</tr>' . "\r\n";
387
388 $this->switch_odd();
389
390 return $row;
391 }
392
393 /**
394 * @param string $value
395 * @param array $args
396 *
397 * @return string
398 */
399 private function filter_value_for_display( $value, $args ) {
400 if ( empty( $args['field_type'] ) ) {
401 return wp_kses_post( $value );
402 }
403
404 $field_object = FrmFieldFactory::get_field_type( $args['field_type'] );
405 return $field_object->filter_value_for_table_html( $value );
406 }
407
408 /**
409 * Generate a single cell row for an HTML table
410 *
411 * @since 2.04
412 *
413 * @param string $value
414 *
415 * @return string
416 */
417 public function generate_single_cell_table_row( $value ) {
418 $row = '<tr' . $this->tr_style();
419 $row .= $this->add_row_class();
420 $row .= '>';
421 $row .= '<td colspan="2"' . $this->td_style . '>' . $value . '</td>';
422 $row .= '</tr>' . "\r\n";
423
424 $this->switch_odd();
425
426 return $row;
427 }
428
429 /**
430 * Add classes to the tr.
431 *
432 * @since 5.4.2
433 *
434 * @param bool $empty If the value in the row is blank.
435 *
436 * @return string
437 */
438 protected function add_row_class( $empty = false ) {
439 $class = '';
440
441 if ( $empty ) {
442 // Only add this class on two cell rows.
443 $class .= ' frm-empty-row';
444 }
445
446 if ( $this->is_child ) {
447 $class .= ' frm-child-row';
448 }
449
450 if ( $class ) {
451 $class = ' class="' . trim( $class ) . '"';
452 }
453
454 return $class;
455 }
456 }
457