PluginProbe
User Profile Builder – Beautiful User Registration Forms, User Profiles & User Role Editor / 2.0.7
User Profile Builder – Beautiful User Registration Forms, User Profiles & User Role Editor v2.0.7
4.0.2 4.0.1 4.0.0 3.16.6 3.16.5 3.16.4 3.16.3 3.16.2 3.16.1 3.16.0 3.15.9 3.9.9 3.9.5 3.9.6 3.9.7 3.9.8 1.1.7 1.1.8 1.1.9 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 All 340 releases
profile-builder / assets / lib / wck-api / wordpress-creation-kit.php

wordpress-creation-kit.php in User Profile Builder – Beautiful User Registration Forms, User Profiles & User Role Editor 2.0.7, at assets/lib/wck-api/wordpress-creation-kit.php

1,449 lines 51.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /* Copyright 2011 Ungureanu Madalin (email : madalin@reflectionmedia.ro)
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation; either version 2 of the License, or
6 (at your option) any later version.
7 This program is distributed in the hope that it will be useful,
8 but WITHOUT ANY WARRANTY; without even the implied warranty of
9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 GNU General Public License for more details.
11 You should have received a copy of the GNU General Public License
12 along with this program; if not, write to the Free Software
13 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
14 */
15
16 if( file_exists( dirname(__FILE__). '/wck-fep/wck-fep.php' ) )
17 require_once( 'wck-fep/wck-fep.php' );
18
19 if( file_exists( dirname(__FILE__). '/wck-static-metabox-api.php' ) )
20 require_once( 'wck-static-metabox-api.php' );
21
22
23 /*
24
25 Usage Example 1:
26
27
28 $fint = array(
29 array( 'type' => 'text', 'title' => 'Title', 'description' => 'Description for this input' ),
30 array( 'type' => 'textarea', 'title' => 'Description' ),
31 array( 'type' => 'upload', 'title' => 'Image', 'description' => 'Upload a image' ),
32 array( 'type' => 'select', 'title' => 'Select This', 'options' => array( 'Option 1', 'Option 2', 'Option 3' ) ),
33 array( 'type' => 'checkbox', 'title' => 'Check This', 'options' => array( 'Option 1', 'Option 2', 'Option 3' ) ),
34 array( 'type' => 'radio', 'title' => 'Radio This', 'options' => array( 'Radio 1', 'Radio 2', 'Radio 3' ) ),
35 );
36
37 $args = array(
38 'metabox_id' => 'rm_slider_content',
39 'metabox_title' => 'Slideshow Class',
40 'post_type' => 'slideshows',
41 'meta_name' => 'rmscontent',
42 'meta_array' => $fint
43 );
44
45 new Wordpress_Creation_Kit_PB( $args );
46
47
48 On the frontend:
49
50 $meta = get_post_meta( $post->ID, 'rmscontent', true );
51
52 */
53
54 class Wordpress_Creation_Kit_PB{
55
56 private $defaults = array(
57 'metabox_id' => '',
58 'metabox_title' => 'Meta Box',
59 'post_type' => 'post',
60 'meta_name' => '',
61 'meta_array' => array(),
62 'page_template' => '',
63 'post_id' => '',
64 'single' => false,
65 'unserialize_fields' => false,
66 'sortable' => true,
67 'context' => 'post_meta',
68 'mb_context' => 'normal'
69 );
70 private $args;
71
72
73 /* Constructor method for the class. */
74 function __construct( $args ) {
75
76 /* Global that will hold all the arguments for all the custom boxes */
77 global $wck_objects;
78
79 /* Merge the input arguments and the defaults. */
80 $this->args = wp_parse_args( $args, $this->defaults );
81
82 /* Add the settings for this box to the global object */
83 $wck_objects[$this->args['metabox_id']] = $this->args;
84
85 /*print scripts*/
86 add_action('admin_enqueue_scripts', array( &$this, 'wck_print_scripts' ));
87 /* add our own ajaxurl because we are going to use the wck script also in frontend and we want to avoid any conflicts */
88 add_action( 'admin_head', array( &$this, 'wck_print_ajax_url' ) );
89
90 // Set up the AJAX hooks
91 add_action("wp_ajax_wck_add_meta".$this->args['meta_name'], array( &$this, 'wck_add_meta') );
92 add_action("wp_ajax_wck_update_meta".$this->args['meta_name'], array( &$this, 'wck_update_meta') );
93 add_action("wp_ajax_wck_show_update".$this->args['meta_name'], array( &$this, 'wck_show_update_form') );
94 add_action("wp_ajax_wck_refresh_list".$this->args['meta_name'], array( &$this, 'wck_refresh_list') );
95 add_action("wp_ajax_wck_refresh_entry".$this->args['meta_name'], array( &$this, 'wck_refresh_entry') );
96 add_action("wp_ajax_wck_add_form".$this->args['meta_name'], array( &$this, 'wck_add_form') );
97 add_action("wp_ajax_wck_remove_meta".$this->args['meta_name'], array( &$this, 'wck_remove_meta') );
98 add_action("wp_ajax_wck_reorder_meta".$this->args['meta_name'], array( &$this, 'wck_reorder_meta') );
99
100 /* modify Insert into post button */
101 add_action('admin_head-media-upload-popup', array( &$this, 'wck_media_upload_popup_head') );
102
103 /* custom functionality for upload video */
104 add_filter('media_send_to_editor', array( &$this, 'wck_media_send_to_editor' ), 15, 2 );
105
106 add_action('add_meta_boxes', array( &$this, 'wck_add_metabox') );
107
108 /* hook to add a side metabox with the Syncronize translation button */
109 add_action('add_meta_boxes', array( &$this, 'wck_add_sync_translation_metabox' ) );
110
111 /* ajax hook the syncronization function */
112 add_action("wp_ajax_wck_sync_translation", array( &$this, 'wck_sync_translation_ajax' ) );
113
114 }
115
116
117 //add metabox using wordpress api
118
119 function wck_add_metabox() {
120
121 global $pb_wck_pages_hooknames;
122
123 if( $this->args['context'] == 'post_meta' ){
124 if( $this->args['post_id'] == '' && $this->args['page_template'] == '' ){
125 add_meta_box($this->args['metabox_id'], $this->args['metabox_title'], array( &$this, 'wck_content' ), $this->args['post_type'], $this->args['mb_context'], 'high', array( 'meta_name' => $this->args['meta_name'], 'meta_array' => $this->args['meta_array']) );
126 /* add class to meta box */
127 add_filter( "postbox_classes_".$this->args['post_type']."_".$this->args['metabox_id'], array( &$this, 'wck_add_metabox_classes' ) );
128 }
129 else{
130 if( !empty( $_GET['post'] ) )
131 $post_id = $_GET['post'];
132 else if( !empty( $_POST['post_ID'] ) )
133 $post_id = $_POST['post_ID'];
134 else
135 $post_id = '';
136
137
138 if( $this->args['post_id'] != '' && $this->args['page_template'] != '' ){
139 $template_file = get_post_meta($post_id,'_wp_page_template',TRUE);
140 if( $this->args['post_id'] == $post_id && $template_file == $this->args['page_template'] )
141 add_meta_box($this->args['metabox_id'], $this->args['metabox_title'], array( &$this, 'wck_content' ), 'page', $this->args['mb_context'], 'high', array( 'meta_name' => $this->args['meta_name'], 'meta_array' => $this->args['meta_array'] ) );
142
143 /* add class to meta box */
144 add_filter( "postbox_classes_page_".$this->args['metabox_id'], array( &$this, 'wck_add_metabox_classes' ) );
145 }
146 else{
147
148 if( $this->args['post_id'] != '' ){
149 if( $this->args['post_id'] == $post_id ){
150 $post_type = get_post_type( $post_id );
151 add_meta_box($this->args['metabox_id'], $this->args['metabox_title'], array( &$this, 'wck_content' ), $post_type, $this->args['mb_context'], 'high', array( 'meta_name' => $this->args['meta_name'], 'meta_array' => $this->args['meta_array'] ) );
152 /* add class to meta box */
153 add_filter( "postbox_classes_".$post_type."_".$this->args['metabox_id'], array( &$this, 'wck_add_metabox_classes' ) );
154 }
155 }
156
157 if( $this->args['page_template'] != '' ){
158 $template_file = get_post_meta($post_id,'_wp_page_template',TRUE);
159 if ( $template_file == $this->args['page_template'] ){
160 add_meta_box($this->args['metabox_id'], $this->args['metabox_title'], array( &$this, 'wck_content' ), 'page', $this->args['mb_context'], 'high', array( 'meta_name' => $this->args['meta_name'], 'meta_array' => $this->args['meta_array']) );
161 /* add class to meta box */
162 add_filter( "postbox_classes_page_".$this->args['metabox_id'], array( &$this, 'wck_add_metabox_classes' ) );
163 }
164 }
165
166 }
167
168 }
169 }
170 else if( $this->args['context'] == 'option' ){
171 add_meta_box($this->args['metabox_id'], $this->args['metabox_title'], array( &$this, 'wck_content' ), $pb_wck_pages_hooknames[$this->args['post_type']], $this->args['mb_context'], 'high', array( 'meta_name' => $this->args['meta_name'], 'meta_array' => $this->args['meta_array']) );
172 /* add class to meta box */
173 add_filter( "postbox_classes_".$pb_wck_pages_hooknames[$this->args['post_type']]."_".$this->args['metabox_id'], array( &$this, 'wck_add_metabox_classes' ) );
174 }
175 }
176
177 /* Function used to add classes to the wck meta boxes */
178 function wck_add_metabox_classes( $classes ){
179 array_push($classes,'wck-post-box');
180 return $classes;
181 }
182
183 function wck_content($post, $metabox){
184 if( !empty( $post->ID ) )
185 $post_id = $post->ID;
186 else
187 $post_id = '';
188
189 //output the add form
190 if( $this->args['single'] ){
191
192 if( $this->args['context'] == 'post_meta' )
193 $meta_val = get_post_meta( $post_id, $metabox['args']['meta_name'], true );
194 else if ( $this->args['context'] == 'option' )
195 $meta_val = get_option( $metabox['args']['meta_name'] );
196
197 if( empty( $meta_val ) )
198 self::create_add_form($metabox['args']['meta_array'], $metabox['args']['meta_name'], $post);
199 }
200 else
201 self::create_add_form($metabox['args']['meta_array'], $metabox['args']['meta_name'], $post);
202
203 //output the entries
204 echo self::wck_output_meta_content($metabox['args']['meta_name'], $post_id, $metabox['args']['meta_array']);
205 }
206
207 /**
208 * The function used to create a form element
209 *
210 * @since 1.0.0
211 *
212 * @param string $meta Meta name.
213 * @param array $details Contains the details for the field.
214 * @param string $value Contains input value;
215 * @param string $context Context where the function is used. Depending on it some actions are preformed.;
216 * @param int $post_id The post ID;
217 * @return string $element input element html string.
218 */
219
220 function wck_output_form_field( $meta, $details, $value = '', $context = '', $post_id = '' ){
221 $element = '';
222
223 if( $context == 'edit_form' ){
224 $edit_class = '.mb-table-container ';
225 $var_prefix = 'edit';
226 }
227 else if( $context == 'fep' ){
228 /* id prefix for frontend posting */
229 $frontend_prefix = 'fep-';
230 }
231 else{
232 if( !empty( $details['default'] ) )
233 $value = apply_filters( "wck_default_value_{$meta}_". Wordpress_Creation_Kit_PB::wck_generate_slug( $details['title'], $details ) , $details['default'] );
234 }
235
236 $element .= '<label for="'. esc_attr( Wordpress_Creation_Kit_PB::wck_generate_slug( $details['title'], $details ) ) .'" class="field-label">'. apply_filters( "wck_label_{$meta}_". Wordpress_Creation_Kit_PB::wck_generate_slug( $details['title'], $details ), ucfirst($details['title']) ) .':';
237 if( !empty( $details['required'] ) && $details['required'] )
238 $element .= '<span class="required">*</span>';
239 $element .= '</label>';
240
241 $element .= '<div class="mb-right-column">';
242
243 /*
244 include actual field type
245 possible field types: text, textarea, select, checkbox, radio, upload, wysiwyg editor, datepicker, country select, user select, cpt select
246 */
247
248 if( function_exists( 'wck_nr_get_repeater_boxes' ) ){
249 $cfc_titles = wck_nr_get_repeater_boxes();
250 if( in_array( $details['type'], $cfc_titles ) ){
251 $details['type'] = 'nested repeater';
252 }
253 }
254
255
256 if( file_exists( dirname( __FILE__ ).'/fields/'.$details['type'].'.php' ) ){
257 require( dirname( __FILE__ ).'/fields/'.$details['type'].'.php' );
258 }
259
260 if( !empty( $details['description'] ) ){
261 $element .= '<p class="description">'. $details['description'].'</p>';
262 }
263
264 $element .= '</div><!-- .mb-right-column -->';
265
266 $element = apply_filters( "wck_output_form_field_{$meta}_" . Wordpress_Creation_Kit_PB::wck_generate_slug( $details['title'], $details ), $element );
267
268 return $element;
269
270 }
271
272
273 /**
274 * The function used to create the form for adding records
275 *
276 * @since 1.0.0
277 *
278 * @param array $fields Contains the desired inputs in the repeater field. Must be like: array('Key:type').
279 * Key is used for the name attribute of the field, label of the field and as the meta_key.
280 * Supported types: input, textarea, upload
281 * @param string $meta It is used in update_post_meta($id, $meta, $results);. Use '_' prefix if you don't want
282 * the meta to apear in custom fields box.
283 * @param object $post Post object
284 */
285 function create_add_form($fields, $meta, $post){
286 $nonce = wp_create_nonce( 'wck-add-meta' );
287 if( !empty( $post->ID ) )
288 $post_id = $post->ID;
289 else
290 $post_id = '';
291
292 ?>
293 <div id="<?php echo $meta ?>" style="padding:10px 0;" class="wck-add-form<?php if( $this->args['single'] ) echo ' single' ?>">
294 <ul class="mb-list-entry-fields">
295 <?php
296 $element_id = 0;
297 if( !empty( $fields ) ){
298 foreach( $fields as $details ){
299
300 do_action( "wck_before_add_form_{$meta}_element_{$element_id}" );
301
302 ?>
303 <li class="row-<?php echo esc_attr( Wordpress_Creation_Kit_PB::wck_generate_slug( $details['title'], $details ) ) ?>">
304 <?php echo self::wck_output_form_field( $meta, $details, '', '', $post_id ); ?>
305 </li>
306 <?php
307
308 do_action( "wck_after_add_form_{$meta}_element_{$element_id}" );
309
310 $element_id++;
311 }
312 }
313 ?>
314 <li style="overflow:visible;" class="add-entry-button">
315 <a href="javascript:void(0)" class="button-primary" onclick="addMeta('<?php echo esc_js($meta); ?>', '<?php echo esc_js( $post_id ); ?>', '<?php echo esc_js($nonce); ?>')"><span><?php _e( apply_filters( 'wck_add_entry_button', 'Add Entry', $meta, $post ), 'wck' ); ?></span></a>
316 </li>
317 </ul>
318 </div>
319 <?php
320 }
321
322 /**
323 * The function used to display a form to update a reccord from meta
324 *
325 * @since 1.0.0
326 *
327 * @param string $meta It is used in get_post_meta($id, $meta, $results);. Use '_' prefix if you don't want
328 * the meta to apear in custom fields box.
329 * @param int $id Post id
330 * @param int $element_id The id of the reccord. The meta is stored as array(array());
331 */
332 function mb_update_form($fields, $meta, $id, $element_id){
333
334 $update_nonce = wp_create_nonce( 'wck-update-entry' );
335
336 if( $this->args['context'] == 'post_meta' )
337 $results = get_post_meta($id, $meta, true);
338 else if ( $this->args['context'] == 'option' )
339 $results = get_option( $meta );
340
341 /* Filter primary used for CFC/OPC fields in order to show/hide fields based on type */
342 $wck_update_container_css_class = " class='update_container_$meta'";
343 $wck_update_container_css_class = apply_filters("wck_update_container_class_{$meta}", $wck_update_container_css_class, $meta, $results, $element_id );
344
345 $form = '';
346 $form .= '<tr id="update_container_'.$meta.'_'.$element_id.'" ' . $wck_update_container_css_class . '><td colspan="4">';
347 if($results != null){
348 $i = 0;
349 $form .= '<ul class="mb-list-entry-fields">';
350
351 if( !empty( $fields ) ){
352 foreach( $fields as $field ){
353 $details = $field;
354 if( !empty( $results[$element_id][Wordpress_Creation_Kit_PB::wck_generate_slug( $details['title'], $details )] ) )
355 $value = $results[$element_id][Wordpress_Creation_Kit_PB::wck_generate_slug( $details['title'], $details )];
356 else
357 $value = '';
358
359 $form = apply_filters( "wck_before_update_form_{$meta}_element_{$i}", $form, $element_id, $value );
360
361 $form .= '<li class="row-'. esc_attr( Wordpress_Creation_Kit_PB::wck_generate_slug( $details['title'], $details ) ) .'">';
362
363 $form .= self::wck_output_form_field( $meta, $details, $value, 'edit_form', $id );
364
365 $form .= '</li>';
366
367 $form = apply_filters( "wck_after_update_form_{$meta}_element_{$i}", $form, $element_id, $value );
368
369 $i++;
370 }
371 }
372 $form .= '<li style="overflow:visible;">';
373 $form .= '<a href="javascript:void(0)" class="button-primary" onclick=\'updateMeta("'.esc_js($meta).'", "'.esc_js($id).'", "'.esc_js($element_id).'", "'.esc_js($update_nonce).'")\'><span>'. __( apply_filters( 'wck_save_changes_button', 'Save Changes', $meta ), 'wck' ) .'</span></a>';
374 $form .= '<a href="javascript:void(0)" class="button-secondary" style="margin-left:10px;" onclick=\'removeUpdateForm("'. esc_js( 'update_container_'.$meta.'_'.$element_id ). '" )\'><span>'. __( apply_filters( 'wck_cancel_button', 'Cancel', $meta ), 'wck' ) .'</span></a>';
375 $form .= '</li>';
376
377 $form .= '</ul>';
378 }
379 $form .= '</td></tr>';
380
381 return $form;
382 }
383
384
385 /**
386 * The function used to output the content of a meta
387 *
388 * @since 1.0.0
389 *
390 * @param string $meta It is used in get_post_meta($id, $meta, $results);. Use '_' prefix if you don't want
391 * the meta to apear in custom fields box.
392 * @param int $id Post id
393 */
394 function wck_output_meta_content($meta, $id, $fields, $box_args = '' ){
395 /* in fep $this->args is empty so we need it as a parameter */
396 if( !empty( $box_args ) )
397 $this->args = wp_parse_args( $box_args, $this->defaults );
398
399
400 if( $this->args['context'] == 'post_meta' || $this->args['context'] == '' )
401 $results = get_post_meta($id, $meta, true);
402 else if ( $this->args['context'] == 'option' )
403 $results = get_option( $meta );
404
405 $list = '';
406 $list .= '<table id="container_'.esc_attr($meta).'" class="mb-table-container widefat';
407
408 if( $this->args['single'] ) $list .= ' single';
409 if( !$this->args['sortable'] ) $list .= ' not-sortable';
410
411 $list .= '" post="'.esc_attr($id).'">';
412
413
414 if( !empty( $results ) ){
415 $list .= apply_filters( 'wck_metabox_content_header_'.$meta , '<thead><tr><th class="wck-number">#</th><th class="wck-content">'. __( 'Content', 'wck' ) .'</th><th class="wck-edit">'. __( 'Edit', 'wck' ) .'</th><th class="wck-delete">'. __( 'Delete', 'wck' ) .'</th></tr></thead>' );
416 $i=0;
417 foreach ($results as $result){
418
419 $list .= self::wck_output_entry_content( $meta, $id, $fields, $results, $i );
420
421 $i++;
422 }
423 }
424 $list .= apply_filters( 'wck_metabox_content_footer_'.$meta , '', $id );
425 $list .= '</table>';
426
427 $list = apply_filters('wck_metabox_content_'.$meta, $list, $id);
428 return $list;
429 }
430
431 function wck_output_entry_content( $meta, $id, $fields, $results, $element_id ){
432 $edit_nonce = wp_create_nonce( 'wck-edit-entry' );
433 $delete_nonce = wp_create_nonce( 'wck-delete-entry' );
434 $entry_nr = $element_id +1;
435
436 $wck_element_class = '';
437 $wck_element_class = apply_filters( "wck_element_class_{$meta}", $wck_element_class, $meta, $results, $element_id );
438
439 $list = '';
440 $list .= '<tr id="element_'.$element_id.'" ' . $wck_element_class . '>';
441 $list .= '<td style="text-align:center;vertical-align:middle;" class="wck-number">'. $entry_nr .'</td>';
442 $list .= '<td class="wck-content"><ul>' . "\r\n";
443
444 $j = 0;
445
446 if( !empty( $fields ) ){
447 foreach( $fields as $field ){
448 $details = $field;
449
450 if( !empty( $results[$element_id][Wordpress_Creation_Kit_PB::wck_generate_slug( $details['title'], $details )] ) )
451 $value = $results[$element_id][Wordpress_Creation_Kit_PB::wck_generate_slug( $details['title'], $details )];
452 else
453 $value ='';
454
455 /* filter display value */
456 $value = apply_filters( "wck_displayed_value_{$meta}_element_{$j}", $value );
457
458 /* display it differently based on field type*/
459 if( $details['type'] == 'upload' ){
460 $display_value = self::wck_get_entry_field_upload($value);
461 } elseif ( $details['type'] == 'user select' ) {
462 $display_value = self::wck_get_entry_field_user_select( $value ) . '</pre>';
463 } elseif ( $details['type'] == 'cpt select' ){
464 $display_value = self::wck_get_entry_field_cpt_select( $value ) . '</pre>';
465 } else {
466 $display_value = '<pre>'.htmlspecialchars( $value ) . '</pre>';
467 }
468
469
470 $list = apply_filters( "wck_before_listed_{$meta}_element_{$j}", $list, $element_id, $value );
471 /*check for nested repeater type and set it acordingly */
472 if( strpos( $details['type'], 'CFC-') === 0 )
473 $details['type'] = 'nested-repeater';
474
475 $list .= '<li class="row-'. esc_attr( Wordpress_Creation_Kit_PB::wck_generate_slug( $details['title'], $details ) ) .'" data-type="'.$details['type'].'"><strong>'.$details['title'].': </strong>'.$display_value.' </li>' . "\r\n";
476
477 $list = apply_filters( "wck_after_listed_{$meta}_element_{$j}", $list, $element_id, $value );
478
479 $j++;
480
481 /* In CFC/OPC we need the field title. Find it out and output it if found */
482 if ($meta == 'wck_cfc_fields') {
483 if( !empty( $results[$element_id][Wordpress_Creation_Kit_PB::wck_generate_slug( $details['title'], $details )] ) ){
484 $field_title = $results[$element_id][Wordpress_Creation_Kit_PB::wck_generate_slug( $details['title'], $details )];
485 if ($field_title == "Field Type")
486 $cfc_field_type = $value;
487 }
488 }
489 }
490 }
491 $list .= '</ul>';
492
493 /* check if we have nested repeaters */
494 if( function_exists( 'wck_nr_check_for_nested_repeaters' ) ){
495 if( wck_nr_check_for_nested_repeaters( $fields ) === true ){
496 $list .= wck_nr_handle_repeaters( $meta, $id, $fields, $results, $element_id );
497 }
498 }
499
500 $list .= '</td>';
501 $list .= '<td style="text-align:center;vertical-align:middle;" class="wck-edit"><a href="javascript:void(0)" class="button-secondary" onclick=\'showUpdateFormMeta("'.esc_js($meta).'", "'.esc_js($id).'", "'.esc_js($element_id).'", "'.esc_js($edit_nonce).'")\' title="'. __( 'Edit this item', 'wck' ) .'">'. apply_filters( 'wck_edit_button', __('Edit','wck'), $meta ) .'</a></td>';
502 $list .= '<td style="text-align:center;vertical-align:middle;" class="wck-delete"><a href="javascript:void(0)" class="mbdelete" onclick=\'removeMeta("'.esc_js($meta).'", "'.esc_js($id).'", "'.esc_js($element_id).'", "'.esc_js($delete_nonce).'")\' title="'. __( 'Delete this item', 'wck' ) .'">'. apply_filters( 'wck_delete_button', __( 'Delete', 'wck' ), $meta) .'</a></td>';
503
504 $list .= "</tr> \r\n";
505
506 return $list;
507 }
508
509 /* function to generate output for upload field */
510 function wck_get_entry_field_upload($id){
511 if( !empty ( $id ) && is_numeric( $id ) ){
512 $file_src = wp_get_attachment_url($id);
513 $thumbnail = wp_get_attachment_image( $id, array( 80, 60 ), true );
514 $file_name = get_the_title( $id );
515
516 if ( preg_match( '/^.*?\.(\w+)$/', get_attached_file( $id ), $matches ) )
517 $file_type = esc_html( strtoupper( $matches[1] ) );
518 else
519 $file_type = strtoupper( str_replace( 'image/', '', get_post_mime_type( $id ) ) );
520
521 return $display_value = '<div class="upload-field-details">'. $thumbnail .'<p><span class="file-name">'. $file_name .'</span><span class="file-type">'. $file_type . '</span></p></div>';
522 } else {
523 return '';
524 }
525 }
526
527 /* function to generate output for user select */
528 function wck_get_entry_field_user_select($id){
529 if( !empty ( $id ) && is_numeric( $id ) ){
530 $user = get_user_by( 'id', $id );
531 if ( $user )
532 return '<pre>'.htmlspecialchars( $user->display_name );
533 else
534 return 'Error - User ID not found in database';
535
536 } else {
537 return '';
538 }
539 }
540
541 /* function to generate output for cpt select */
542 function wck_get_entry_field_cpt_select($id){
543 if( !empty ( $id ) && is_numeric( $id ) ){
544 $post = get_post( $id );
545
546 if ( $post != null ){
547 if ( $post->post_title == '' )
548 $post->post_title = 'No title. ID: ' . $id;
549
550 return '<pre>'.htmlspecialchars( $post->post_title );
551 }
552 else
553 return 'Error - Post ID not found in database';
554
555 } else {
556 return '';
557 }
558 }
559
560 /* enque the js/css */
561 function wck_print_scripts($hook){
562 global $pb_wck_pages_hooknames;
563
564 if( $this->args['context'] == 'post_meta' ) {
565 if( 'post.php' == $hook || 'post-new.php' == $hook){
566
567 /* only add on profile builder custom post types */
568 if( !empty( $_GET['post'] ) )
569 $post_id = $_GET['post'];
570 else if( !empty( $_POST['post_ID'] ) )
571 $post_id = $_POST['post_ID'];
572 else
573 $post_id = '';
574 if( !empty( $post_id ) ){
575 $current_post_type = get_post_type( $post_id );
576 if( strpos( $current_post_type, 'wppb-' ) === false )
577 return '';
578 }
579
580 self::wck_enqueue();
581 }
582 }
583 elseif( $this->args['context'] == 'option' ){
584 if( $pb_wck_pages_hooknames[$this->args['post_type']] == $hook ){
585 self::wck_enqueue( 'options' );
586 }
587 }
588 }
589
590 /* our own ajaxurl */
591 function wck_print_ajax_url(){
592 echo '<script type="text/javascript">var wckAjaxurl = "'. admin_url('admin-ajax.php') .'";</script>';
593 }
594
595
596 /* Helper function for enqueueing scripts and styles */
597 private static function wck_enqueue( $context = '' ){
598
599 wp_enqueue_script( 'jquery-ui-draggable' );
600 wp_enqueue_script( 'jquery-ui-droppable' );
601 wp_enqueue_script( 'jquery-ui-sortable' );
602
603 if( $context == 'options' ){
604 wp_enqueue_script( 'thickbox' );
605 wp_enqueue_style( 'thickbox' );
606 }
607
608 wp_enqueue_script('wordpress-creation-kit', plugins_url('/wordpress-creation-kit.js', __FILE__), array('jquery', 'jquery-ui-draggable', 'jquery-ui-droppable', 'jquery-ui-sortable' ) );
609 wp_register_style('wordpress-creation-kit-css', plugins_url('/wordpress-creation-kit.css', __FILE__));
610 wp_enqueue_style('wordpress-creation-kit-css');
611
612 // wysiwyg
613 // wp_register_script( 'wck-tinymce', plugins_url( '/assets/js/tiny_mce/tiny_mce.js', __FILE__ ), array(), '1.0', true );
614 // wp_enqueue_script( 'wck-tinymce' );
615 // wp_register_script( 'wck-tinymce-init', plugins_url( '/assets/js/tiny_mce/wck_tiny_mce_init.js', __FILE__ ), array(), '1.0', true );
616 // wp_enqueue_script( 'wck-tinymce-init' );
617
618 //datepicker
619 wp_enqueue_script('jquery-ui-datepicker');
620 wp_enqueue_style( 'jquery-style', plugins_url( '/assets/datepicker/datepicker.css', __FILE__ ) );
621
622 }
623
624 /* Helper function for required fields */
625 function wck_test_required( $meta_array, $meta, $values, $id ){
626 $fields = $meta_array;
627 $required_fields = array();
628 $required_fields_with_errors = array();
629 $required_message = '';
630
631 $errors = '';
632
633 if( !empty( $fields ) ){
634 foreach( $fields as $field ){
635 if( !empty( $field['required'] ) && $field['required'] )
636 $required_fields[Wordpress_Creation_Kit_PB::wck_generate_slug( $field['title'], $field )] = $field['title'];
637 }
638 }
639
640 if( !empty( $values ) ){
641 foreach( $values as $key => $value ){
642 if( array_key_exists( $key, $required_fields ) && apply_filters( "wck_required_test_{$meta}_{$key}", empty( $value ), $value, $id ) ){
643 $required_message .= apply_filters( "wck_required_message_{$meta}_{$key}", __( "Please enter a value for the required field ", "wck" ) . "$required_fields[$key] \n", $value );
644 $required_fields_with_errors[] = $key;
645 }
646 }
647 }
648
649 $required_message .= apply_filters( "wck_extra_message", "", $fields, $required_fields, $meta, $values, $id );
650 $required_fields_with_errors = apply_filters( "wck_required_fields_with_errors", $required_fields_with_errors, $fields, $required_fields, $meta, $value, $id );
651
652 if( $required_message != '' ){
653 $errors = array( 'error' => $required_message, 'errorfields' => $required_fields_with_errors );
654 }
655
656 return $errors;
657 }
658
659
660 /* ajax add a reccord to the meta */
661 function wck_add_meta(){
662 check_ajax_referer( "wck-add-meta" );
663 if( !empty( $_POST['meta'] ) )
664 $meta = $_POST['meta'];
665 else
666 $meta = '';
667 if( !empty( $_POST['id'] ) )
668 $id = absint($_POST['id']);
669 else
670 $id = '';
671 if( !empty( $_POST['values'] ) )
672 $values = $_POST['values'];
673 else
674 $values = array();
675
676 $values = apply_filters( "wck_add_meta_filter_values_{$meta}", $values );
677
678 /* check required fields */
679 $errors = self::wck_test_required( $this->args['meta_array'], $meta, $values, $id );
680 if( $errors != '' ){
681 header( 'Content-type: application/json' );
682 die( json_encode( $errors ) );
683 }
684
685
686 if( $this->args['context'] == 'post_meta' )
687 $results = get_post_meta($id, $meta, true);
688 else if ( $this->args['context'] == 'option' )
689 $results = get_option( $meta );
690
691 $results[] = $values;
692
693 do_action( 'wck_before_add_meta', $meta, $id, $values );
694
695 if( $this->args['context'] == 'post_meta' )
696 update_post_meta($id, $meta, $results);
697 else if ( $this->args['context'] == 'option' )
698 update_option( $meta, wp_unslash( $results ) );
699
700 /* if unserialize_fields is true add for each entry separate post meta for every element of the form */
701 if( $this->args['unserialize_fields'] && $this->args['context'] == 'post_meta' ){
702
703 $meta_suffix = count( $results );
704 if( !empty( $values ) ){
705 foreach( $values as $name => $value ){
706 update_post_meta($id, $meta.'_'.$name.'_'.$meta_suffix, $value);
707 }
708 }
709 }
710
711 exit;
712 }
713
714 /* ajax update a reccord in the meta */
715 function wck_update_meta(){
716 check_ajax_referer( "wck-update-entry" );
717 if( !empty( $_POST['meta'] ) )
718 $meta = $_POST['meta'];
719 else
720 $meta = '';
721 if( !empty( $_POST['id'] ) )
722 $id = absint($_POST['id']);
723 else
724 $id = '';
725 if( isset( $_POST['element_id'] ) )
726 $element_id = $_POST['element_id'];
727 else
728 $element_id = 0;
729 if( !empty( $_POST['values'] ) )
730 $values = $_POST['values'];
731
732
733 $values = apply_filters( "wck_update_meta_filter_values_{$meta}", $values, $element_id );
734
735 /* check required fields */
736 $errors = self::wck_test_required( $this->args['meta_array'], $meta, $values, $id );
737 if( $errors != '' ){
738 header( 'Content-type: application/json' );
739 die( json_encode( $errors ) );
740 }
741
742 if( $this->args['context'] == 'post_meta' )
743 $results = get_post_meta($id, $meta, true);
744 else if ( $this->args['context'] == 'option' )
745 $results = get_option( $meta );
746
747 $results[$element_id] = $values;
748
749 do_action( 'wck_before_update_meta', $meta, $id, $values, $element_id );
750
751 if( $this->args['context'] == 'post_meta' )
752 update_post_meta($id, $meta, $results);
753 else if ( $this->args['context'] == 'option' )
754 update_option( $meta, wp_unslash( $results ) );
755
756 /* if unserialize_fields is true update the coresponding post metas for every element of the form */
757 if( $this->args['unserialize_fields'] && $this->args['context'] == 'post_meta' ){
758
759 $meta_suffix = $element_id + 1;
760 if( !empty( $values ) ){
761 foreach( $values as $name => $value ){
762 update_post_meta($id, $meta.'_'.$name.'_'.$meta_suffix, $value);
763 }
764 }
765 }
766
767 exit;
768 }
769
770 /* ajax to refresh the meta content */
771 function wck_refresh_list(){
772 if( isset( $_POST['meta'] ) )
773 $meta = $_POST['meta'];
774 else
775 $meta = '';
776 if( isset( $_POST['id'] ) )
777 $id = absint($_POST['id']);
778 else
779 $id = '';
780 echo self::wck_output_meta_content($meta, $id, $this->args['meta_array']);
781
782 do_action( "wck_refresh_list_{$meta}", $id );
783
784 exit;
785 }
786
787 /* ajax to refresh an entry content */
788 function wck_refresh_entry(){
789 if( isset( $_POST['meta'] ) )
790 $meta = $_POST['meta'];
791 else
792 $meta = '';
793 if( isset( $_POST['id'] ) )
794 $id = absint( $_POST['id'] );
795 else
796 $id = '';
797 if( isset( $_POST['element_id'] ) )
798 $element_id = $_POST['element_id'];
799 else
800 $element_id = '';
801
802 if( $this->args['context'] == 'post_meta' )
803 $results = get_post_meta($id, $meta, true);
804 else if ( $this->args['context'] == 'option' )
805 $results = get_option( $meta );
806
807 echo self::wck_output_entry_content( $meta, $id, $this->args['meta_array'], $results, $element_id );
808
809 do_action( "wck_refresh_entry_{$meta}", $id );
810
811 exit;
812 }
813
814 /* ajax to add the form for single */
815 function wck_add_form(){
816 if( !empty( $_POST['meta'] ) )
817 $meta = $_POST['meta'];
818 else
819 $meta = '';
820 if( !empty( $_POST['id'] ) )
821 $id = absint( $_POST['id'] );
822 else
823 $id = '';
824 $post = get_post($id);
825 self::create_add_form($this->args['meta_array'], $meta, $post );
826 do_action( "wck_ajax_add_form_{$meta}", $id );
827
828 exit;
829 }
830
831
832 /* ajax to show the update form */
833 function wck_show_update_form(){
834 check_ajax_referer( "wck-edit-entry" );
835 $meta = $_POST['meta'];
836 $id = absint($_POST['id']);
837 $element_id = $_POST['element_id'];
838
839 do_action( "wck_before_adding_form_{$meta}", $id, $element_id );
840
841 echo self::mb_update_form($this->args['meta_array'], $meta, $id, $element_id);
842
843 do_action( "wck_after_adding_form", $meta, $id, $element_id );
844 do_action( "wck_after_adding_form_{$meta}", $id, $element_id );
845
846 exit;
847 }
848
849 /* ajax to remove a reccord from the meta */
850 function wck_remove_meta(){
851 check_ajax_referer( "wck-delete-entry" );
852 if( !empty( $_POST['meta'] ) )
853 $meta = $_POST['meta'];
854 else
855 $meta = '';
856 if( !empty( $_POST['id'] ) )
857 $id = absint( $_POST['id'] );
858 else
859 $id = '';
860 if( isset( $_POST['element_id'] ) )
861 $element_id = absint( $_POST['element_id'] );
862 else
863 $element_id = '';
864
865 if( $this->args['context'] == 'post_meta' )
866 $results = get_post_meta($id, $meta, true);
867 else if ( $this->args['context'] == 'option' )
868 $results = get_option( $meta );
869
870 $old_results = $results;
871 unset($results[$element_id]);
872 /* reset the keys for the array */
873 $results = array_values($results);
874
875 do_action( 'wck_before_remove_meta', $meta, $id, $element_id );
876
877 if( $this->args['context'] == 'post_meta' )
878 update_post_meta($id, $meta, $results);
879 else if ( $this->args['context'] == 'option' )
880 update_option( $meta, wp_unslash( $results ) );
881
882
883
884 /* TODO: optimize so that it updates from the deleted element forward */
885 /* if unserialize_fields is true delete the coresponding post metas */
886 if( $this->args['unserialize_fields'] && $this->args['context'] == 'post_meta' ){
887
888 $meta_suffix = 1;
889
890 if( !empty( $results ) ){
891 foreach( $results as $result ){
892 foreach ( $result as $name => $value){
893 update_post_meta($id, $meta.'_'.$name.'_'.$meta_suffix, $value);
894 }
895 $meta_suffix++;
896 }
897 }
898
899 if( count( $results ) == 0 )
900 $results = $old_results;
901
902 if( !empty( $results ) ){
903 foreach( $results as $result ){
904 foreach ( $result as $name => $value){
905 delete_post_meta( $id, $meta.'_'.$name.'_'.$meta_suffix );
906 }
907 break;
908 }
909 }
910 }
911
912 exit;
913 }
914
915
916 /* ajax to reorder records */
917 function wck_reorder_meta(){
918 if( !empty( $_POST['meta'] ) )
919 $meta = $_POST['meta'];
920 else
921 $meta = '';
922 if( !empty( $_POST['id'] ) )
923 $id = absint($_POST['id']);
924 else
925 $id = '';
926 if( !empty( $_POST['values'] ) )
927 $elements_id = $_POST['values'];
928 else
929 $elements_id = array();
930
931 do_action( 'wck_before_reorder_meta', $meta, $id, $elements_id );
932
933 if( $this->args['context'] == 'post_meta' )
934 $results = get_post_meta($id, $meta, true);
935 else if ( $this->args['context'] == 'option' )
936 $results = get_option( $meta );
937
938 $new_results = array();
939 if( !empty( $elements_id ) ){
940 foreach($elements_id as $element_id){
941 $new_results[] = $results[$element_id];
942 }
943 }
944
945 $results = $new_results;
946
947 if( $this->args['context'] == 'post_meta' )
948 update_post_meta($id, $meta, $results);
949 else if ( $this->args['context'] == 'option' )
950 update_option( $meta, wp_unslash( $results ) );
951
952
953 /* if unserialize_fields is true reorder all the coresponding post metas */
954 if( $this->args['unserialize_fields'] && $this->args['context'] == 'post_meta' ){
955
956 $meta_suffix = 1;
957 if( !empty( $new_results ) ){
958 foreach( $new_results as $result ){
959 foreach ( $result as $name => $value){
960 update_post_meta($id, $meta.'_'.$name.'_'.$meta_suffix, $value);
961 }
962 $meta_suffix++;
963 }
964 }
965
966 }
967
968 exit;
969 }
970
971 /* modify Insert into post button */
972 function wck_media_upload_popup_head()
973 {
974 if( isset( $_GET["meta_name"] ) ){
975 if( $this->args['meta_name'] == $_GET["meta_name"] ){
976 if( ( isset( $_GET["mb_type"] ) ) ){
977 ?>
978 <style type="text/css">
979 #media-upload-header #sidemenu li#tab-type_url,
980 #media-upload-header #sidemenu li#tab-gallery {
981 display: none;
982 }
983
984 #media-items tr.url,
985 #media-items tr.align,
986 #media-items tr.image_alt,
987 #media-items tr.image-size,
988 #media-items tr.post_excerpt,
989 #media-items tr.post_content,
990 #media-items tr.image_alt p,
991 #media-items table thead input.button,
992 #media-items table thead img.imgedit-wait-spin,
993 #media-items tr.submit a.wp-post-thumbnail {
994 display: none;
995 }
996
997 .media-item table thead img {
998 border: #DFDFDF solid 1px;
999 margin-right: 10px;
1000 }
1001
1002 </style>
1003 <script type="text/javascript">
1004 (function($){
1005
1006 $(document).ready(function(){
1007
1008 $('#media-items').bind('DOMNodeInserted',function(){
1009 $('input[value="Insert into Post"]').each(function(){
1010 $(this).attr('value','<?php _e("Select File")?>');
1011 });
1012 }).trigger('DOMNodeInserted');
1013
1014 $('form#filter').each(function(){
1015
1016 $(this).append('<input type="hidden" name="mb_type" value="<?php echo $_GET['mb_type']; ?>" />');
1017 $(this).append('<input type="hidden" name="mb_info_div" value="<?php echo $_GET['mb_info_div']; ?>" />');
1018
1019 });
1020 });
1021
1022 })(jQuery);
1023 </script>
1024 <?php
1025 }
1026 }
1027 }
1028 }
1029
1030 /* custom functionality for upload button */
1031
1032 function wck_media_send_to_editor($html, $id)
1033 {
1034 if( !empty( $_POST["_wp_http_referer"] ) ) {
1035 parse_str($_POST["_wp_http_referer"], $arr_postinfo);
1036 if (isset($arr_postinfo["mb_type"])) {
1037 $file_src = wp_get_attachment_url($id);
1038 $thumbnail = wp_get_attachment_image($id, array(80, 60), true);
1039 $file_name = get_the_title($id);
1040
1041 if (preg_match('/^.*?\.(\w+)$/', get_attached_file($id), $matches))
1042 $file_type = esc_html(strtoupper($matches[1]));
1043 else
1044 $file_type = strtoupper(str_replace('image/', '', get_post_mime_type($id)));
1045
1046 ?>
1047 <script type="text/javascript">
1048
1049 self.parent.window.<?php echo $arr_postinfo["mb_type"];?>.val('<?php echo $id; ?>');
1050 self.parent.window.<?php echo $arr_postinfo["mb_info_div"];?>.html('<?php echo $thumbnail ?><p><span class="file-name"><?php echo $file_name; ?></span><span class="file-type"><?php echo $file_type; ?></span><span class="wck-remove-upload"><?php _e( 'Remove', 'wck' )?></span></p>');
1051
1052 self.parent.tb_remove();
1053
1054 </script>
1055 <?php
1056 exit;
1057 }
1058 }
1059 else{
1060 return $html;
1061 }
1062
1063 }
1064
1065 /* WPML Compatibility */
1066
1067 /**
1068 * Function that ads the side metabox with the Syncronize translation button.
1069 * The meta box is only added if the lang attribute is set and
1070 * if any of the custom fields has the 'wckwpml' prefix.
1071 */
1072 function wck_add_sync_translation_metabox(){
1073 global $post;
1074
1075 if( isset( $_GET['lang'] ) ){
1076
1077 $has_wck_with_unserialize_fields = false;
1078 $custom_field_keys = get_post_custom_keys( $post->ID );
1079 if( !empty( $custom_field_keys ) ){
1080 foreach( $custom_field_keys as $custom_field_key ){
1081 $custom_field_key = explode( '_', $custom_field_key );
1082 if( $custom_field_key[0] == 'wckwpml' ){
1083 $has_wck_with_unserialize_fields = true;
1084 break;
1085 }
1086 }
1087 }
1088
1089 if($has_wck_with_unserialize_fields){
1090 add_meta_box( 'wck_sync_translation', __( 'Syncronize WCK', 'wck' ), array( &$this, 'wck_add_sync_box' ), $post->post_type, 'side', 'low' );
1091 }
1092
1093 }
1094 }
1095
1096 /**
1097 * Callback for the add_meta_box function that ads the "Syncronize WCK Translation" button.
1098 */
1099 function wck_add_sync_box(){
1100 global $post;
1101 ?>
1102 <span id="wck_sync" class="button" onclick="wckSyncTranslation(<?php echo $post->ID; ?>)"><?php _e( 'Syncronize WCK Translation', 'wck' ) ?></span>
1103 <?php
1104 }
1105
1106
1107
1108 /**
1109 * Function that recreates the serialized metas from the individual meta fields.
1110 */
1111 function wck_sync_translation_ajax(){
1112 if( !empty( $_POST['id'] ) )
1113 $post_id = $_POST['id'];
1114 else
1115 $post_id = '';
1116
1117 /* get all the custom fields keys for the post */
1118 $custom_field_keys = (array)get_post_custom_keys( $post_id );
1119
1120 /* initialize an array that will hold all the arrays for all the wck boxes */
1121 $wck_array = array();
1122
1123 /* go through all the custom fields and if it is a custom field created automaticaly for the translation add it to the $wck_array array*/
1124 if( !empty( $custom_field_keys ) ){
1125 foreach( $custom_field_keys as $cf ){
1126
1127 $cf_name_array = explode( '_', $cf );
1128
1129 /* a custom field added for the translation will have this form
1130 'wckwpml_{meta name}_{field name}_{entry position}_{field position}'
1131 */
1132 if( count( $cf_name_array ) >= 5 ){
1133
1134 $cf_name = implode( '_', array_slice( $cf_name_array, 1, -3 ) );
1135
1136 if( $cf_name_array[0] == 'wckwpml' ){
1137
1138 $wck_key = $cf_name_array[ count($cf_name_array) -3 ];
1139 $wck_position = $cf_name_array[ count($cf_name_array) -2 ];
1140 $wck_field_position = $cf_name_array[ count($cf_name_array) -1 ];
1141
1142 /* "$wck_position - 1" is required because fields in wck by default start at 0 and the additional
1143 translation fields start at 1 */
1144 $wck_array[$cf_name][$wck_position - 1][$wck_field_position][$wck_key] = get_post_meta($post_id,$cf,true);
1145
1146 }
1147 }
1148 }
1149 }
1150
1151
1152
1153 if( !empty( $wck_array ) ){
1154 /* sort the array so that the entry order and fields order are synced */
1155 self::deep_ksort( $wck_array );
1156
1157 /* remove the field position level in the array because it was added just so we could keep the field
1158 order in place */
1159 $wck_array = self::wck_reconstruct_array($wck_array);
1160
1161 /* add the translated meta to the post */
1162 foreach( $wck_array as $wck_key => $wck_meta ){
1163 update_post_meta( $post_id, $wck_key, $wck_meta );
1164 }
1165 echo('syncsuccess');
1166 }
1167
1168 exit;
1169 }
1170
1171 /**
1172 * Function that deep sorts a multy array by numeric key
1173 */
1174 function deep_ksort(&$arr) {
1175 ksort($arr);
1176 if( !empty( $arr ) ){
1177 foreach ($arr as &$a) {
1178 if (is_array($a) && !empty($a)) {
1179 self::deep_ksort($a);
1180 }
1181 }
1182 }
1183 }
1184
1185 /**
1186 * Function that removes the field position level
1187 */
1188 function wck_reconstruct_array($wck_array){
1189 if( !empty( $wck_array ) ){
1190 foreach( $wck_array as $wck_array_key => $wck_meta ){
1191 if( !empty( $wck_meta ) ){
1192 foreach( $wck_meta as $wck_meta_key => $wck_entry ){
1193 if( !empty( $wck_entry ) ){
1194 foreach( $wck_entry as $wck_entry_key => $wck_field ){
1195 $wck_array[$wck_array_key][$wck_meta_key][key($wck_field)] = current($wck_field);
1196 unset($wck_array[$wck_array_key][$wck_meta_key][$wck_entry_key]);
1197 }
1198 }
1199 }
1200 }
1201 }
1202 }
1203 return $wck_array;
1204 }
1205
1206
1207 function wck_get_meta_boxes( $screen = null ){
1208 global $wp_meta_boxes, $wck_objects;
1209
1210 if ( empty( $screen ) )
1211 $screen = get_current_screen();
1212 elseif ( is_string( $screen ) )
1213 $screen = convert_to_screen( $screen );
1214
1215 $page = $screen->id;
1216
1217 $wck_meta_boxes = array();
1218
1219 if( !empty( $wck_objects ) && !empty( $wp_meta_boxes[$page]['normal']['low'] ) ){
1220 foreach( $wck_objects as $key => $wck_object ){
1221 if( array_key_exists( $key, $wp_meta_boxes[$page]['normal']['low'] ) )
1222 $wck_meta_boxes[] = $key;
1223 }
1224 }
1225
1226 return $wck_meta_boxes;
1227 }
1228
1229
1230 /**
1231 * The function used to generate slugs in WCK
1232 *
1233 * @since 1.1.1
1234 *
1235 * @param string $string The input string from which we generate the slug
1236 * @return string $slug The henerated slug
1237 */
1238 static function wck_generate_slug( $string, $details = array() ){
1239 if( !empty( $details['slug'] ) )
1240 $slug = $details['slug'];
1241 else
1242 $slug = rawurldecode( sanitize_title_with_dashes( remove_accents( $string ) ) );
1243 return $slug;
1244 }
1245 }
1246
1247
1248 /*
1249 Helper class that creates admin menu pages ( both top level menu pages and submenu pages )
1250 Default Usage:
1251
1252 $args = array(
1253 'page_type' => 'menu_page',
1254 'page_title' => '',
1255 'menu_title' => '',
1256 'capability' => '',
1257 'menu_slug' => '',
1258 'icon_url' => '',
1259 'position' => '',
1260 'parent_slug' => ''
1261 );
1262
1263 'page_type' (string) (required) The type of page you want to add. Possible values: 'menu_page', 'submenu_page'
1264 'page_title' (string) (required) The text to be displayed in the title tags and header of
1265 the page when the menu is selected
1266 'menu_title' (string) (required) The on-screen name text for the menu
1267 'capability' (string) (required) The capability required for this menu to be displayed to
1268 the user.
1269 'menu_slug' (string) (required) The slug name to refer to this menu by (should be unique
1270 for this menu).
1271 'icon_url' (string) (optional for 'page_type' => 'menu_page') The url to the icon to be used for this menu.
1272 This parameter is optional. Icons should be fairly small, around 16 x 16 pixels
1273 for best results.
1274 'position' (integer) (optional for 'page_type' => 'menu_page') The position in the menu order this menu
1275 should appear.
1276 By default, if this parameter is omitted, the menu will appear at the bottom
1277 of the menu structure. The higher the number, the lower its position in the menu.
1278 WARNING: if 2 menu items use the same position attribute, one of the items may be
1279 overwritten so that only one item displays!
1280 'parent_slug' (string) (required for 'page_type' => 'submenu_page' ) The slug name for the parent menu
1281 (or the file name of a standard WordPress admin page) For examples see http://codex.wordpress.org/Function_Reference/add_submenu_page $parent_slug parameter
1282 'priority' (int) (optional) How important your function is. Alter this to make your function
1283 be called before or after other functions. The default is 10, so (for example) setting it to 5 would make it run earlier and setting it to 12 would make it run later.
1284
1285 public $hookname ( for required for 'page_type' => 'menu_page' ) string used internally to
1286 track menu page callbacks for outputting the page inside the global $menu array
1287 ( for required for 'page_type' => 'submenu_page' ) The resulting page's hook_suffix,
1288 or false if the user does not have the capability required.
1289 */
1290
1291 class WCK_Page_Creator_PB{
1292
1293 private $defaults = array(
1294 'page_type' => 'menu_page',
1295 'page_title' => '',
1296 'menu_title' => '',
1297 'capability' => '',
1298 'menu_slug' => '',
1299 'icon_url' => '',
1300 'position' => '',
1301 'parent_slug' => '',
1302 'priority' => 10,
1303 'network_page' => false
1304 );
1305 private $args;
1306 public $hookname;
1307
1308
1309 /* Constructor method for the class. */
1310 function __construct( $args ) {
1311
1312 /* Global that will hold all the arguments for all the menu pages */
1313 global $wck_pages;
1314
1315 /* Merge the input arguments and the defaults. */
1316 $this->args = wp_parse_args( $args, $this->defaults );
1317
1318 /* Add the settings for this page to the global object */
1319 $wck_pages[$this->args['page_title']] = $this->args;
1320
1321 if( !$this->args['network_page'] ){
1322 /* Hook the page function to 'admin_menu'. */
1323 add_action( 'admin_menu', array( &$this, 'wck_page_init' ), $this->args['priority'] );
1324 }
1325 else{
1326 /* Hook the page function to 'admin_menu'. */
1327 add_action( 'network_admin_menu', array( &$this, 'wck_page_init' ), $this->args['priority'] );
1328 }
1329 }
1330
1331 /**
1332 * Function that creates the admin page
1333 */
1334 function wck_page_init(){
1335 global $pb_wck_pages_hooknames;
1336
1337 /* Create the page using either add_menu_page or add_submenu_page functions depending on the 'page_type' parameter. */
1338 if( $this->args['page_type'] == 'menu_page' ){
1339 $this->hookname = add_menu_page( $this->args['page_title'], $this->args['menu_title'], $this->args['capability'], $this->args['menu_slug'], array( &$this, 'wck_page_template' ), $this->args['icon_url'], $this->args['position'] );
1340
1341 $pb_wck_pages_hooknames[$this->args['menu_slug']] = $this->hookname;
1342 }
1343 else if( $this->args['page_type'] == 'submenu_page' ){
1344 $this->hookname = add_submenu_page( $this->args['parent_slug'], $this->args['page_title'], $this->args['menu_title'], $this->args['capability'], $this->args['menu_slug'], array( &$this, 'wck_page_template' ) );
1345
1346 $pb_wck_pages_hooknames[$this->args['menu_slug']] = $this->hookname;
1347 }
1348
1349 do_action( 'WCK_Page_Creator_PB_after_init', $this->hookname );
1350
1351 /* Create a hook for adding meta boxes. */
1352 add_action( "load-{$this->hookname}", array( &$this, 'wck_settings_page_add_meta_boxes' ) );
1353 /* Load the JavaScript needed for the screen. */
1354 add_action( 'admin_enqueue_scripts', array( &$this, 'wck_page_enqueue_scripts' ) );
1355 add_action( "admin_head-{$this->hookname}", array( &$this, 'wck_page_load_scripts' ) );
1356 }
1357
1358 /**
1359 * Do action 'add_meta_boxes'. This hook isn't executed by default on a admin page so we have to add it.
1360 */
1361 function wck_settings_page_add_meta_boxes() {
1362 do_action( 'add_meta_boxes', $this->hookname );
1363 }
1364
1365 /**
1366 * Loads the JavaScript files required for managing the meta boxes on the theme settings
1367 * page, which allows users to arrange the boxes to their liking.
1368 *
1369 * @global string $bareskin_settings_page. The global setting page (returned by add_theme_page in function
1370 * bareskin_settings_page_init ).
1371 * @since 1.0.0
1372 * @param string $hook The current page being viewed.
1373 */
1374 function wck_page_enqueue_scripts( $hook ) {
1375 if ( $hook == $this->hookname ) {
1376 wp_enqueue_script( 'common' );
1377 wp_enqueue_script( 'wp-lists' );
1378 wp_enqueue_script( 'postbox' );
1379 }
1380 }
1381
1382 /**
1383 * Loads the JavaScript required for toggling the meta boxes on the theme settings page.
1384 *
1385 * @global string $bareskin_settings_page. The global setting page (returned by add_theme_page in function
1386 * bareskin_settings_page_init ).
1387 * @since 1.0.0
1388 */
1389 function wck_page_load_scripts() {
1390 ?>
1391 <script type="text/javascript">
1392 //<![CDATA[
1393 jQuery(document).ready( function($) {
1394 $('.if-js-closed').removeClass('if-js-closed').addClass('closed');
1395 postboxes.add_postbox_toggles( '<?php echo $this->hookname; ?>' );
1396 });
1397 //]]>
1398 </script><?php
1399 }
1400
1401 /**
1402 * Outputs default template for the page. It contains placeholders for metaboxes. It also
1403 * provides two action hooks 'wck_before_meta_boxes' and 'wck_after_meta_boxes'.
1404 */
1405 function wck_page_template(){
1406 ?>
1407 <div class="wrap">
1408
1409 <?php if( !empty( $this->args['page_icon'] ) ): ?>
1410 <div id="<?php echo $this->args['menu_slug'] ?>-icon" style="background: url('<?php echo $this->args['page_icon']; ?>') no-repeat;" class="icon32">
1411 <br/>
1412 </div>
1413 <?php endif; ?>
1414
1415 <h2><?php echo $this->args['page_title'] ?></h2>
1416
1417 <div id="poststuff">
1418
1419 <?php wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false ); ?>
1420 <?php wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false ); ?>
1421
1422 <?php do_action( 'wck_before_meta_boxes', $this->hookname ); ?>
1423
1424 <div class="metabox-holder">
1425 <div class="wck-post-body">
1426 <div class="post-box-container column-1 normal">
1427 <?php do_action( 'wck_before_column1_metabox_content', $this->hookname ); ?>
1428 <?php do_meta_boxes( $this->hookname, 'normal', null ); ?>
1429 <?php do_action( 'wck_after_column1_metabox_content', $this->hookname ); ?>
1430 </div>
1431 <div class="post-box-container column-3 advanced">
1432 <?php do_action( 'wck_before_column3_metabox_content', $this->hookname ); ?>
1433 <?php do_meta_boxes( $this->hookname, 'advanced', null ); ?>
1434 <?php do_action( 'wck_after_column3_metabox_content', $this->hookname ); ?>
1435 </div>
1436 </div>
1437 <div class="post-box-container column-2 side"><?php do_meta_boxes( $this->hookname, 'side', null ); ?></div>
1438
1439 </div>
1440
1441 <?php do_action( 'wck_after_meta_boxes', $this->hookname ); ?>
1442
1443 </div><!-- #poststuff -->
1444
1445 </div><!-- .wrap -->
1446 <?php
1447 }
1448 }
1449 ?>