PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.0.0
GiveWP – Donation Plugin and Fundraising Platform v2.0.0
4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / includes / admin / shortcodes / abstract-shortcode-generator.php
give / includes / admin / shortcodes Last commit date
abstract-shortcode-generator.php 8 years ago class-shortcode-button.php 8 years ago shortcode-give-donation-history.php 9 years ago shortcode-give-form.php 9 years ago shortcode-give-goal.php 8 years ago shortcode-give-login.php 9 years ago shortcode-give-profile-editor.php 9 years ago shortcode-give-receipt.php 9 years ago shortcode-give-register.php 9 years ago
abstract-shortcode-generator.php
414 lines
1 <?php
2 /**
3 * Shortcode Dialog Generator abstract class
4 *
5 * @package Give/Admin
6 * @author Paul Ryley
7 * @copyright Copyright (c) 2016, WordImpress
8 * @license https://opensource.org/licenses/gpl-license GNU Public License
9 * @version 1.0
10 * @since 1.3
11 */
12
13 // Exit if accessed directly.
14 if ( ! defined( 'ABSPATH' ) ) {
15 exit;
16 }
17
18 /**
19 * Class Give_Shortcode_Generator
20 */
21 abstract class Give_Shortcode_Generator {
22
23 /**
24 * The current class name
25 *
26 * @since 1.0
27 */
28 public $self;
29
30 /**
31 * The current shortcode
32 *
33 * @since 1.0
34 */
35 public $shortcode;
36
37 /**
38 * The current shortcode tag
39 *
40 * @since 1.0
41 */
42 public $shortcode_tag;
43
44 /**
45 * Shortcode field errors
46 *
47 * @since 1.0
48 */
49 protected $errors;
50
51 /**
52 * Required shortcode fields
53 *
54 * @since 1.0
55 */
56 protected $required;
57
58 /**
59 * Class constructor
60 *
61 * @param string $shortcode The shortcode tag
62 *
63 * @since 1.0
64 */
65 public function __construct( $shortcode ) {
66
67 $this->shortcode_tag = $shortcode;
68
69 add_action( 'admin_init', array( $this, 'init' ) );
70
71 }
72
73 /**
74 * Kick things off for the shortcode generator
75 *
76 * @since 1.3.0.2
77 */
78 public function init() {
79
80 if ( $this->shortcode_tag ) {
81
82 $this->self = get_class( $this );
83
84 $this->errors = array();
85 $this->required = array();
86
87 // Generate the fields, errors, and requirements
88 $fields = $this->get_fields();
89
90 $defaults = array(
91 'btn_close' => esc_html__( 'Close', 'give' ),
92 'btn_okay' => esc_html__( 'Insert Shortcode', 'give' ),
93 'errors' => $this->errors,
94 'fields' => $fields,
95 'label' => '[' . $this->shortcode_tag . ']',
96 'required' => $this->required,
97 'title' => esc_html__( 'Insert Shortcode', 'give' ),
98 );
99
100 if ( user_can_richedit() ) {
101
102 Give_Shortcode_Button::$shortcodes[ $this->shortcode_tag ] = wp_parse_args( $this->shortcode, $defaults );
103
104 }
105 }
106
107 }
108
109
110 /**
111 * Define the shortcode attribute fields
112 *
113 * @return false|array
114 *
115 * @since 1.0
116 */
117 public function define_fields() {
118
119 return false;
120 }
121
122 /**
123 * Generate the shortcode dialog fields
124 *
125 * @param array $defined_fields
126 *
127 * @return array
128 *
129 * @since 1.0
130 */
131 protected function generate_fields( $defined_fields ) {
132
133 $fields = array();
134
135 if ( is_array( $defined_fields ) ) {
136
137 foreach ( $defined_fields as $field ) {
138
139 $defaults = array(
140 'label' => false,
141 'name' => false,
142 'options' => array(),
143 'placeholder' => false,
144 'tooltip' => false,
145 'type' => '',
146 );
147
148 $field = wp_parse_args( (array) $field, $defaults );
149 $method = 'generate_' . strtolower( $field['type'] );
150
151 if ( method_exists( $this, $method ) ) {
152
153 $field = call_user_func( array( $this, $method ), $field );
154
155 if ( $field ) {
156 $fields[] = $field;
157 }
158 }
159 }
160 }
161
162 return $fields;
163 }
164
165 /**
166 * Get the generated shortcode dialog fields
167 *
168 * @return array
169 *
170 * @since 1.0
171 */
172 protected function get_fields() {
173
174 $defined_fields = $this->define_fields();
175 $generated_fields = $this->generate_fields( $defined_fields );
176
177 $errors = array();
178
179 if ( ! empty( $this->errors ) ) {
180 foreach ( $this->required as $name => $alert ) {
181 // Using WordPress function in place of array_column wp_list_pluck as it support older version as well.
182 if ( false === array_search( $name, give_list_pluck( $generated_fields, 'name' ) ) ) {
183
184 $errors[] = $this->errors[ $name ];
185 }
186 }
187
188 $this->errors = $errors;
189 }
190
191 if ( ! empty( $errors ) ) {
192
193 return $errors;
194 }
195
196 return $generated_fields;
197 }
198
199 /**
200 * Generate a TinyMCE container field
201 *
202 * @param array $field
203 *
204 * @return array|false
205 *
206 * @since 1.0
207 */
208 protected function generate_container( $field ) {
209
210 if ( array_key_exists( 'html', $field ) ) {
211
212 return array(
213 'type' => $field['type'],
214 'html' => $field['html'],
215 );
216 }
217
218 return false;
219 }
220
221 /**
222 * Generate a TinyMCE listbox field
223 *
224 * @param array $field
225 *
226 * @return array|false
227 *
228 * @since 1.0
229 */
230 protected function generate_listbox( $field ) {
231
232 $listbox = shortcode_atts( array(
233 'label' => '',
234 'minWidth' => '',
235 'name' => false,
236 'tooltip' => '',
237 'type' => '',
238 'value' => '',
239 'classes' => ''
240 ), $field );
241
242 if ( $this->validate( $field ) ) {
243
244 $new_listbox = array();
245
246 foreach ( $listbox as $key => $value ) {
247
248 if ( $key == 'value' && empty( $value ) ) {
249 $new_listbox[ $key ] = $listbox['name'];
250 } else if ( $value ) {
251 $new_listbox[ $key ] = $value;
252 }
253 }
254
255 // do not reindex array!
256 $field['options'] = array(
257 '' => ( $field['placeholder'] ? $field['placeholder'] : esc_attr__( '- Select -', 'give' ) ),
258 ) + $field['options'];
259
260 foreach ( $field['options'] as $value => $text ) {
261 $new_listbox['values'][] = array(
262 'text' => $text,
263 'value' => $value,
264 );
265 }
266
267 return $new_listbox;
268 }
269
270 return false;
271 }
272
273 /**
274 * Generate a TinyMCE listbox field for a post_type
275 *
276 * @param array $field
277 *
278 * @return array|false
279 *
280 * @since 1.0
281 */
282 protected function generate_post( $field ) {
283
284 $args = array(
285 'post_type' => 'post',
286 'orderby' => 'title',
287 'order' => 'ASC',
288 'posts_per_page' => 30,
289 );
290
291 $args = wp_parse_args( (array) $field['query_args'], $args );
292 $posts = get_posts( $args );
293 $options = array();
294
295 if ( $posts ) {
296 foreach ( $posts as $post ) {
297 $options[ absint( $post->ID ) ] = ( empty( $post->post_title ) ? sprintf( __( 'Untitled (#%s)', 'give' ), $post->ID ) : $post->post_title );
298 }
299
300 $field['type'] = 'listbox';
301 $field['options'] = $options;
302
303 return $this->generate_listbox( $field );
304 }
305
306 // perform validation here before returning false
307 $this->validate( $field );
308
309 return false;
310 }
311
312 /**
313 * Generate a TinyMCE textbox field
314 *
315 * @param array $field
316 *
317 * @return array|false
318 *
319 * @since 1.0
320 */
321 protected function generate_textbox( $field ) {
322
323 $textbox = shortcode_atts( array(
324 'label' => '',
325 'maxLength' => '',
326 'minHeight' => '',
327 'minWidth' => '',
328 'multiline' => false,
329 'name' => false,
330 'tooltip' => '',
331 'type' => '',
332 'value' => '',
333 'classes' => ''
334 ), $field );
335
336 if ( $this->validate( $field ) ) {
337 return array_filter( $textbox, array( $this, 'return_textbox_value' ) );
338 }
339
340 return false;
341 }
342
343 /**
344 * Validate Textbox Value
345 *
346 * @param $value
347 *
348 * @return bool
349 */
350 function return_textbox_value( $value ) {
351 return $value !== '';
352 }
353
354 /**
355 * Perform validation for a single field
356 *
357 * Returns true or false depending on whether the field has a 'name' attribute.
358 * This method also populates the shortcode's $errors and $required arrays.
359 *
360 * @param array $field
361 *
362 * @return bool
363 *
364 * @since 1.0
365 */
366 protected function validate( $field ) {
367
368 extract( shortcode_atts(
369 array(
370 'name' => false,
371 'required' => false,
372 'label' => '',
373 ), $field )
374 );
375
376 if ( $name ) {
377
378 if ( isset( $required['error'] ) ) {
379
380 $error = array(
381 'type' => 'container',
382 'html' => $required['error'],
383 );
384
385 $this->errors[ $name ] = $this->generate_container( $error );
386 }
387
388 if ( ! ! $required || is_array( $required ) ) {
389
390 $alert = esc_html__( 'Some of the shortcode options are required.', 'give' );
391
392 if ( isset( $required['alert'] ) ) {
393
394 $alert = $required['alert'];
395
396 } else if ( ! empty( $label ) ) {
397
398 $alert = sprintf(
399 /* translators: %s: option label */
400 esc_html__( 'The "%s" option is required.', 'give' ),
401 str_replace( ':', '', $label )
402 );
403 }
404
405 $this->required[ $name ] = $alert;
406 }
407
408 return true;
409 }
410
411 return false;
412 }
413 }
414