PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.0.4
GiveWP – Donation Plugin and Fundraising Platform v2.0.4
4.16.3 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
418 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 'post_status' => 'publish',
287 'orderby' => 'title',
288 'order' => 'ASC',
289 'posts_per_page' => 500,
290 );
291
292 $args = wp_parse_args( (array) $field['query_args'], $args );
293 $posts = new WP_Query( $args );
294 $options = array();
295
296 if ( $posts->have_posts() ) {
297 while ( $posts->have_posts() ) {
298 $posts->the_post();
299 $post_title = get_the_title();
300 $post_id = get_the_ID();
301 $options[ absint( $post_id ) ] = ( empty( $post_title ) ? sprintf( __( 'Untitled (#%s)', 'give' ), $post_id ) : $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 ), $field );
339
340 if ( $this->validate( $field ) ) {
341 return array_filter( $textbox, array( $this, 'return_textbox_value' ) );
342 }
343
344 return false;
345 }
346
347 /**
348 * Validate Textbox Value
349 *
350 * @param $value
351 *
352 * @return bool
353 */
354 function return_textbox_value( $value ) {
355 return $value !== '';
356 }
357
358 /**
359 * Perform validation for a single field
360 *
361 * Returns true or false depending on whether the field has a 'name' attribute.
362 * This method also populates the shortcode's $errors and $required arrays.
363 *
364 * @param array $field
365 *
366 * @return bool
367 *
368 * @since 1.0
369 */
370 protected function validate( $field ) {
371
372 extract( shortcode_atts(
373 array(
374 'name' => false,
375 'required' => false,
376 'label' => '',
377 ), $field )
378 );
379
380 if ( $name ) {
381
382 if ( isset( $required['error'] ) ) {
383
384 $error = array(
385 'type' => 'container',
386 'html' => $required['error'],
387 );
388
389 $this->errors[ $name ] = $this->generate_container( $error );
390 }
391
392 if ( ! ! $required || is_array( $required ) ) {
393
394 $alert = esc_html__( 'Some of the shortcode options are required.', 'give' );
395
396 if ( isset( $required['alert'] ) ) {
397
398 $alert = $required['alert'];
399
400 } else if ( ! empty( $label ) ) {
401
402 $alert = sprintf(
403 /* translators: %s: option label */
404 esc_html__( 'The "%s" option is required.', 'give' ),
405 str_replace( ':', '', $label )
406 );
407 }
408
409 $this->required[ $name ] = $alert;
410 }
411
412 return true;
413 }
414
415 return false;
416 }
417 }
418