web/wp-content/plugins/acf-extended/includes/admin/tools/module-export.php (276 lines of code) (raw):

<?php if(!defined('ABSPATH')){ exit; } if(!class_exists('acfe_module_export')): class acfe_module_export extends ACF_Admin_Tool{ // vars public $module; public $action; public $data = array(); /** * construct * * @param $module */ function __construct($module){ // module $this->module = $module; // vars $this->name = $this->module->get_export_tool(); $this->title = $this->module->get_message('export_title'); parent::__construct(); } /** * html * * @return void */ function html(){ // single if($this->is_active()){ $this->html_single(); // archive }else{ $this->html_archive(); } } /** * html_archive */ function html_archive(){ if(!method_exists($this->module, 'get_items')){ return; } // vars $choices = array(); $items = $this->module->get_raw_items(); if($items){ foreach($items as $item){ $choices[ $item['name'] ] = esc_html($item['label']); } } ?> <?php if(acfe_is_acf_6()): ?> <div class="acf-postbox-header"> <h2 class="acf-postbox-title"><?php echo $this->module->get_message('export_description'); ?></h2> </div> <div class="acf-postbox-inner"> <?php else: ?> <p><?php echo $this->module->get_message('export_description'); ?></p> <?php endif; ?> <div class="acf-fields"> <?php if(!empty($choices)){ // render acf_render_field_wrap(array( 'label' => $this->module->get_message('export_select'), 'type' => 'checkbox', 'name' => 'keys', 'prefix' => false, 'value' => false, 'toggle' => true, 'choices' => $choices, 'class' => 'acfe-module-export-choices' )); }else{ echo '<div style="padding:15px 12px;">'; echo $this->module->get_message('export_not_found'); echo '</div>'; } ?> </div> <?php $disabled = empty($choices) ? 'disabled="disabled"' : ''; ?> <p class="acf-submit"> <?php if(in_array('json', $this->module->export_actions)){ ?> <button type="submit" name="action" class="button button-primary" value="json" <?php echo $disabled; ?>><?php _e('Export File'); ?></button> <?php } ?> <?php if(in_array('php', $this->module->export_actions)){ ?> <button type="submit" name="action" class="button" value="php" <?php echo $disabled; ?>><?php _e('Generate PHP'); ?></button> <?php } ?> </p> <?php if(acfe_is_acf_6()): ?> </div> <?php endif; ?> <?php } /** * html_single */ function html_single(){ // enqueue wp_enqueue_script('code-editor'); wp_enqueue_style('code-editor'); ?> <?php if(acfe_is_acf_6()): ?> <div class="acf-postbox-header"> <h2 class="acf-postbox-title"><?php echo $this->module->get_message('export_description'); ?></h2> </div> <?php endif; ?> <div class="acf-postbox-columns" style="margin-top: 0;margin-right: 280px;margin-bottom: 0;margin-left: 0;padding: 0;"> <div class="acf-postbox-main"> <?php $instructions = array( __("You can copy and paste the following code to your theme's <code>functions.php</code> file or include it within an external file.", 'acfe') ); if($this->module->get_message('export_instructions')){ $instructions[] = $this->module->get_message('export_instructions'); } ?> <p><?php echo implode(' ', $instructions); ?></p> <div id="acf-admin-tool-export"> <textarea id="acf-export-textarea" readonly="true"><?php foreach($this->data as $item){ // translation $l10n = acf_get_setting('l10n'); $l10n_textdomain = acf_get_setting('l10n_textdomain'); if($l10n && $l10n_textdomain){ acf_update_setting('l10n_var_export', true); $item = $this->module->translate_item($item); acf_update_setting('l10n_var_export', false); } // cleanup keys $item = $this->module->prepare_item_for_export($item); // var export $code = acfe_var_export($item); // echo echo $this->module->export_code($code, $item) . "\r\n" . "\r\n"; } ?></textarea> </div> <p class="acf-submit"> <a class="button" id="acf-export-copy"><?php _e('Copy to clipboard', 'acf'); ?></a> </p> <script type="text/javascript"> (function($){ if(typeof acf === 'undefined'){ return; } // acf 6.0 add display block; $('#acf-admin-tools #normal-sortables').css('display', 'block'); acf.addAction('ready', function(){ // elements var $a = $('#acf-export-copy'); var $textarea = $('#acf-export-textarea'); // initialize code mirror var edit = wp.codeEditor.initialize($textarea.get(0), { codemirror: $.extend(wp.codeEditor.defaultSettings.codemirror, { lineNumbers: true, lineWrapping: true, styleActiveLine: false, continueComments: true, indentUnit: 4, tabSize: 1, indentWithTabs: false, mode: 'text/x-php', extraKeys: { 'Tab': function(cm){cm.execCommand('indentMore')}, 'Shift-Tab': function(cm){cm.execCommand('indentLess')}, }, }) }); // set height edit.codemirror.getScrollerElement().style.minHeight = 15 * 18.5 + 'px'; if(!document.queryCommandSupported('copy')){ return $a.remove(); } $a.on('click', function(e){ e.preventDefault(); var $this = $(this); // copy navigator.clipboard.writeText(edit.codemirror.getValue()).then(function(){ // tooltip acf.newTooltip({ text: "<?php _e('Copied', 'acf'); ?>", timeout: 250, target: $this, }); }); }); }); })(jQuery); </script> </div> <div class="acf-postbox-side"> <div class="acf-panel acf-panel-selection -open"> <h3 class="acf-panel-title"><?php echo $this->module->get_message('export_select'); ?> <i class="dashicons dashicons-arrow-down"></i></h3> <div class="acf-panel-inside"> <?php // vars $choices = array(); $selected = $this->get_keys(); $items = $this->module->get_items(); if($items){ foreach($items as $item){ $choices[ $item['name'] ] = esc_html($item['label']); } } // render acf_render_field_wrap(array( 'type' => 'checkbox', 'name' => 'keys', 'prefix' => false, 'value' => $selected, 'toggle' => true, 'choices' => $choices, )); ?> </div> </div> <p class="acf-submit"> <?php if(in_array('json', $this->module->export_actions)){ ?> <button type="submit" name="action" class="button button-primary" value="json"><?php _e('Export File'); ?></button> <?php } ?> <?php if(in_array('php', $this->module->export_actions)){ ?> <button type="submit" name="action" class="button" value="php"><?php _e('Generate PHP'); ?></button> <?php } ?> </p> </div> </div> <?php } /** * load * * @return void */ function load(){ if(!$this->is_active()){ return; } $this->action = $this->get_action(); $this->data = $this->get_data(); // Json if($this->action === 'json'){ $this->submit(); // PHP }elseif($this->action === 'php'){ // add notice if(!empty($this->data)){ $count = count($this->data); $text = $this->module->get_message('export_success_single'); if($count > 1){ $text = sprintf($this->module->get_message('export_success_multiple'), $count); } acf_add_admin_notice($text, 'success'); } } } /** * submit * * @return ACF_Admin_Notice|n|void */ function submit(){ // vars $this->action = $this->get_action(); $this->data = $this->get_data(); $keys = wp_list_pluck($this->data, 'name'); // validate if(!$this->data){ return acf_add_admin_notice($this->module->get_message('export_not_selected'), 'warning'); } // Json if($this->action === 'json'){ // prefix $prefix = (count($this->data) > 1) ? $this->module->export_files['multiple'] : $this->module->export_files['single']; // slugs $slugs = implode('-', $keys); // date $date = date('Y-m-d'); // file $file_name = 'acfe-export-' . $prefix . '-' . $slugs . '-' . $date . '.json'; // data $data = array(); foreach($this->data as $item){ // cleanup keys $item = $this->module->prepare_item_for_export($item); // append to data $data[] = $item; } // headers header("Content-Description: File Transfer"); header("Content-Disposition: attachment; filename={$file_name}"); header("Content-Type: application/json; charset=utf-8"); // return echo acf_json_encode($data); // PHP }elseif($this->action === 'php'){ // url $url = add_query_arg(array( 'keys' => implode('+', $keys), 'action' => 'php' ), $this->get_url()); // redirect wp_redirect($url); } exit; } /** * get_data * * @return array */ function get_data(){ // vars $keys = $this->get_keys(); $data = array(); foreach($keys as $name){ // get item $item = $this->module->get_raw_item($name); if($item){ $data[] = $item; } } return $data; } /** * get_keys * * @return array|false|string[] */ function get_keys(){ // vars $keys_post = acf_maybe_get_POST('keys'); $keys_get = acf_maybe_get_GET('keys'); $keys = array(); // $_POST if($keys_post){ $keys = (array) $keys_post; // $_GET }elseif($keys_get){ $keys_get = str_replace(' ', '+', $keys_get); $keys = explode('+', $keys_get); } return $keys; } /** * get_action * * @return false|mixed|null */ function get_action(){ // vars $action = acfe_maybe_get_REQUEST('action'); // check allowed if(!in_array($action, $this->module->export_actions)){ return current($this->module->export_actions); } // return return $action; } } endif;