PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.2.2
GiveWP – Donation Plugin and Fundraising Platform v2.2.2
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 admin-shortcodes.js 7 years ago class-shortcode-button.php 7 years ago mce-plugin.js 8 years ago shortcode-give-donation-grid.php 7 years ago shortcode-give-donation-history.php 8 years ago shortcode-give-donor-wall.php 7 years ago shortcode-give-form.php 8 years ago shortcode-give-goal.php 8 years ago shortcode-give-login.php 8 years ago shortcode-give-profile-editor.php 8 years ago shortcode-give-receipt.php 8 years ago shortcode-give-register.php 8 years ago shortcode-give-totals.php 8 years ago
abstract-shortcode-generator.php
424 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 'suppress_filters' => false,
290 );
291
292 $args = wp_parse_args( (array) $field['query_args'], $args );
293
294 $posts = get_posts( $args );
295 $options = array();
296
297 if ( ! empty( $posts ) ) {
298 foreach ( $posts as $post ) {
299 $options[ absint( $post->ID ) ] = empty( $post->post_title )
300 ? sprintf( __( 'Untitled (#%s)', 'give' ), $post->ID )
301 : apply_filters( 'the_title', $post->post_title );
302 }
303
304 $field['type'] = 'listbox';
305 $field['options'] = $options;
306
307 return $this->generate_listbox( $field );
308 }
309
310 // perform validation here before returning false
311 $this->validate( $field );
312
313 return false;
314 }
315
316 /**
317 * Generate a TinyMCE textbox field
318 *
319 * @param array $field
320 *
321 * @return array|false
322 *
323 * @since 1.0
324 */
325 protected function generate_textbox( $field ) {
326
327 $textbox = shortcode_atts( array(
328 'label' => '',
329 'maxLength' => '',
330 'minHeight' => '',
331 'minWidth' => '',
332 'multiline' => false,
333 'name' => false,
334 'tooltip' => '',
335 'type' => '',
336 'value' => '',
337 'classes' => '',
338 'placeholder' => ''
339 ), $field );
340
341 // Remove empty placeholder.
342 if( empty( $textbox['placeholder'] ) ) {
343 unset( $textbox['placeholder'] );
344 }
345
346 if ( $this->validate( $field ) ) {
347 return array_filter( $textbox, array( $this, 'return_textbox_value' ) );
348 }
349
350 return false;
351 }
352
353 /**
354 * Validate Textbox Value
355 *
356 * @param $value
357 *
358 * @return bool
359 */
360 function return_textbox_value( $value ) {
361 return $value !== '';
362 }
363
364 /**
365 * Perform validation for a single field
366 *
367 * Returns true or false depending on whether the field has a 'name' attribute.
368 * This method also populates the shortcode's $errors and $required arrays.
369 *
370 * @param array $field
371 *
372 * @return bool
373 *
374 * @since 1.0
375 */
376 protected function validate( $field ) {
377
378 extract( shortcode_atts(
379 array(
380 'name' => false,
381 'required' => false,
382 'label' => '',
383 ), $field )
384 );
385
386 if ( $name ) {
387
388 if ( isset( $required['error'] ) ) {
389
390 $error = array(
391 'type' => 'container',
392 'html' => $required['error'],
393 );
394
395 $this->errors[ $name ] = $this->generate_container( $error );
396 }
397
398 if ( ! ! $required || is_array( $required ) ) {
399
400 $alert = esc_html__( 'Some of the shortcode options are required.', 'give' );
401
402 if ( isset( $required['alert'] ) ) {
403
404 $alert = $required['alert'];
405
406 } else if ( ! empty( $label ) ) {
407
408 $alert = sprintf(
409 /* translators: %s: option label */
410 esc_html__( 'The "%s" option is required.', 'give' ),
411 str_replace( ':', '', $label )
412 );
413 }
414
415 $this->required[ $name ] = $alert;
416 }
417
418 return true;
419 }
420
421 return false;
422 }
423 }
424