PluginProbe ʕ •ᴥ•ʔ
Pods – Custom Content Types and Fields / 2.7.31.4
Pods – Custom Content Types and Fields v2.7.31.4
2.7.31.4 2.8.23.5 2.9.19.5 3.0.10.5 3.1.4.3 3.2.8.4 3.3.9.2 2.8.23.4 2.9.19.4 3.0.10.4 3.1.4.2 3.2.8.3 3.3.9.1 trunk 1.14.8 2.7.31.3 2.8.23.3 2.9.19.3 3.0.10.3 3.1.4.1 3.2.0 3.2.1 3.2.1.1 3.2.2 3.2.4 3.2.5 3.2.6 3.2.7 3.2.7.1 3.2.8 3.2.8.1 3.2.8.2 3.3.0 3.3.1 3.3.2 3.3.3 3.3.4 3.3.5 3.3.6 3.3.7 3.3.8 3.3.9
pods / components / Migrate-Packages / Migrate-Packages.php
pods / components / Migrate-Packages Last commit date
ui 5 days ago Migrate-Packages.php 5 days ago
Migrate-Packages.php
747 lines
1 <?php
2 /**
3 * Name: Migrate: Packages
4 *
5 * Menu Name: Migrate Packages
6 *
7 * Description: Import/Export your Pods, Fields, and other settings from any Pods site; Includes an API to Import/Export Packages via PHP
8 *
9 * Version: 2.0
10 *
11 * Category: Migration
12 *
13 * Plugin: pods-migrate-packages/pods-migrate-packages.php
14 *
15 * @package Pods\Components
16 * @subpackage Migrate-Packages
17 */
18
19 if ( class_exists( 'Pods_Migrate_Packages' ) ) {
20 return;
21 }
22
23 /**
24 * Class Pods_Migrate_Packages
25 */
26 class Pods_Migrate_Packages extends PodsComponent {
27
28 /**
29 * Enqueue styles
30 *
31 * @since 2.0.0
32 */
33 public function admin_assets() {
34
35 wp_enqueue_style( 'pods-wizard' );
36 }
37
38 /**
39 * Build admin area
40 *
41 * @param array $options Component options.
42 * @param string $component Component name.
43 *
44 * @since 2.0.0
45 */
46 public function admin( $options, $component ) {
47
48 $method = 'import_export';
49 // ajax_import
50 pods_view( PODS_DIR . 'components/Migrate-Packages/ui/wizard.php', compact( array_keys( get_defined_vars() ) ) );
51 }
52
53 /**
54 * Handle the Import/Export AJAX
55 *
56 * @param $params
57 */
58 public function ajax_import_export( $params ) {
59
60 if ( 'import' === $params->import_export ) {
61 $data = trim( $params->import_package );
62
63 $content = '<div class="pods-wizard-content">';
64
65 if ( ! empty( $data ) ) {
66 $imported = $this->import( $data );
67
68 if ( ! empty( $imported ) ) {
69 $content .= '<p>Import Complete! The following items were imported:</p>';
70
71 foreach ( $imported as $type => $import ) {
72 $content .= '<h4>' . ucwords( $type ) . '</h4>';
73
74 $content .= '<ul class="normal">';
75
76 foreach ( $import as $k => $what ) {
77 $content .= '<li>' . esc_html( $what ) . '</li>';
78 }
79
80 $content .= '</ul>';
81 }
82 }
83 } else {
84 $content .= '<p>Import Error: Invalid Package</p>';
85 }//end if
86
87 $content .= '</div>';
88
89 echo $content;
90 } elseif ( 'export' === $params->import_export ) {
91 $params = get_object_vars( $params );
92 foreach ( $params as $k => $v ) {
93 if ( is_array( $v ) ) {
94 $params[ $k ] = array_keys( array_filter( $v ) );
95 }
96 }
97
98 $package = $this->export( $params );
99
100 echo '<div class="pods-field-option">';
101
102 echo PodsForm::field( 'export_package', $package, 'paragraph', array( 'attributes' => array( 'style' => 'width: 94%; max-width: 94%; height: 300px;' ) ) );
103
104 echo '</div>';
105 }//end if
106
107 }
108
109 /**
110 * Import a Package
111 *
112 * @param string|array $data a JSON array package string, or an array of Package Data
113 * @param bool $replace Whether to replace existing pods entirely or just update them
114 *
115 * @return array|bool
116 *
117 * @static
118 * @since 2.0.5
119 */
120 public static function import( $data, $replace = false ) {
121
122 if ( ! defined( 'PODS_FIELD_STRICT' ) ) {
123 define( 'PODS_FIELD_STRICT', false );
124 }
125
126 if ( ! is_array( $data ) ) {
127 $json_data = @json_decode( $data, true );
128
129 if ( ! is_array( $json_data ) ) {
130 $json_data = @json_decode( pods_unslash( $data ), true );
131 }
132
133 $data = $json_data;
134 }
135
136 if ( ! is_array( $data ) || empty( $data ) ) {
137 return false;
138 }
139
140 $api = pods_api();
141
142 if ( ! isset( $data['meta'] ) || ! isset( $data['meta']['version'] ) || empty( $data['meta']['version'] ) ) {
143 return false;
144 }
145
146 if ( false === strpos( $data['meta']['version'], '.' ) && (int) $data['meta']['version'] < 1000 ) {
147 // Pods 1.x < 1.10
148 $data['meta']['version'] = implode( '.', str_split( $data['meta']['version'] ) );
149 } elseif ( false === strpos( $data['meta']['version'], '.' ) ) {
150 // Pods 1.10 <= 2.0
151 $data['meta']['version'] = pods_version_to_point( $data['meta']['version'] );
152 }
153
154 $found = array();
155
156 if ( isset( $data['pods'] ) && is_array( $data['pods'] ) ) {
157 foreach ( $data['pods'] as $pod_data ) {
158 if ( isset( $pod_data['id'] ) ) {
159 unset( $pod_data['id'] );
160 }
161
162 $pod = $api->load_pod( array( 'name' => $pod_data['name'] ), false );
163
164 $existing_fields = array();
165
166 if ( ! empty( $pod ) ) {
167 // Delete Pod if it exists
168 if ( $replace ) {
169 $api->delete_pod( array( 'id' => $pod['id'] ) );
170
171 $pod = array( 'fields' => array() );
172 } else {
173 $existing_fields = $pod['fields'];
174 }
175 } else {
176 $pod = array( 'fields' => array() );
177 }
178
179 // Backwards compatibility
180 if ( version_compare( $data['meta']['version'], '2.0', '<' ) ) {
181 $core_fields = array(
182 array(
183 'name' => 'created',
184 'label' => 'Date Created',
185 'type' => 'datetime',
186 'options' => array(
187 'datetime_format' => 'ymd_slash',
188 'datetime_time_type' => '12',
189 'datetime_time_format' => 'h_mm_ss_A',
190 ),
191 'weight' => 1,
192 ),
193 array(
194 'name' => 'modified',
195 'label' => 'Date Modified',
196 'type' => 'datetime',
197 'options' => array(
198 'datetime_format' => 'ymd_slash',
199 'datetime_time_type' => '12',
200 'datetime_time_format' => 'h_mm_ss_A',
201 ),
202 'weight' => 2,
203 ),
204 array(
205 'name' => 'author',
206 'label' => 'Author',
207 'type' => 'pick',
208 'pick_object' => 'user',
209 'options' => array(
210 'pick_format_type' => 'single',
211 'pick_format_single' => 'autocomplete',
212 'default_value' => '{@user.ID}',
213 ),
214 'weight' => 3,
215 ),
216 );
217
218 $found_fields = array();
219
220 if ( ! empty( $pod_data['fields'] ) ) {
221 foreach ( $pod_data['fields'] as $k => $field ) {
222 $field_type = $field['coltype'];
223
224 if ( 'txt' === $field_type ) {
225 $field_type = 'text';
226 } elseif ( 'desc' === $field_type ) {
227 $field_type = 'wysiwyg';
228 } elseif ( 'code' === $field_type ) {
229 $field_type = 'paragraph';
230 } elseif ( 'bool' === $field_type ) {
231 $field_type = 'boolean';
232 } elseif ( 'num' === $field_type ) {
233 $field_type = 'number';
234 } elseif ( 'date' === $field_type ) {
235 $field_type = 'datetime';
236 }
237
238 $multiple = min( max( (int) $field['multiple'], 0 ), 1 );
239
240 $new_field = array(
241 'name' => trim( $field['name'] ),
242 'label' => trim( $field['label'] ),
243 'description' => trim( $field['comment'] ),
244 'type' => $field_type,
245 'weight' => (int) $field['weight'],
246 'options' => array(
247 'required' => min( max( (int) $field['required'], 0 ), 1 ),
248 'unique' => min( max( (int) $field['unique'], 0 ), 1 ),
249 'input_helper' => $field['input_helper'],
250 ),
251 );
252
253 if ( in_array( $new_field['name'], $found_fields, true ) ) {
254 unset( $pod_data['fields'][ $k ] );
255
256 continue;
257 }
258
259 $found_fields[] = $new_field['name'];
260
261 if ( 'pick' === $field_type ) {
262 $new_field['pick_object'] = 'pod';
263 $new_field['pick_val'] = $field['pickval'];
264
265 if ( 'wp_user' === $field['pickval'] ) {
266 $new_field['pick_object'] = 'user';
267 } elseif ( 'wp_post' === $field['pickval'] ) {
268 $new_field['pick_object'] = 'post_type-post';
269 } elseif ( 'wp_page' === $field['pickval'] ) {
270 $new_field['pick_object'] = 'post_type-page';
271 } elseif ( 'wp_taxonomy' === $field['pickval'] ) {
272 $new_field['pick_object'] = 'taxonomy-category';
273 }
274
275 // This won't work if the field doesn't exist
276 // $new_field[ 'sister_id' ] = $field[ 'sister_field_id' ];
277 $new_field['options']['pick_filter'] = $field['pick_filter'];
278 $new_field['options']['pick_orderby'] = $field['pick_orderby'];
279 $new_field['options']['pick_display'] = '';
280 $new_field['options']['pick_size'] = 'medium';
281
282 if ( 1 == $multiple ) {
283 $new_field['options']['pick_format_type'] = 'multi';
284 $new_field['options']['pick_format_multi'] = 'checkbox';
285 $new_field['options']['pick_limit'] = 0;
286 } else {
287 $new_field['options']['pick_format_type'] = 'single';
288 $new_field['options']['pick_format_single'] = 'dropdown';
289 $new_field['options']['pick_limit'] = 1;
290 }
291 } elseif ( 'file' === $field_type ) {
292 $new_field['options']['file_format_type'] = 'multi';
293 $new_field['options']['file_type'] = 'any';
294 } elseif ( 'number' === $field_type ) {
295 $new_field['options']['number_decimals'] = 2;
296 } elseif ( 'desc' === $field['coltype'] ) {
297 $new_field['options']['wysiwyg_editor'] = 'tinymce';
298 } elseif ( 'text' === $field_type ) {
299 $new_field['options']['text_max_length'] = 128;
300 }//end if
301
302 if ( isset( $pod['fields'][ $new_field['name'] ] ) ) {
303 $new_field = array_merge( $pod['fields'][ $new_field['name'] ], $new_field );
304 }
305
306 $pod_data['fields'][ $k ] = $new_field;
307 }//end foreach
308 }//end if
309
310 if ( pods_var( 'id', $pod, 0 ) < 1 ) {
311 $pod_data['fields'] = array_merge( $core_fields, $pod_data['fields'] );
312 }
313
314 if ( empty( $pod_data['label'] ) ) {
315 $pod_data['label'] = ucwords( str_replace( '_', ' ', $pod_data['name'] ) );
316 }
317
318 if ( isset( $pod_data['is_toplevel'] ) ) {
319 $pod_data['show_in_menu'] = ( 1 == $pod_data['is_toplevel'] ? 1 : 0 );
320
321 unset( $pod_data['is_toplevel'] );
322 }
323
324 if ( isset( $pod_data['detail_page'] ) ) {
325 $pod_data['detail_url'] = $pod_data['detail_page'];
326
327 unset( $pod_data['detail_page'] );
328 }
329
330 if ( isset( $pod_data['before_helpers'] ) ) {
331 $pod_data['pre_save_helpers'] = $pod_data['before_helpers'];
332
333 unset( $pod_data['before_helpers'] );
334 }
335
336 if ( isset( $pod_data['after_helpers'] ) ) {
337 $pod_data['post_save_helpers'] = $pod_data['after_helpers'];
338
339 unset( $pod_data['after_helpers'] );
340 }
341
342 if ( isset( $pod_data['pre_drop_helpers'] ) ) {
343 $pod_data['pre_delete_helpers'] = $pod_data['pre_drop_helpers'];
344
345 unset( $pod_data['pre_drop_helpers'] );
346 }
347
348 if ( isset( $pod_data['post_drop_helpers'] ) ) {
349 $pod_data['post_delete_helpers'] = $pod_data['post_drop_helpers'];
350
351 unset( $pod_data['post_drop_helpers'] );
352 }
353
354 $pod_data['name'] = pods_clean_name( $pod_data['name'] );
355
356 $pod_data = array(
357 'name' => $pod_data['name'],
358 'label' => $pod_data['label'],
359 'type' => 'pod',
360 'storage' => 'table',
361 'fields' => $pod_data['fields'],
362 'options' => array(
363 'pre_save_helpers' => pods_var_raw( 'pre_save_helpers', $pod_data ),
364 'post_save_helpers' => pods_var_raw( 'post_save_helpers', $pod_data ),
365 'pre_delete_helpers' => pods_var_raw( 'pre_delete_helpers', $pod_data ),
366 'post_delete_helpers' => pods_var_raw( 'post_delete_helpers', $pod_data ),
367 'show_in_menu' => ( 1 == pods_var_raw( 'show_in_menu', $pod_data, 0 ) ? 1 : 0 ),
368 'detail_url' => pods_var_raw( 'detail_url', $pod_data ),
369 'pod_index' => 'name',
370 ),
371 );
372 }//end if
373
374 $pod = array_merge( $pod, $pod_data );
375
376 if ( in_array( $pod['name'], pods_reserved_keywords(), true ) ) {
377 // Extending objects when using reserved keywords.
378 // This will then accept `post`, `page` etc. as Pods object names.
379 $pod['create_extend'] = 'extend';
380 }
381
382 foreach ( $pod['fields'] as $k => $field ) {
383 if ( isset( $field['id'] ) && ! isset( $existing_fields[ $field['name'] ] ) ) {
384 unset( $pod['fields'][ $k ]['id'] );
385 }
386
387 if ( isset( $field['pod_id'] ) ) {
388 unset( $pod['fields'][ $k ]['pod_id'] );
389 }
390
391 if ( isset( $existing_fields[ $field['name'] ] ) ) {
392 $existing_field = pods_api()->load_field(
393 array(
394 'name' => $field['name'],
395 'pod' => $pod['name'],
396 )
397 );
398 if ( $existing_field ) {
399 $pod['fields'][ $k ]['id'] = $existing_field['id'];
400 }
401 }
402
403 if ( isset( $field['pod'] ) ) {
404 unset( $pod['fields'][ $k ]['pod'] );
405 }
406 }//end foreach
407
408 if ( $api->save_pod( $pod ) ) {
409 if ( ! isset( $found['pods'] ) ) {
410 $found['pods'] = array();
411 }
412
413 $found['pods'][ $pod['name'] ] = $pod['label'];
414 }
415
416 }//end foreach
417 }//end if
418
419 if ( isset( $data['templates'] ) && is_array( $data['templates'] ) ) {
420 foreach ( $data['templates'] as $template_data ) {
421 if ( isset( $template_data['id'] ) ) {
422 unset( $template_data['id'] );
423 }
424
425 $template = $api->load_template( array( 'name' => $template_data['name'] ) );
426
427 if ( ! empty( $template ) ) {
428 // Delete Template if it exists
429 if ( $replace ) {
430 $api->delete_template( array( 'id' => $template['id'] ) );
431
432 $template = array();
433 }
434 } else {
435 $template = array();
436 }
437
438 $template = array_merge( $template, $template_data );
439
440 $api->save_template( $template );
441
442 if ( ! isset( $found['templates'] ) ) {
443 $found['templates'] = array();
444 }
445
446 $found['templates'][ $template['name'] ] = $template['name'];
447 }//end foreach
448 }//end if
449
450 // Backwards compatibility
451 if ( isset( $data['pod_pages'] ) ) {
452 $data['pages'] = $data['pod_pages'];
453
454 unset( $data['pod_pages'] );
455 }
456
457 if ( isset( $data['pages'] ) && is_array( $data['pages'] ) ) {
458 foreach ( $data['pages'] as $page_data ) {
459 if ( isset( $page_data['id'] ) ) {
460 unset( $page_data['id'] );
461 }
462
463 $page = $api->load_page( array( 'name' => pods_var_raw( 'name', $page_data, pods_var_raw( 'uri', $page_data ), null, true ) ) );
464
465 if ( ! empty( $page ) ) {
466 // Delete Page if it exists
467 if ( $replace ) {
468 $api->delete_page( array( 'id' => $page['id'] ) );
469
470 $page = array();
471 }
472 } else {
473 $page = array();
474 }
475
476 // Backwards compatibility
477 if ( isset( $page_data['uri'] ) ) {
478 $page_data['name'] = $page_data['uri'];
479
480 unset( $page_data['uri'] );
481 }
482
483 if ( isset( $page_data['phpcode'] ) ) {
484 $page_data['code'] = $page_data['phpcode'];
485
486 unset( $page_data['phpcode'] );
487 }
488
489 $page = array_merge( $page, $page_data );
490
491 $page['name'] = trim( $page['name'], '/' );
492
493 $api->save_page( $page );
494
495 if ( ! isset( $found['pages'] ) ) {
496 $found['pages'] = array();
497 }
498
499 $found['pages'][ $page['name'] ] = $page['name'];
500 }//end foreach
501 }//end if
502
503 if ( isset( $data['helpers'] ) && is_array( $data['helpers'] ) ) {
504 foreach ( $data['helpers'] as $helper_data ) {
505 if ( isset( $helper_data['id'] ) ) {
506 unset( $helper_data['id'] );
507 }
508
509 $helper = $api->load_helper( array( 'name' => $helper_data['name'] ) );
510
511 if ( ! empty( $helper ) ) {
512 // Delete Helper if it exists
513 if ( $replace ) {
514 $api->delete_helper( array( 'id' => $helper['id'] ) );
515
516 $helper = array();
517 }
518 } else {
519 $helper = array();
520 }
521
522 // Backwards compatibility
523 if ( isset( $helper_data['phpcode'] ) ) {
524 $helper_data['code'] = $helper_data['phpcode'];
525
526 unset( $helper_data['phpcode'] );
527 }
528
529 if ( isset( $helper_data['type'] ) ) {
530 if ( 'before' === $helper_data['type'] ) {
531 $helper_data['type'] = 'pre_save';
532 } elseif ( 'after' === $helper_data['type'] ) {
533 $helper_data['type'] = 'post_save';
534 }
535 }
536
537 $helper = array_merge( $helper, $helper_data );
538
539 if ( isset( $helper['type'] ) ) {
540 $helper['helper_type'] = $helper['type'];
541
542 unset( $helper['helper_type'] );
543 }
544
545 $api->save_helper( $helper );
546
547 if ( ! isset( $found['helpers'] ) ) {
548 $found['helpers'] = array();
549 }
550
551 $found['helpers'][ $helper['name'] ] = $helper['name'];
552 }//end foreach
553 }//end if
554
555 $found = apply_filters( 'pods_packages_import', $found, $data, $replace );
556
557 if ( ! empty( $found ) ) {
558 return $found;
559 }
560
561 return false;
562 }
563
564 /**
565 * Export a Package
566 *
567 * $params['pods'] string|array|bool Pod IDs to export, or set to true to export all
568 * $params['templates'] string|array|bool Template IDs to export, or set to true to export all
569 * $params['pages'] string|array|bool Page IDs to export, or set to true to export all
570 * $params['helpers'] string|array|bool Helper IDs to export, or set to true to export all
571 *
572 * @param array $params Array of things to export
573 *
574 * @return array|bool
575 *
576 * @static
577 * @since 2.0.5
578 */
579 public static function export( $params ) {
580
581 $export = array(
582 'meta' => array(
583 'version' => PODS_VERSION,
584 'build' => time(),
585 ),
586 );
587
588 if ( is_object( $params ) ) {
589 $params = get_object_vars( $params );
590 }
591
592 $api = pods_api();
593
594 $pod_ids = pods_var_raw( 'pods', $params );
595 $template_ids = pods_var_raw( 'templates', $params );
596 $page_ids = pods_var_raw( 'pages', $params );
597 $helper_ids = pods_var_raw( 'helpers', $params );
598
599 if ( ! empty( $pod_ids ) ) {
600 $api_params = array( 'export' => true );
601
602 if ( true !== $pod_ids ) {
603 $api_params['ids'] = (array) $pod_ids;
604 }
605
606 $export['pods'] = $api->load_pods( $api_params );
607
608 $options_ignore = array(
609 'pod_id',
610 'old_name',
611 'object_type',
612 'object_name',
613 'object_hierarchical',
614 'table',
615 'meta_table',
616 'pod_table',
617 'field_id',
618 'field_index',
619 'field_slug',
620 'field_type',
621 'field_parent',
622 'field_parent_select',
623 'meta_field_id',
624 'meta_field_index',
625 'meta_field_value',
626 'pod_field_id',
627 'pod_field_index',
628 'object_fields',
629 'join',
630 'where',
631 'where_default',
632 'orderby',
633 'pod',
634 'recurse',
635 'table_info',
636 'attributes',
637 'group',
638 'grouped',
639 'developer_mode',
640 'dependency',
641 'depends-on',
642 'excludes-on',
643 );
644
645 $field_types = PodsForm::field_types();
646
647 $field_type_options = array();
648
649 foreach ( $field_types as $type => $field_type_data ) {
650 $field_type_options[ $type ] = PodsForm::ui_options( $type );
651 }
652
653 foreach ( $export['pods'] as &$pod ) {
654 if ( isset( $pod['options'] ) ) {
655 $pod = array_merge( $pod, $pod['options'] );
656
657 unset( $pod['options'] );
658 }
659
660 foreach ( $pod as $option => $option_value ) {
661 if ( in_array( $option, $options_ignore, true ) || null === $option_value ) {
662 unset( $pod[ $option ] );
663 }
664 }
665
666 if ( ! empty( $pod['fields'] ) ) {
667 foreach ( $pod['fields'] as &$field ) {
668 if ( isset( $field['options'] ) ) {
669 $field = array_merge( $field, $field['options'] );
670
671 unset( $field['options'] );
672 }
673
674 foreach ( $field as $option => $option_value ) {
675 if ( in_array( $option, $options_ignore, true ) || null === $option_value ) {
676 unset( $field[ $option ] );
677 }
678 }
679
680 foreach ( $field_type_options as $type => $options ) {
681 if ( $type == pods_var( 'type', $field ) ) {
682 continue;
683 }
684
685 foreach ( $options as $option_data ) {
686 if ( isset( $option_data['group'] ) && is_array( $option_data['group'] ) && ! empty( $option_data['group'] ) ) {
687 if ( isset( $field[ $option_data['name'] ] ) ) {
688 unset( $field[ $option_data['name'] ] );
689 }
690
691 foreach ( $option_data['group'] as $group_option_data ) {
692 if ( isset( $field[ $group_option_data['name'] ] ) ) {
693 unset( $field[ $group_option_data['name'] ] );
694 }
695 }
696 } elseif ( isset( $field[ $option_data['name'] ] ) ) {
697 unset( $field[ $option_data['name'] ] );
698 }
699 }
700 }//end foreach
701 }//end foreach
702 }//end if
703 }//end foreach
704 }//end if
705
706 if ( ! empty( $template_ids ) ) {
707 $api_params = array();
708
709 if ( true !== $template_ids ) {
710 $api_params['ids'] = (array) $template_ids;
711 }
712
713 $export['templates'] = $api->load_templates( $api_params );
714 }
715
716 if ( ! empty( $page_ids ) ) {
717 $api_params = array();
718
719 if ( true !== $page_ids ) {
720 $api_params['ids'] = (array) $page_ids;
721 }
722
723 $export['pages'] = $api->load_pages( $api_params );
724 }
725
726 if ( ! empty( $helper_ids ) ) {
727 $api_params = array();
728
729 if ( true !== $helper_ids ) {
730 $api_params['ids'] = (array) $helper_ids;
731 }
732
733 $export['helpers'] = $api->load_helpers( $api_params );
734 }
735
736 $export = apply_filters( 'pods_packages_export', $export, $params );
737
738 if ( 1 == count( $export ) ) {
739 return false;
740 }
741
742 $export = version_compare( PHP_VERSION, '5.4.0', '>=' ) ? json_encode( $export, JSON_UNESCAPED_UNICODE ) : json_encode( $export );
743
744 return $export;
745 }
746 }
747