oont-contents/plugins/woocommerce-pdf-ips-templates/includes/class-wcpdf-templates-settings.php
2025-02-08 15:10:23 +01:00

1663 lines
58 KiB
PHP

<?php
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
if ( ! class_exists( 'WooCommerce_PDF_IPS_Templates_Settings' ) ) {
class WooCommerce_PDF_IPS_Templates_Settings {
public $settings;
public $option = 'wpo_wcpdf_editor_settings';
public function __construct() {
$this->settings = get_option( $this->option, [] );
// Hook into main pdf plugin settings
add_filter( 'wpo_wcpdf_settings_tabs', array( $this, 'settings_tab' ) );
add_action( 'admin_init', array( $this, 'init_settings' ) );
add_action( 'wpo_wcpdf_before_settings', array( $this, 'column_editor' ) );
add_action( 'admin_enqueue_scripts', array( $this, 'load_scripts_styles' ), 99 );
// Fix compatibility issues with YIT themes and other plugins loading jquery-ui styles everywhere
add_action( 'admin_enqueue_scripts', array( $this, 'dequeue_jquery_ui_styles' ), 999 );
// Footer height settings (also initiated in the template functions but registered here too for backwards compatibility)
add_filter( 'wpo_wcpdf_settings_fields_general', array( $this, 'add_footer_height_setting' ), 10, 4 );
// Replace extra fields description based on selected template
add_filter( 'wpo_wcpdf_settings_fields_general', array( $this, 'extra_fields_description_replacement' ), 10, 4 );
// Add field to columns or totals
add_action( 'wp_ajax_wcpdf_templates_add_totals_columns_field', array( $this, 'add_totals_columns_field' ) );
// Add custom block
add_action( 'wp_ajax_wcpdf_templates_add_custom_block', array( $this, 'add_custom_block' ) );
// remove single use query arg for restoring defaults
add_action( 'updated_option', array( $this, 'remove_load_defaults_after_updating_option' ), 10, 3 );
// update editor columns/totals positions
add_action( 'updated_option', array( $this, 'update_totals_columns_positions' ), 99, 3 );
// show notice when the Simple template is active
add_action( 'wpo_wcpdf_before_settings_page', array( $this, 'simple_template_notice' ), 1 );
// import/export customizer settings
add_filter( 'wpo_wcpdf_setting_types', array( $this, 'customizer_setting_types' ), 10, 1 );
add_filter( 'wpo_wcpdf_export_settings', array( $this, 'customizer_settings_export' ), 10, 2 );
add_filter( 'wpo_wcpdf_import_settings_option', array( $this, 'customizer_settings_import_option' ), 10, 3 );
}
/**
* Display notification when the Simple theme is selected
*/
public function simple_template_notice ( $active_tab ) {
if ( $active_tab == 'editor' ) {
$settings = get_option( 'wpo_wcpdf_settings_general', array() );
if ( is_array( $settings ) && isset( $settings['template_path'] ) ) {
if ( $settings['template_path'] == 'default/Simple' ) {
?>
<div class="notice notice-warning inline">
<p>
<?php
echo wp_kses_post( __( 'The <strong>Simple</strong> template has limited compatibilty with the Customizer. You will need to switch your template to a premium one, e.g. <strong>Simple Premium</strong>, if you want to take full advantage of the Customizer.', 'wpo_wcpdf_templates' ) );
?>
</p>
</div>
<?php
}
}
}
}
/**
* Styles for settings page
*/
public function load_scripts_styles ( $hook ) {
// only load on our own settings page
// maybe find a way to refer directly to WPO\WC\PDF_Invoices\Settings::$options_page_hook ?
if ( !( $hook == 'woocommerce_page_wpo_wcpdf_options_page' || $hook == 'settings_page_wpo_wcpdf_options_page' || ( isset($_GET['page']) && $_GET['page'] == 'wpo_wcpdf_options_page' ) ) ) {
return;
}
wp_enqueue_script(
'wcpdf-editor',
WPO_WCPDF_Templates()->plugin_url() . '/assets/js/editor.js',
array( 'jquery-ui-accordion', 'jquery-ui-sortable', 'jquery-ui-draggable', 'jquery-ui-tabs', 'wc-enhanced-select', 'jquery-tiptip' ),
WPO_WCPDF_TEMPLATES_VERSION
);
wp_enqueue_style(
'wcpdf-editor',
WPO_WCPDF_Templates()->plugin_url() . '/assets/css/editor.css',
array(),
WPO_WCPDF_TEMPLATES_VERSION
);
wp_enqueue_style(
'woocommerce-pdf-ips-templates-jquery-ui-style',
'https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css'
);
wp_localize_script(
'wcpdf-editor',
'wpo_wcpdf_templates',
array(
'ajaxurl' => admin_url( 'admin-ajax.php' ), // URL to WordPress ajax handling page
'nonce' => wp_create_nonce('wpo_wcpdf_templates'),
)
);
}
/**
* Dequeue YIT styles (they're all over the place man!)
*/
public function dequeue_jquery_ui_styles ( $hook ) {
// only load on our own settings page
// maybe find a way to refer directly to WPO\WC\PDF_Invoices\Settings::$options_page_hook ?
if ( !( $hook == 'woocommerce_page_wpo_wcpdf_options_page' || $hook == 'settings_page_wpo_wcpdf_options_page' ) ) {
return;
}
$offending_styles = array (
'jquery-ui-overcast',
'yit-plugin-metaboxes',
'jquery-ui-style',
'jquery-ui',
'jquery-style',
'yit-jquery-ui-style',
'jquery-ui-style-css',
'yith-wcaf',
'yith_ywdpd_admin',
'ig-pb-jquery-ui',
'jquery_smoothness_ui',
'fblb_jquery-ui',
'wp-review-admin-ui-css',
'tribe-jquery-ui-theme',
'jquery-style-css',
);
$offending_scripts = array();
if ( class_exists( '\Zhours\Setup' ) ) { // Order Store Hours Scheduler for WooCommerce
$offending_styles[] = 'custom_wp_admin_css';
$offending_scripts[] = 'wc-jquery-ui';
$offending_scripts[] = 'wc-multidatespicker';
}
foreach ($offending_styles as $handle) {
wp_dequeue_style( $handle );
wp_deregister_style( $handle );
}
foreach ($offending_scripts as $handle) {
wp_dequeue_script( $handle );
wp_deregister_script( $handle );
}
}
public function get_settings ( $template_type, $settings_name, $document = null ) {
$editor_settings = get_option( $this->option );
$settings_key = 'fields_'.$template_type.'_'.$settings_name;
if (isset($editor_settings[$settings_key])) {
$settings = $editor_settings[$settings_key];
} else {
$settings = array();
}
// use defaults if settings not defined
if ( empty($settings) && !isset($editor_settings['settings_saved'])) {
// only packing slip is different
if ( $template_type == 'packing-slip' ) {
switch ($settings_name) {
case 'columns':
$settings = array (
1 => array (
'type' => 'sku',
),
2 => array (
'type' => 'description',
'show_meta' => 1,
),
3 => array (
'type' => 'quantity',
),
);
break;
case 'totals':
$settings = array();
break;
}
} else {
switch ($settings_name) {
case 'columns':
$settings = array (
1 => array (
'type' => 'sku',
),
2 => array (
'type' => 'description',
'show_meta' => 1,
),
3 => array (
'type' => 'quantity',
),
4 => array (
'type' => 'price',
'price_type' => 'single',
'tax' => 'excl',
'discount' => 'before',
),
5 => array (
'type' => 'tax_rate',
),
6 => array (
'type' => 'price',
'price_type' => 'total',
'tax' => 'excl',
'discount' => 'before',
),
);
break;
case 'totals':
$settings = array(
1 => array (
'type' => 'subtotal',
'tax' => 'excl',
'discount' => 'before',
),
2 => array (
'type' => 'discount',
'tax' => 'excl',
),
3 => array (
'type' => 'shipping',
'tax' => 'excl',
),
4 => array (
'type' => 'fees',
'tax' => 'excl',
),
5 => array (
'type' => 'vat',
),
6 => array (
'type' => 'total',
'tax' => 'incl',
),
);
break;
}
}
}
return apply_filters( 'wpo_wcpdf_template_editor_settings', $settings, $template_type, $settings_name, $document );
}
/**
* add Editor settings tab to the PDF Invoice settings page
* @param array $tabs slug => Title
* @return array $tabs with Editor
*/
public function settings_tab( $tabs ) {
$tabs['editor'] = array(
'title' => __( 'Customizer', 'wpo_wcpdf_templates' ),
'preview_states' => 2,
);
return $tabs;
}
public function column_editor ( $settings_tab ) {
if ( $settings_tab != 'editor') {
return;
}
// hidden option to check if user has saved/modified the settings (to know whether to load defaults or not!)
printf( '<input type="hidden" data-key="type" name="%s[settings_saved]" value="1">', $this->option );
// show drag & drop editor
$editor_args = array(
'menu' => $this->option,
'id' => 'fields',
'documents' => array(),
'description' => __( 'Drag & drop any of these fields to the documents below', 'wpo_wcpdf_templates' ),
);
$documents = WPO_WCPDF()->documents->get_documents( 'all' );
foreach ( $documents as $document ) {
$document_type = $document->get_type();
$editor_args['documents'][$document_type] = $document->get_title();
}
$this->columns_editor_callback( $editor_args );
?>
<style>
#wpo-wcpdf-settings .form-table td,
#wpo-wcpdf-settings .form-table th {
display: block !important;
padding: 0 !important;
}
</style>
<?php
}
/**
* User settings.
*/
public function init_settings() {
$page = $option_group = $option_name = $this->option;
$settings_fields = array(
array(
'type' => 'section',
'id' => 'custom_styles',
'title' => '',
'callback' => 'section',
),
array(
'type' => 'setting',
'id' => 'custom_styles',
'title' => sprintf('<h3>%s</h3>', __( 'Custom Styles', 'wpo_wcpdf_templates' )),
'callback' => 'textarea',
'section' => 'custom_styles',
'args' => array(
'option_name' => $option_name,
'id' => 'custom_styles',
'description' => __( 'Enter any custom styles here to modify/override the template styles', 'wpo_wcpdf_templates' ),
'width' => '72',
'height' => '8',
)
),
);
// allow plugins to alter settings fields
$settings_fields = apply_filters( 'wpo_wcpdf_settings_fields_customizer', $settings_fields, $page, $option_group, $option_name );
WPO_WCPDF()->settings->add_settings_fields( $settings_fields, $page, $option_group, $option_name );
return;
}
/**
* Section null callback.
*
* @return void.
*/
public function section_options_callback() {
}
public function get_sorting_options() {
return array (
'title' => __( 'Sort items by', 'wpo_wcpdf_templates' ),
'options' => array (
'default' => __( 'Default', 'wpo_wcpdf_templates' ),
'product' => __( 'Product name', 'wpo_wcpdf_templates' ),
'sku' => __( 'SKU', 'wpo_wcpdf_templates' ),
'category' => __( 'Category', 'wpo_wcpdf_templates' ),
),
);
}
public function get_columns_field_options() {
return apply_filters( 'wpo_wcpdf_templates_customizer_column_blocks', array (
'position' => array (
'title' => __( 'Position', 'wpo_wcpdf_templates' ),
'options' => array (
'label' => array(
'type' => 'text',
'description' => __( 'Label', 'wpo_wcpdf_templates' ),
),
),
),
'sku' => array (
'title' => __( 'SKU', 'wpo_wcpdf_templates' ),
'options' => array (
'label' => array(
'type' => 'text',
'description' => __( 'Label', 'wpo_wcpdf_templates' ),
'placeholder' => __( 'Use default', 'wpo_wcpdf_templates' ),
),
),
),
'thumbnail' => array (
'title' => __( 'Thumbnail', 'wpo_wcpdf_templates' ),
'options' => array (
'label' => array(
'type' => 'text',
'description' => __( 'Label', 'wpo_wcpdf_templates' ),
'placeholder' => __( 'Use default', 'wpo_wcpdf_templates' ),
),
),
),
'description' => array (
'title' => __( 'Product', 'wpo_wcpdf_templates' ),
'options' => array (
'label' => array(
'type' => 'text',
'description' => __( 'Label', 'wpo_wcpdf_templates' ),
'placeholder' => __( 'Use default', 'wpo_wcpdf_templates' ),
),
'show_sku' => array(
'type' => 'checkbox',
'description' => __( 'Show SKU', 'wpo_wcpdf_templates' ),
),
'show_weight' => array(
'type' => 'checkbox',
'description' => __( 'Show weight', 'wpo_wcpdf_templates' ),
),
'show_meta' => array(
'type' => 'checkbox',
'description' => __( 'Show meta data', 'wpo_wcpdf_templates' ),
),
'show_external_plugin_meta' => array(
'type' => 'checkbox',
'description' => __( 'Show third party plugin data', 'wpo_wcpdf_templates' ),
),
'custom_text' => array(
'type' => 'textarea',
'rows' => 4,
'description' => __( 'Text', 'wpo_wcpdf_templates' ),
),
),
),
'quantity' => array (
'title' => __( 'Quantity', 'wpo_wcpdf_templates' ),
'options' => array (
'label' => array(
'type' => 'text',
'description' => __( 'Label', 'wpo_wcpdf_templates' ),
'placeholder' => __( 'Use default', 'wpo_wcpdf_templates' ),
),
),
),
'all_meta' => array (
'title' => __( 'Variation / item meta', 'wpo_wcpdf_templates' ),
'options' => array (
'label' => array(
'type' => 'text',
'description' => __( 'Label', 'wpo_wcpdf_templates' ),
'placeholder' => __( 'Use default', 'wpo_wcpdf_templates' ),
),
'product_fallback' => array(
'type' => 'checkbox',
'description' => __( 'Fallback to product variation data', 'wpo_wcpdf_templates' ),
),
),
),
'item_meta' => array (
'title' => __( 'Item meta (single)', 'wpo_wcpdf_templates' ),
'options' => array (
'field_name' => array(
'type' => 'text',
'description' => __( 'Meta key / name', 'wpo_wcpdf_templates' ),
),
'label' => array(
'type' => 'text',
'description' => __( 'Label', 'wpo_wcpdf_templates' ),
),
),
),
'price' => array (
'title' => __( 'Price', 'wpo_wcpdf_templates' ),
'options' => array (
'label' => array(
'type' => 'text',
'description' => __( 'Label', 'wpo_wcpdf_templates' ),
'placeholder' => __( 'Use default', 'wpo_wcpdf_templates' ),
),
'price_type' => array(
'type' => 'select',
'options' => array(
'single' => __( 'Single price', 'wpo_wcpdf_templates' ),
'total' => __( 'Total price', 'wpo_wcpdf_templates' ),
),
),
'tax' => array(
'type' => 'select',
'options' => array(
'incl' => __( 'Including tax', 'wpo_wcpdf_templates' ),
'excl' => __( 'Excluding tax', 'wpo_wcpdf_templates' ),
),
),
'discount' => array(
'type' => 'select',
'options' => array(
'before' => __( 'Before discount', 'wpo_wcpdf_templates' ),
'after' => __( 'After discount', 'wpo_wcpdf_templates' ),
),
),
'only_discounted' => array(
'type' => 'checkbox',
'description' => __( 'Show column only for discounted orders', 'wpo_wcpdf_templates' ),
),
),
),
'regular_price' => array (
'title' => __( 'Regular price', 'wpo_wcpdf_templates' ),
'options' => array (
'label' => array(
'type' => 'text',
'description' => __( 'Label', 'wpo_wcpdf_templates' ),
'placeholder' => __( 'Use default', 'wpo_wcpdf_templates' ),
),
'price_type' => array(
'type' => 'select',
'options' => array(
'single' => __( 'Single price', 'wpo_wcpdf_templates' ),
'total' => __( 'Total price', 'wpo_wcpdf_templates' ),
),
),
'tax' => array(
'type' => 'select',
'options' => array(
'incl' => __( 'Including tax', 'wpo_wcpdf_templates' ),
'excl' => __( 'Excluding tax', 'wpo_wcpdf_templates' ),
),
),
'only_sale' => array(
'type' => 'checkbox',
'description' => __( 'Only show for items that sold for a sale price', 'wpo_wcpdf_templates' ),
),
),
),
'discount' => array (
'title' => __( 'Discount', 'wpo_wcpdf_templates' ),
'options' => array (
'label' => array(
'type' => 'text',
'description' => __( 'Label', 'wpo_wcpdf_templates' ),
'placeholder' => __( 'Use default', 'wpo_wcpdf_templates' ),
),
'price_type' => array(
'type' => 'select',
'options' => array(
'single' => __( 'Single price', 'wpo_wcpdf_templates' ),
'total' => __( 'Total price', 'wpo_wcpdf_templates' ),
'percent' => __( 'Percent', 'wpo_wcpdf_templates' ),
),
),
'tax' => array(
'type' => 'select',
'options' => array(
'incl' => __( 'Including tax', 'wpo_wcpdf_templates' ),
'excl' => __( 'Excluding tax', 'wpo_wcpdf_templates' ),
),
),
'only_discounted' => array(
'type' => 'checkbox',
'description' => __( 'Show column only for discounted orders', 'wpo_wcpdf_templates' ),
),
),
),
'vat' => array (
'title' => __( 'VAT', 'wpo_wcpdf_templates' ),
'options' => array (
'label' => array(
'type' => 'text',
'description' => __( 'Label', 'wpo_wcpdf_templates' ),
'placeholder' => __( 'Use default', 'wpo_wcpdf_templates' ),
),
'price_type' => array(
'type' => 'select',
'options' => array(
'single' => __( 'Single price', 'wpo_wcpdf_templates' ),
'total' => __( 'Total price', 'wpo_wcpdf_templates' ),
),
),
'discount' => array(
'type' => 'select',
'options' => array(
'before' => __( 'Before discount', 'wpo_wcpdf_templates' ),
'after' => __( 'After discount', 'wpo_wcpdf_templates' ),
),
),
'split' => array(
'type' => 'checkbox',
'description' => __( 'Split', 'wpo_wcpdf_templates' ) . wc_help_tip( __( 'Split 2 or more taxes in separated columns.', 'wpo_wcpdf_templates' ) ),
),
'only_discounted' => array(
'type' => 'checkbox',
'description' => __( 'Show column only for discounted orders', 'wpo_wcpdf_templates' ),
),
'dash_for_zero' => array(
'type' => 'checkbox',
'description' => sprintf(
/* translators: (—) */
__( 'Use a dash %s for zero taxes', 'wpo_wcpdf_templates' ),
'(—)'
),
),
),
),
'tax_rate' => array (
'title' => __( 'Tax rate', 'wpo_wcpdf_templates' ),
'options' => array (
'label' => array(
'type' => 'text',
'description' => __( 'Label', 'wpo_wcpdf_templates' ),
'placeholder' => __( 'Use default', 'wpo_wcpdf_templates' ),
),
'show_tax_name' => array(
'type' => 'checkbox',
'description' => __( 'Show tax rate name', 'wpo_wcpdf_templates' ),
),
),
),
'weight' => array (
'title' => __( 'Weight', 'wpo_wcpdf_templates' ),
'options' => array (
'label' => array(
'type' => 'text',
'description' => __( 'Label', 'wpo_wcpdf_templates' ),
'placeholder' => __( 'Use default', 'wpo_wcpdf_templates' ),
),
'qty' => array(
'type' => 'select',
'options' => array(
'single' => __( 'Single weight', 'wpo_wcpdf_templates' ),
'total' => __( 'Total weight', 'wpo_wcpdf_templates' ),
),
),
'show_unit' => array(
'type' => 'checkbox',
'description' => __( 'Append weight unit', 'wpo_wcpdf_templates' ),
),
),
),
'dimensions' => array (
'title' => __( 'Product dimensions', 'wpo_wcpdf_templates' ),
'options' => array (
'label' => array(
'type' => 'text',
'description' => __( 'Label', 'wpo_wcpdf_templates' ),
'placeholder' => __( 'Use default', 'wpo_wcpdf_templates' ),
),
),
),
'product_attribute' => array (
'title' => __( 'Attribute', 'wpo_wcpdf_templates' ),
'options' => array (
'attribute_name' => array(
'type' => 'text',
'description' => __( 'Attribute name', 'wpo_wcpdf_templates' ),
),
'label' => array(
'type' => 'text',
'description' => __( 'Label', 'wpo_wcpdf_templates' ),
),
),
),
'product_custom' => array (
'title' => __( 'Custom field (Product)', 'wpo_wcpdf_templates' ),
'options' => array (
'field_name' => array(
'type' => 'text',
'description' => __( 'Field name', 'wpo_wcpdf_templates' ),
),
'label' => array(
'type' => 'text',
'description' => __( 'Label', 'wpo_wcpdf_templates' ),
),
),
),
'product_description' => array (
'title' => __( 'Product description', 'wpo_wcpdf_templates' ),
'options' => array (
'label' => array(
'type' => 'text',
'description' => __( 'Label', 'wpo_wcpdf_templates' ),
'placeholder' => __( 'Use default', 'wpo_wcpdf_templates' ),
),
'description_type' => array(
'type' => 'select',
'options' => array(
'short' => __( 'Short description', 'wpo_wcpdf_templates' ),
'long' => __( 'Long description', 'wpo_wcpdf_templates' ),
),
),
'use_variation_description' => array(
'type' => 'checkbox',
'description' => __( 'Use variation description when available', 'wpo_wcpdf_templates' ),
),
),
),
'product_categories' => array (
'title' => __( 'Product categories', 'wpo_wcpdf_templates' ),
'options' => array (
'label' => array(
'type' => 'text',
'description' => __( 'Label', 'wpo_wcpdf_templates' ),
'placeholder' => __( 'Use default', 'wpo_wcpdf_templates' ),
),
),
),
'cb' => array (
'title' => __( 'Checkbox', 'wpo_wcpdf_templates' ),
'options' => array (
'label' => array(
'type' => 'text',
'description' => __( 'Label', 'wpo_wcpdf_templates' ),
),
),
),
'static_text' => array (
'title' => __( 'Text', 'wpo_wcpdf_templates' ),
'options' => array (
'label' => array(
'type' => 'text',
'description' => __( 'Label', 'wpo_wcpdf_templates' ),
),
'text' => array(
'type' => 'textarea',
'rows' => 4,
'description' => __( 'Text', 'wpo_wcpdf_templates' ),
),
),
),
'custom_function' => array (
'title' => __( 'Custom function', 'wpo_wcpdf_templates' ),
'options' => array (
'label' => array(
'type' => 'text',
'description' => __( 'Label', 'wpo_wcpdf_templates' ),
),
'function' => array(
'type' => 'text',
'description' => __( 'Function name', 'wpo_wcpdf_templates' ),
),
),
),
) );
}
public function get_totals_field_options() {
return apply_filters( 'wpo_wcpdf_templates_customizer_total_blocks', array (
'subtotal' => array (
'title' => __( 'Subtotal', 'wpo_wcpdf_templates' ),
'options' => array (
'label' => array(
'type' => 'text',
'description' => __( 'Label', 'wpo_wcpdf_templates' ),
'placeholder' => __( 'Use default', 'wpo_wcpdf_templates' ),
),
'tax' => array(
'type' => 'select',
'options' => array(
'incl' => __( 'Including tax', 'wpo_wcpdf_templates' ),
'excl' => __( 'Excluding tax', 'wpo_wcpdf_templates' ),
),
),
'discount' => array(
'type' => 'select',
'options' => array(
'before' => __( 'Before discount', 'wpo_wcpdf_templates' ),
'after' => __( 'After discount', 'wpo_wcpdf_templates' ),
),
),
'only_discounted' => array(
'type' => 'checkbox',
'description' => __( 'Show only for discounted orders', 'wpo_wcpdf_templates' ),
),
),
),
'discount' => array (
'title' => __( 'Discount', 'wpo_wcpdf_templates' ),
'options' => array (
'label' => array(
'type' => 'text',
'description' => __( 'Label', 'wpo_wcpdf_templates' ),
'placeholder' => __( 'Use default', 'wpo_wcpdf_templates' ),
),
'tax' => array(
'type' => 'select',
'options' => array(
'incl' => __( 'Including tax', 'wpo_wcpdf_templates' ),
'excl' => __( 'Excluding tax', 'wpo_wcpdf_templates' ),
),
),
'show_percentage' => array(
'type' => 'checkbox',
'description' => __( 'Add discount percentage to label', 'wpo_wcpdf_templates' ),
),
'show_codes' => array(
'type' => 'checkbox',
'description' => __( 'Add coupon codes to label', 'wpo_wcpdf_templates' ),
),
'breakdown_coupons' => array(
'type' => 'checkbox',
'description' => __( 'Print each coupon discount separately', 'wpo_wcpdf_templates' ),
),
),
),
'shipping' => array (
'title' => __( 'Shipping', 'wpo_wcpdf_templates' ),
'options' => array (
'label' => array(
'type' => 'text',
'description' => __( 'Label', 'wpo_wcpdf_templates' ),
'placeholder' => __( 'Use default', 'wpo_wcpdf_templates' ),
),
'hide_free' => array(
'type' => 'checkbox',
'description' => __( 'Hide when free', 'wpo_wcpdf_templates' ),
),
'method' => array(
'type' => 'checkbox',
'description' => _x( 'Show method instead of cost', 'shipping method', 'wpo_wcpdf_templates' ),
),
'tax' => array(
'type' => 'select',
'options' => array(
'incl' => __( 'Including tax', 'wpo_wcpdf_templates' ),
'excl' => __( 'Excluding tax', 'wpo_wcpdf_templates' ),
),
),
),
),
'fees' => array (
'title' => __( 'Fees', 'wpo_wcpdf_templates' ),
'options' => array (
'tax' => array(
'type' => 'select',
'options' => array(
'incl' => __( 'Including tax', 'wpo_wcpdf_templates' ),
'excl' => __( 'Excluding tax', 'wpo_wcpdf_templates' ),
),
),
),
),
'vat' => array (
'title' => __( 'VAT', 'wpo_wcpdf_templates' ),
'options' => array (
'label' => array(
'type' => 'text',
'description' => __( 'Label', 'wpo_wcpdf_templates' ),
'placeholder' => __( 'Use default', 'wpo_wcpdf_templates' ),
),
'percent' => array(
'type' => 'checkbox',
'description' => __( 'Include %', 'wpo_wcpdf_templates' ),
),
'base' => array(
'type' => 'checkbox',
'description' => __( 'Include tax base/subtotal', 'wpo_wcpdf_templates' ),
),
'single_total' => array(
'type' => 'checkbox',
'description' => __( 'Single total', 'wpo_wcpdf_templates' ),
),
'tax_type' => array(
'type' => 'select',
'options' => array(
'combined' => __( 'Combined tax', 'wpo_wcpdf_templates' ),
'shipping' => __( 'Shipping tax', 'wpo_wcpdf_templates' ),
'product' => __( 'Product tax', 'wpo_wcpdf_templates' ),
),
),
),
),
'vat_base' => array (
'title' => __( 'VAT base/subtotal', 'wpo_wcpdf_templates' ),
'options' => array (
'label' => array(
'type' => 'text',
'description' => __( 'Label', 'wpo_wcpdf_templates' ),
'placeholder' => __( 'Use default', 'wpo_wcpdf_templates' ),
),
'percent' => array(
'type' => 'checkbox',
'description' => __( 'Include %', 'wpo_wcpdf_templates' ),
),
),
),
'total' => array (
'title' => __( 'Grand total', 'wpo_wcpdf_templates' ),
'options' => array (
'label' => array(
'type' => 'text',
'description' => __( 'Label', 'wpo_wcpdf_templates' ),
'placeholder' => __( 'Use default', 'wpo_wcpdf_templates' ),
),
'tax' => array(
'type' => 'select',
'options' => array(
'incl' => __( 'Including tax', 'wpo_wcpdf_templates' ),
'excl' => __( 'Excluding tax', 'wpo_wcpdf_templates' ),
),
),
),
),
'order_weight' => array (
'title' => __( 'Total weight', 'wpo_wcpdf_templates' ),
'options' => array (
'label' => array(
'type' => 'text',
'description' => __( 'Label', 'wpo_wcpdf_templates' ),
'placeholder' => __( 'Use default', 'wpo_wcpdf_templates' ),
),
'show_unit' => array(
'type' => 'checkbox',
'description' => __( 'Append weight unit', 'wpo_wcpdf_templates' ),
),
),
),
'total_qty' => array (
'title' => __( 'Total quantity', 'wpo_wcpdf_templates' ),
'options' => array (
'label' => array(
'type' => 'text',
'description' => __( 'Label', 'wpo_wcpdf_templates' ),
'placeholder' => __( 'Use default', 'wpo_wcpdf_templates' ),
),
),
),
'custom_function' => array (
'title' => __( 'Custom function', 'wpo_wcpdf_templates' ),
'options' => array (
'function' => array(
'type' => 'text',
'description' => __( 'Function name', 'wpo_wcpdf_templates' ),
),
),
),
'text' => array (
'title' => __( 'Text', 'wpo_wcpdf_templates' ),
'options' => array (
'label' => array(
'type' => 'text',
'description' => __( 'Label', 'wpo_wcpdf_templates' ),
),
'text' => array(
'type' => 'textarea',
'rows' => 4,
'description' => __( 'Text', 'wpo_wcpdf_templates' ),
),
),
),
) );
}
/**
* Editor callback.
*/
public function columns_editor_callback( $args ) {
$menu = $args['menu'];
$id = $args['id'];
$options = get_option( $menu, array() );
$available_sorting = $this->get_sorting_options();
$available_columns = $this->get_columns_field_options();
$available_totals = $this->get_totals_field_options();
?>
<div id="documents" style="display:none;">
<ul class="document-tabs">
<?php foreach ($args['documents'] as $document => $title) {
$document_id = $id.'_'.$document;
printf( '<li><a href="#%1$s" data-document_type="%2$s">%3$s</a></li>', $document_id, $document, $title );
}
?>
</ul>
<?php foreach ($args['documents'] as $document => $title): ?>
<?php
$document_id = $id.'_'.$document;
$sections = array(
'columns' => __( 'Item Columns', 'wpo_wcpdf_templates'),
'totals' => __( 'Total Rows', 'wpo_wcpdf_templates'),
);
printf('<div id="%1$s" class="document-content fields %2$s" data-document-type="%2$s">', $document_id, $document);
if ( has_filter('wpo_wcpdf_template_editor_defaults') ) {
printf( '<a class="button load-defaults" href="%s">%s</a>', esc_url( add_query_arg( 'load-defaults', 'true' ) ), __( 'Load defaults (all documents!)', 'wpo_wcpdf_templates') );
}
foreach ($sections as $section_key => $section_title) {
$document_section = $document_id.'_'.$section_key
?>
<h4 class="columns-header">
<?php echo $section_title;
if ( $section_key == 'columns' ) { ?>
<span><?php _e( 'Need help?', 'wpo_wcpdf_templates'); ?> <a href="https://docs.wpovernight.com/woocommerce-pdf-invoices-packing-slips/using-the-customizer/" target="_blank"><?php _e( 'Using the Customizer', 'wpo_wcpdf_templates'); ?></a></span>
<?php } ?>
</h4>
<?php
if ( $section_key == 'columns' ) {
?>
<div class="sort-items">
<span><?php echo $available_sorting['title']; ?></span>
<select name="<?php printf( '%s[sort_items][%s]', $menu, $document ); ?>">
<?php
foreach ( $available_sorting['options'] as $sort_key => $sort_description ) {
$selected = '';
if ( array_key_exists( 'sort_items', $options ) ) {
$selected = ( isset( $options['sort_items'][$document] ) && $options['sort_items'][$document] == $sort_key ) ? 'selected="selected"' : '';
}
printf( '<option value="%s" %s>%s</option>', $sort_key, $selected, $sort_description );
}
?>
</select>
</div>
<?php
}
printf( '<div class="document field-list %1$s" data-option="%2$s[%3$s]" data-section_key="%1$s">', $section_key, $menu, $document_section );
$current = isset( $options[$document_section] ) ? $options[$document_section] : '';
if ( ! isset( $options['settings_saved'] ) || isset( $_GET['load-defaults'] ) ) {
$current = apply_filters( 'wpo_wcpdf_template_editor_defaults', $current, $document, $section_key );
}
if ( ! empty( $current ) ) {
foreach ( $current as $key => $field ) {
$available = 'available_'.$section_key;
if ( isset( $field['type'] ) && in_array( $field['type'], array_keys( ${$available} ) ) ) {
$name = sprintf( '%s[%s][%s]', $menu, $document_section, $key);
$this->display_table_field( $field['type'], $key, ${$available}[$field['type']], $args, $name, $field );
}
}
} ?>
<div class="document field add-field">
<span class="dashicons dashicons-plus add-field-plus"></span>
<select class='dropdown-add-field'>
<?php
if ($section_key == 'columns') {
printf( '<option value="default">%s</option>', __( 'Add a column', 'wpo_wcpdf_templates' ) );
foreach ($available_columns as $column_key => $column) {
printf( '<option value="%1$s">%2$s</option>', $column_key, $column['title'] );
}
} elseif ($section_key == 'totals') {
printf( '<option value="default">%s</option>', __( 'Add a row', 'wpo_wcpdf_templates' ) );
foreach ($available_totals as $total_key => $total) {
printf( '<option value="%1$s">%2$s</option>', $total_key, $total['title'] );
}
}
?>
</select>
</div>
<?php
echo '</div>'; // document field-list
}
?>
<!-- Custom Blocks -->
<h4 class="columns-header"><?php echo __( 'Custom blocks', 'wpo_wcpdf_templates') ?><span><?php _e( 'Need help?', 'wpo_wcpdf_templates'); ?> <a href="https://docs.wpovernight.com/woocommerce-pdf-invoices-packing-slips/using-custom-blocks/" target="_blank"><?php _e( 'Using Custom Blocks', 'wpo_wcpdf_templates'); ?></a></span></h4>
<?php
$section_key = 'custom';
$document_section = $document_id.'_'.$section_key;
printf( '<div class="document field-list custom-blocks" data-option="%1$s[%2$s]" data-section="%2$s">', $menu, $document_section );
$current = isset( $options[$document_section] ) ? $options[$document_section] : '';
if (!empty($current)) {
foreach ($current as $key => $field) {
$name = sprintf( '%s[%s][%s]', $menu, $document_section, $key);
$this->display_custom_block( $key, $args, $name, $field );
}
}
?>
</div>
<br/><div class="button add-custom-block"><?php echo __( 'Add a block', 'wpo_wcpdf_templates') ?></div>
</div> <!-- document-content -->
<?php endforeach ?>
</div>
<?php
}
public function add_totals_columns_field() {
if ( ! isset( $_REQUEST['section'] ) || ! isset( $_REQUEST['field_value'] ) || ! isset( $_REQUEST['document_type'] ) ) {
die();
}
$options = array(
'columns' => $this->get_columns_field_options(),
'totals' => $this->get_totals_field_options(),
);
$section = sanitize_text_field( $_REQUEST['section'] );
$field_value = sanitize_text_field( $_REQUEST['field_value'] );
$document_type = sanitize_text_field( $_REQUEST['document_type'] );
if ( 'default' == $field_value ) {
die();
}
// we should provide a bigger number to not clash with the default keys (1,2,3,...).
// when the settings are saved it will reassign the default keys again.
$field_key = time();
$field = $options[ $section ][ $field_value ];
$args = array(
'menu' => $this->option,
'id' => 'fields',
);
$name = sprintf( '%s[fields_%s_%s][%s]', $args['menu'], $document_type, $section, $field_key );
$this->display_table_field( $field_value, $field_key, $field, $args, $name );
die();
}
public function update_totals_columns_positions( $option, $old_value, $value ) {
if ( $option == $this->option ) {
$this->settings = get_option( $this->option, array() ); // get latest settings
$documents = WPO_WCPDF()->documents->get_documents();
$update = false;
foreach ( $documents as $document ) {
$keys = array(
"fields_{$document->get_type()}_columns",
"fields_{$document->get_type()}_totals",
);
foreach ( $keys as $key ) {
if ( isset( $this->settings[ $key ] ) ) {
$this->settings[ $key ] = array_combine( range( 1, count( $this->settings[ $key ] ) ), array_values( $this->settings[ $key ] ) );
$update = true;
}
}
}
if ( $update ) {
update_option( $this->option, $this->settings );
}
}
}
public function display_table_field( $field_value, $field_key, $field, $args, $name = '', $current = '' ) {
$menu = $args['menu'];
$id = $args['id'];
$options_class = isset( $field['options'] ) ? 'options' : '';
printf( '<div class="field %1$s %2$s" data-name="%2$s" data-option="%3$s[%4$s]" data-key="%5$s">', $options_class, $field_value, $menu, $id, $field_key );
?>
<span class="dashicons dashicons-dismiss delete-field"></span>
<div class="field-title"><?php echo $field['title']; ?></div>
<?php
if ( isset( $field['options'] ) ) {
echo '<div class="field-options">';
foreach ( $field['options'] as $option_key => $field_option ) {
$this->display_table_field_options( $option_key, $field_option, $current, $name );
}
echo '</div>';
}
printf( '<input type="hidden" data-key="type" name="%s[type]" value="%s">', $name, $field_value );
?>
</div>
<?php
}
public function display_table_field_options ($option_key, $field_option, $current, $name = '' ) {
$name = sprintf('%s[%s]', $name, $option_key);
$current = !empty($current[$option_key]) ? $current[$option_key] : '';
echo '<div class="field-option">';
switch ($field_option['type']) {
case 'checkbox':
printf( '<input type="checkbox" data-key="%s" name="%s" value="1" %s>', $option_key, $name, checked( 1, $current, false ) );
printf( '<span class="option-description">%s</span>', $field_option['description'] );
break;
case 'select':
printf( '<select data-key="%s" name="%s">', $option_key, $name );
foreach ($field_option['options'] as $select_option_value => $select_option_title) {
printf( '<option value="%s" %s>%s</option>', $select_option_value, selected( $current, $select_option_value, false ), $select_option_title );
}
echo '</select>';
break;
case 'text':
printf( '<span class="option-description">%s: </span>', $field_option['description'] );
$placeholder = isset($field_option['placeholder']) ? $field_option['placeholder'] : '';
printf( '<input type="text" data-key="%s" name="%s" value="%s" placeholder="%s">', $option_key, $name, $current, $placeholder );
break;
case 'textarea':
printf( '<div class="option-description">%s: </div>', $field_option['description'] );
$placeholder = isset($field_option['placeholder']) ? $field_option['placeholder'] : '';
$cols = isset($field_option['cols']) ? $field_option['cols'] : '';
$rows = isset($field_option['rows']) ? $field_option['rows'] : '';
printf( '<textarea data-key="%s" name="%s" placeholder="%s" cols="%s" rows="%s">%s</textarea>', $option_key, $name, $placeholder, $cols, $rows, $current );
break;
}
echo '</div>';
}
public function add_custom_block() {
check_ajax_referer( 'wpo_wcpdf_templates', 'security' );
$id = 'fields';
$args = array(
'menu' => $this->option,
'id' => $id
);
$key = uniqid();
$document = $_POST['document_type'];
$document_section = "{$id}_{$document}_custom";
$name = sprintf( '%s[%s][%s]', $this->option, $document_section, $key);
$this->display_custom_block( $key , $args, $name );
die();
}
public function display_custom_block ( $field_key, $args, $name = '', $current = array() ) {
$menu = $args['menu'];
$id = $args['id'];
printf( '<div class="custom-block field" data-name="%s" data-option="%s[%s]">', $field_key, $menu, $id);
?>
<span class="dashicons dashicons-dismiss delete-field"></span>
<table class="custom-block-settings">
<tr>
<td><?php _e('Type', 'wpo_wcpdf_templates'); ?></td>
<td>
<?php
$types = array(
'text' => __('Text', 'wpo_wcpdf_templates'),
'custom_field' => __('Custom Field', 'wpo_wcpdf_templates'),
'user_meta' => __('User Meta', 'wpo_wcpdf_templates'),
);
$option_key = 'type';
$this->select_element(array(
'option_name' => "{$name}[{$option_key}]",
'options' => $types,
'current' => !empty($current[$option_key]) ? $current[$option_key] : '',
'class' => "custom-block-type",
));
?>
</td>
</tr>
<tr>
<td><?php _e('Position', 'wpo_wcpdf_templates'); ?></td>
<td>
<?php
$positions = array(
'wpo_wcpdf_before_document' => __('Before document', 'wpo_wcpdf_templates'),
'wpo_wcpdf_before_shop_name' => __('Before the shop name', 'wpo_wcpdf_templates'),
'wpo_wcpdf_after_shop_name' => __('After the shop name', 'wpo_wcpdf_templates'),
'wpo_wcpdf_before_shop_address' => __('Before the shop address', 'wpo_wcpdf_templates'),
'wpo_wcpdf_after_shop_address' => __('After the shop address', 'wpo_wcpdf_templates'),
'wpo_wcpdf_before_document_label' => __('Before the document label', 'wpo_wcpdf_templates'),
'wpo_wcpdf_after_document_label' => __('After the document label', 'wpo_wcpdf_templates'),
'wpo_wcpdf_before_billing_address' => __('Before the billing address', 'wpo_wcpdf_templates'),
'wpo_wcpdf_after_billing_address' => __('After the billing address', 'wpo_wcpdf_templates'),
'wpo_wcpdf_before_shipping_address' => __('Before the shipping address', 'wpo_wcpdf_templates'),
'wpo_wcpdf_after_shipping_address' => __('After the shipping address', 'wpo_wcpdf_templates'),
'wpo_wcpdf_before_order_data' => __('Before the order data (invoice number, order date, etc.)', 'wpo_wcpdf_templates'),
'wpo_wcpdf_after_order_data' => __('After the order data', 'wpo_wcpdf_templates'),
'wpo_wcpdf_before_customer_notes' => __('Before the customer notes', 'wpo_wcpdf_templates'),
'wpo_wcpdf_after_customer_notes' => __('After the customer notes', 'wpo_wcpdf_templates'),
'wpo_wcpdf_before_order_details' => __('Before the order details table with all items', 'wpo_wcpdf_templates'),
'wpo_wcpdf_after_order_details' => __('After the order details table', 'wpo_wcpdf_templates'),
'wpo_wcpdf_before_footer' => __('Before the footer', 'wpo_wcpdf_templates'),
'wpo_wcpdf_after_footer' => __('After the footer', 'wpo_wcpdf_templates'),
'wpo_wcpdf_after_document' => __('After document', 'wpo_wcpdf_templates'),
);
$option_key = 'position';
$this->select_element(array(
'option_name' => "{$name}[{$option_key}]",
'options' => $positions,
'current' => !empty($current[$option_key]) ? $current[$option_key] : '',
));
?>
</td>
</tr>
<tr>
<td><?php _e('Label / header', 'wpo_wcpdf_templates'); ?></td>
<td>
<?php
$option_key = 'label';
$this->input_element(array(
'option_name' => "{$name}[{$option_key}]",
'current' => !empty($current[$option_key]) ? $current[$option_key] : '',
));
?>
</td>
</tr>
<tr class="meta_key" data-types="custom_field user_meta">
<td><?php _e('Field name / meta key', 'wpo_wcpdf_templates'); ?></td>
<td data-tip="<?php _e( "Only blocks of type “Text” support the use of {{placeholders}}", 'wpo_wcpdf_templates' ); ?>">
<?php
$option_key = 'meta_key';
$this->input_element(array(
'option_name' => "{$name}[{$option_key}]",
'current' => !empty($current[$option_key]) ? $current[$option_key] : '',
// 'class' => 'meta_key',
));
?>
</td>
</tr>
<tr class="custom_text" data-types="text">
<td colspan="2">
<?php _e('Text', 'wpo_wcpdf_templates'); ?><br>
<?php
$option_key = 'text';
$this->textarea_element(array(
'option_name' => "{$name}[{$option_key}]",
'current' => !empty($current[$option_key]) ? $current[$option_key] : '',
// 'class' => 'custom_text',
'rows' => 8,
));
?>
</td>
</tr>
</table>
<hr>
<h5 class="custom-block-advanced-header"><?php _e('advanced', 'wpo_wcpdf_templates'); ?></h5>
<div class="custom-block-advanced">
<table class="custom-block-requirements">
<tr class="select-requirements">
<td>
<?php
$this->select_element(array(
'class' => 'select-requirements',
'options' => array( '' => __('Select additional requirements for displaying this custom block', 'wpo_wcpdf_templates') . '&hellip;' ),
'current' => 'requirement',
'css' => 'width:100%;',
));
?>
</td>
</tr>
<?php $option_key = 'order_statuses'; ?>
<tr class="requirement" data-requirement_id="<?php echo $option_key; ?>">
<td>
<label><?php _e('Order status', 'wpo_wcpdf_templates'); ?></label>
<?php
$this->select_element(array(
'option_name' => "{$name}[{$option_key}]",
'options' => wc_get_order_statuses(),
'current' => !empty($current[$option_key]) ? $current[$option_key] : array(),
'enhanced_select' => true,
'multiple' => true,
'placeholder' => __( 'Select one or more statuses', 'wpo_wcpdf_templates' ),
'css' => 'width:90%',
));
?>
<span class="dashicons dashicons-trash remove-requirement"></span>
</td>
</tr>
<?php if (WC()->payment_gateways()): ?>
<?php $option_key = 'payment_methods'; ?>
<tr class="requirement" data-requirement_id="<?php echo $option_key; ?>">
<td>
<label><?php _e('Payment method', 'wpo_wcpdf_templates'); ?></label>
<?php
$payment_gateways = array();
foreach (WC()->payment_gateways->payment_gateways() as $gateway) {
$payment_gateways[$gateway->id] = $gateway->get_title();
}
$this->select_element(array(
'option_name' => "{$name}[{$option_key}]",
'options' => $payment_gateways,
'current' => !empty($current[$option_key]) ? $current[$option_key] : array(),
'enhanced_select' => true,
'multiple' => true,
'placeholder' => __( 'Select one or more payment methods', 'wpo_wcpdf_templates' ),
'class' => 'wc-enhanced-select wpo-wcpdf-enhanced-select',
'css' => 'width:90%',
));
?>
<span class="dashicons dashicons-trash remove-requirement"></span>
</td>
</tr>
<?php endif // gateways found ?>
<?php if ($countries = WC()->countries->countries): ?>
<?php $option_key = 'billing_country'; ?>
<tr class="requirement" data-requirement_id="<?php echo $option_key; ?>">
<td>
<label><?php _e('Billing country', 'wpo_wcpdf_templates'); ?></label>
<?php
$this->select_element(array(
'option_name' => "{$name}[{$option_key}]",
'options' => $countries,
'current' => !empty($current[$option_key]) ? $current[$option_key] : array(),
'enhanced_select' => true,
'multiple' => true,
'placeholder' => __( 'Select one or more countries', 'wpo_wcpdf_templates' ),
'class' => 'wc-enhanced-select wpo-wcpdf-enhanced-select',
'css' => 'width:90%',
));
?>
<span class="dashicons dashicons-trash remove-requirement"></span>
</td>
</tr>
<?php $option_key = 'shipping_country'; ?>
<tr class="requirement" data-requirement_id="<?php echo $option_key; ?>">
<td>
<label><?php _e('Shipping country', 'wpo_wcpdf_templates'); ?></label>
<?php
$this->select_element(array(
'option_name' => "{$name}[{$option_key}]",
'options' => $countries,
'current' => !empty($current[$option_key]) ? $current[$option_key] : array(),
'enhanced_select' => true,
'multiple' => true,
'placeholder' => __( 'Select one or more countries', 'wpo_wcpdf_templates' ),
'class' => 'wc-enhanced-select wpo-wcpdf-enhanced-select',
'css' => 'width:90%',
));
?>
<span class="dashicons dashicons-trash remove-requirement"></span>
</td>
</tr>
<?php endif // countries found ?>
<?php $option_key = 'vat_reverse_charge'; ?>
<tr class="requirement" data-requirement_id="<?php echo $option_key; ?>">
<td>
<?php
$current_vat_reverse_charge = !empty($current[$option_key]) ? $current[$option_key] : '';
$option_name = "{$name}[{$option_key}]";
printf( '<input type="checkbox" data-key="%1$s" name="%2$s" id="%2$s" value="1" %3$s>', $option_key, $option_name, checked( 1, $current_vat_reverse_charge, false ) );
?>
<label for="<?= $option_name; ?>"><?php _e("VAT reverse charge", 'wpo_wcpdf_templates'); ?></label>
</td>
</tr>
<?php do_action( 'wpo_wcpdf_after_custom_block_requirements', $name, $current ); ?>
<?php $option_key = 'hide_if_empty'; ?>
<tr class="<?php echo $option_key; ?>">
<td>
<?php
$current_hide_if_empty = !empty($current[$option_key]) ? $current[$option_key] : '';
$option_name = "{$name}[{$option_key}]";
printf( '<input type="checkbox" data-key="%1$s" name="%2$s" id="%2$s" value="1" %3$s>', $option_key, $option_name, checked( 1, $current_hide_if_empty, false ) );
?>
<label for="<?= $option_name; ?>"><?php _e("Don't show if empty", 'wpo_wcpdf_templates'); ?></label>
</td>
</tr>
<?php $option_key = 'html_mode'; ?>
<tr class="<?php echo $option_key; ?>">
<td data-types="text">
<?php
$current_html_mode = !empty($current[$option_key]) ? $current[$option_key] : '';
$option_name = "{$name}[{$option_key}]";
printf( '<input type="checkbox" data-key="%1$s" name="%2$s" id="%2$s" value="1" %3$s>', $option_key, $option_name, checked( 1, $current_html_mode, false ) );
?>
<label for="<?= $option_name; ?>"><?php _e("Raw HTML mode (don't convert line breaks)", 'wpo_wcpdf_templates'); ?></label>
</td>
</tr>
</table>
</div>
</div>
<?php
}
public function get_footer_height() {
$footer_height = isset( WPO_WCPDF()->settings->general_settings['footer_height'] ) ? WPO_WCPDF()->settings->general_settings['footer_height'] : '';
return $footer_height;
}
/**
* Add extra setting for the footer height to the template settings
*/
public function add_footer_height_setting( $settings_fields, $page, $option_group, $option_name ) {
$footer_height_setting = array(
'type' => 'setting',
'id' => 'footer_height',
'title' => __( 'Footer height', 'wpo_wcpdf_templates' ),
'callback' => 'text_input',
'section' => 'general_settings',
'args' => array(
'option_name' => $option_name,
'id' => 'footer_height',
'size' => '5',
'description' => __( 'Enter the total height of the footer in mm, cm or in and use a dot for decimals.<br/>For example: 1.25in or 82mm', 'wpo_wcpdf_templates' )
)
);
$settings_fields = $this->insert_after_setting( $settings_fields, $footer_height_setting, 'footer');
return $settings_fields;
}
/**
* Replace extra fields description based on selected template
*/
public function extra_fields_description_replacement( $settings_fields, $page, $option_group, $option_name ) {
$settings = get_option('wpo_wcpdf_settings_general'); // wcpdf 2.0+
if( empty( $settings ) ) {
$settings = get_option('wpo_wcpdf_template_settings'); // wcpdf 1.6.5 or older
}
if ( is_array( $settings ) && isset( $settings['template_path'] ) ) {
$normalize_path = wp_normalize_path( $settings['template_path'] );
$template_path_arr = explode( '/', $normalize_path );
$template_name = end( $template_path_arr );
if( in_array( $template_name, array( 'Business', 'Simple Premium' ) ) ) {
foreach( $settings_fields as $key => &$settings ) {
foreach( $settings as $setting ) {
if( ! empty( $settings['id'] ) ) {
$not_used_description = sprintf(
/* translators: 1. template name, 2. placeholder */
__( 'Not used for <i>%1$s</i> template by default. You can use the <code>{{wpo_wcpdf_%2$s}}</code> placeholder within the customizer to display the content from this field.', 'wpo_wcpdf_templates' ),
$template_name,
$settings['id']
);
}
if( ! empty( $setting['id'] ) && $setting['id'] == 'extra_1' ) {
if( $template_name == 'Business' ) {
$settings['args']['description'] = sprintf(
/* translators: template name */
__( 'This shows in the <i>%s (Premium)</i> template header', 'wpo_wcpdf_templates' ),
$template_name
);
} else {
$settings['args']['description'] = $not_used_description;
}
} elseif( ! empty( $setting['id'] ) && in_array( $setting['id'], array( 'extra_2', 'extra_3' ) ) ) {
$settings['args']['description'] = $not_used_description;
}
}
}
}
}
return $settings_fields;
}
public function insert_after_setting( $settings, $new_setting, $insert_after_id ) {
// search setting with $insert_after_id
foreach ($settings as $key => $setting) {
if ($setting['type'] == 'setting' && $setting['id'] == $insert_after_id) {
$insert_pos = array_search($key, array_keys($settings)) + 1;
}
}
// simply append if position not found
if (empty($insert_pos)) {
return array_merge( $settings, array( $new_setting ) );
}
// splicemup!
array_splice( $settings, $insert_pos, 0, array( $new_setting ) );
return $settings;
}
/**
* Validate options.
*
* @param array $input options to valid.
*
* @return array validated options.
*/
public function validate_options( $input ) {
// no validation required at this point!
$output = $input;
// Return the array processing any additional functions filtered by this action.
return apply_filters( 'wpo_wcpdf_templates_validate_settings', $output, $input );
}
/**
* Remove load-defaults query variable after option is updated (to prevent loading the defaults again)
*/
public function remove_load_defaults_after_updating_option( $option, $old_value, $value ) {
if ( $option == $this->option ) {
add_filter( 'wp_redirect', function( $location, $status ) {
return esc_url_raw( remove_query_arg( 'load-defaults', $location ) );
}, 10, 2 );
}
}
public function select_element( $args ) {
$defaults = array(
'option_name' => '',
'options' => array(),
'current' => null,
'enhanced_select' => false,
'multiple' => false,
'placeholder' => '',
'title' => '',
'id' => '',
'class' => '',
'css' => '',
);
$args = wp_parse_args( $args, $defaults );
extract($args);
if ( $enhanced_select ) {
if ( $multiple ) {
$option_name = "{$option_name}[]";
$multiple = 'multiple=multiple';
} else {
$multiple = '';
}
$placeholder = isset($placeholder) ? esc_attr( $placeholder ) : '';
$title = isset($title) ? esc_attr( $title ) : '';
$class .= ' wc-enhanced-select wpo-wcpdf-enhanced-select';
// $css = 'width:400px';
printf( '<select id="%1$s" name="%2$s" data-placeholder="%3$s" title="%4$s" class="%5$s" style="%6$s" %7$s>', $id, $option_name, $placeholder, $title, $class, $css, $multiple );
} else {
printf( '<select id="%1$s" name="%2$s" class="%3$s" style="%4$s">', $id, $option_name, $class, $css );
}
foreach ( $options as $key => $label ) {
if ( isset( $multiple ) && is_array( $current ) ) {
$selected = in_array($key, $current) ? ' selected="selected"' : '';
printf( '<option value="%s"%s>%s</option>', $key, $selected, $label );
} else {
printf( '<option value="%s"%s>%s</option>', $key, selected( $current, $key, false ), $label );
}
}
echo '</select>';
}
public function input_element( $args ) {
$defaults = array(
'type' => 'text',
'option_name' => '',
'current' => '',
'id' => '',
'class' => '',
'css' => '',
);
$args = wp_parse_args( $args, $defaults );
extract($args);
printf( '<input type="%1$s" name="%2$s" value="%3$s" class="%4$s" id="%5$s" style="%6$s">', $type, $option_name, $current, $class, $id, $css );
}
public function textarea_element( $args ) {
$defaults = array(
'option_name' => '',
'current' => '',
'id' => '',
'class' => '',
'css' => '',
'rows' => 4,
);
$args = wp_parse_args( $args, $defaults );
extract($args);
printf( '<textarea name="%1$s" class="%2$s" id="%3$s" style="%4$s" rows="%5$s">%6$s</textarea>', $option_name, $class, $id, $css, $rows, $current );
}
public function customizer_setting_types( $setting_types ) {
$setting_types['customizer'] = __( 'Customizer', 'wpo_wcpdf_templates' );
return $setting_types;
}
public function customizer_settings_export( $settings, $type ) {
if ( $type == 'customizer' ) {
$settings = $this->settings;
}
return $settings;
}
public function customizer_settings_import_option( $settings_option, $type, $new_settings ) {
if ( $type == 'customizer' ) {
$settings_option = $this->option;
}
return $settings_option;
}
} // end class
} // end class_exists
return new WooCommerce_PDF_IPS_Templates_Settings();