PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.26
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.26
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.26, at classes/models/FrmTableHTMLGenerator.php

461 lines 9.3 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
187 $this->table_style = ' style="' . esc_attr( 'border-spacing:0;font-size:' . $this->style_settings['font_size'] . ';line-height:135%;' );
188 $this->table_style .= esc_attr( 'border-bottom:' . $this->style_settings['border_width'] . ' solid ' . $this->style_settings['border_color'] . ';' ) . '"';
189
190 }
191
192 if ( ! empty( $this->style_settings['class'] ) ) {
193 $this->table_style .= ' class="' . esc_attr( $this->style_settings['class'] ) . '"';
194 }
195
196 if ( ! empty( $this->width ) ) {
197 $this->table_style .= ' width="' . esc_attr( $this->width ) . '"';
198 }
199 }
200
201 /**
202 * Set the td_style property
203 *
204 * @since 2.04
205 *
206 * @return void
207 */
208 private function init_td_style() {
209 if ( $this->use_inline_style === true ) {
210
211 $td_style_attributes = 'text-align:' . ( $this->direction === 'rtl' ? 'right' : 'left' ) . ';';
212 $td_style_attributes .= 'color:' . $this->style_settings['text_color'] . ';padding:' . $this->cell_padding . ';vertical-align:top;';
213 $td_style_attributes .= 'border-top:' . $this->style_settings['border_width'] . ' solid ' . $this->style_settings['border_color'] . ';';
214
215 $this->td_style = ' style="' . esc_attr( $td_style_attributes ) . '"';
216 }
217 }
218
219 /**
220 * Removes border CSS from HTML.
221 *
222 * @since 6.25
223 *
224 * @param string $html The HTML.
225 * @param string $position The border position. Default is `top`.
226 *
227 * @return string
228 */
229 public function remove_border( $html, $position = 'top' ) {
230 $search = sprintf(
231 'border-%1$s:%2$s solid %3$s;',
232 $position,
233 $this->style_settings['border_width'],
234 $this->style_settings['border_color']
235 );
236
237 return str_replace( $search, '', $html );
238 }
239
240 /**
241 * Determine if setting is for a color, e.g. text color, background color, or border color
242 *
243 * @since 2.05
244 *
245 * @param string $setting_key Name of setting.
246 *
247 * @return bool
248 */
249 private function is_color_setting( $setting_key ) {
250 return strpos( $setting_key, 'color' ) !== false;
251 }
252
253 /**
254 * Get color markup from color setting value
255 *
256 * @since 2.05
257 *
258 * @param string $color_markup value of a color setting, with format #FFFFF, FFFFFF, or white.
259 *
260 * @return string
261 */
262 private function get_color_markup( $color_markup ) {
263 $color_markup = trim( $color_markup );
264
265 // Check if each character in string is valid hex digit
266 if ( FrmAppHelper::ctype_xdigit( $color_markup ) ) {
267 $color_markup = '#' . $color_markup;
268 }
269
270 return $color_markup;
271 }
272
273 /**
274 * Get the table row background color
275 *
276 * @since 2.04
277 *
278 * @return string
279 */
280 private function table_row_background_color() {
281 return ( $this->odd ? $this->style_settings['bg_color'] : $this->style_settings['alt_bg_color'] );
282 }
283
284 /**
285 * Get the table row style
286 *
287 * @since 2.04
288 * @since 5.0.16 Changed scope from `private` to `protected`.
289 * @since 6.25 Changed scope from `protected` to `public`.
290 *
291 * @return string
292 */
293 public function tr_style() {
294
295 if ( $this->type === 'shortcode' ) {
296 $tr_style = ' style="[frm-alt-color]"';
297 } elseif ( $this->use_inline_style ) {
298 $tr_style = ' style="background-color:' . $this->table_row_background_color() . ';"';
299 } else {
300 $tr_style = '';
301 }
302
303 return $tr_style;
304 }
305
306 /**
307 * Gets table style.
308 *
309 * @since 6.25
310 *
311 * @return string
312 */
313 public function get_table_style() {
314 return $this->table_style;
315 }
316
317 /**
318 * Gets td style.
319 *
320 * @since 6.25
321 *
322 * @return string
323 */
324 public function get_td_style() {
325 return $this->td_style;
326 }
327
328 /**
329 * Switch the odd property from true to false or false to true
330 *
331 * @since 2.04
332 * @since 5.0.16 Changed scope from `private` to `protected`.
333 *
334 * @return void
335 */
336 protected function switch_odd() {
337 if ( $this->type !== 'shortcode' ) {
338 $this->odd = ! $this->odd;
339 }
340 }
341
342 /**
343 * Generate a table header
344 *
345 * @since 2.04
346 *
347 * @return string
348 */
349 public function generate_table_header() {
350 return '<table cellspacing="0"' . $this->table_style . '><tbody>' . "\r\n";
351 }
352
353 /**
354 * Generate a table footer
355 *
356 * @since 2.04
357 *
358 * @return string
359 */
360 public function generate_table_footer() {
361 return '</tbody></table>';
362 }
363
364 /**
365 * Generate a two cell row for an HTML table
366 *
367 * @since 2.04
368 *
369 * @param string $label The label.
370 * @param string $value The value.
371 * @param array $args Additional arguments. May include "field_type" string.
372 *
373 * @return string
374 */
375 public function generate_two_cell_table_row( $label, $value, $args = array() ) {
376 $row = '<tr' . $this->tr_style();
377 $row .= $this->add_row_class( $value === '' );
378 $row .= '>';
379
380 $label = '<th scope="row"' . $this->td_style . '>' . wp_kses_post( $label ) . '</th>';
381 $value = '<td' . $this->td_style . '>' . $this->filter_value_for_display( $value, $args ) . '</td>';
382
383 if ( 'rtl' == $this->direction ) {
384 $row .= $value;
385 $row .= $label;
386 } else {
387 $row .= $label;
388 $row .= $value;
389 }
390
391 $row .= '</tr>' . "\r\n";
392
393 $this->switch_odd();
394
395 return $row;
396 }
397
398 /**
399 * @param string $value
400 * @param array $args
401 *
402 * @return string
403 */
404 private function filter_value_for_display( $value, $args ) {
405 if ( empty( $args['field_type'] ) ) {
406 return wp_kses_post( $value );
407 }
408
409 $field_object = FrmFieldFactory::get_field_type( $args['field_type'] );
410 return $field_object->filter_value_for_table_html( $value );
411 }
412
413 /**
414 * Generate a single cell row for an HTML table
415 *
416 * @since 2.04
417 *
418 * @param string $value
419 *
420 * @return string
421 */
422 public function generate_single_cell_table_row( $value ) {
423 $row = '<tr' . $this->tr_style();
424 $row .= $this->add_row_class();
425 $row .= '>';
426 $row .= '<td colspan="2"' . $this->td_style . '>' . $value . '</td>';
427 $row .= '</tr>' . "\r\n";
428
429 $this->switch_odd();
430
431 return $row;
432 }
433
434 /**
435 * Add classes to the tr.
436 *
437 * @since 5.4.2
438 *
439 * @param bool $empty If the value in the row is blank.
440 *
441 * @return string
442 */
443 protected function add_row_class( $empty = false ) {
444 $class = '';
445
446 if ( $empty ) {
447 // Only add this class on two cell rows.
448 $class .= ' frm-empty-row';
449 }
450
451 if ( $this->is_child ) {
452 $class .= ' frm-child-row';
453 }
454
455 if ( $class ) {
456 $class = ' class="' . trim( $class ) . '"';
457 }
458 return $class;
459 }
460 }
461