callbacks = include( 'class-wcpdf-settings-callbacks.php' );
// include settings classes
$this->general = include( 'class-wcpdf-settings-general.php' );
$this->documents = include( 'class-wcpdf-settings-documents.php' );
$this->debug = include( 'class-wcpdf-settings-debug.php' );
// Settings menu item
add_action( 'admin_menu', array( $this, 'menu' ), 999 ); // Add menu
// Links on plugin page
add_filter( 'plugin_action_links_'.WPO_WCPDF()->plugin_basename, array( $this, 'add_settings_link' ) );
add_filter( 'plugin_row_meta', array( $this, 'add_support_links' ), 10, 2 );
// settings capabilities
add_filter( 'option_page_capability_wpo_wcpdf_general_settings', array( $this, 'settings_capabilities' ) );
$this->general_settings = get_option('wpo_wcpdf_settings_general');
$this->debug_settings = get_option('wpo_wcpdf_settings_debug');
// admin notice for auto_increment_increment
// add_action( 'admin_notices', array( $this, 'check_auto_increment_increment') );
// AJAX set number store
add_action( 'wp_ajax_wpo_wcpdf_set_next_number', array($this, 'set_number_store' ));
}
public function menu() {
$parent_slug = 'woocommerce';
$this->options_page_hook = add_submenu_page(
$parent_slug,
__( 'PDF Invoices', 'woocommerce-pdf-invoices-packing-slips' ),
__( 'PDF Invoices', 'woocommerce-pdf-invoices-packing-slips' ),
'manage_woocommerce',
'wpo_wcpdf_options_page',
array( $this, 'settings_page' )
);
}
/**
* Add settings link to plugins page
*/
public function add_settings_link( $links ) {
$action_links = array(
'settings' => ''. __( 'Settings', 'woocommerce' ) . '',
);
return array_merge( $action_links, $links );
}
/**
* Add various support links to plugin page
* after meta (version, authors, site)
*/
public function add_support_links( $links, $file ) {
if ( $file == WPO_WCPDF()->plugin_basename ) {
$row_meta = array(
'docs' => '' . __( 'Documentation', 'woocommerce-pdf-invoices-packing-slips' ) . '',
'support' => '' . __( 'Support Forum', 'woocommerce-pdf-invoices-packing-slips' ) . '',
);
return array_merge( $links, $row_meta );
}
return (array) $links;
}
function check_auto_increment_increment() {
global $wpdb;
$row = $wpdb->get_row("SHOW VARIABLES LIKE 'auto_increment_increment'");
if ( !empty($row) && !empty($row->Value) && $row->Value != 1 ) {
$error = sprintf( __( "Warning! Your database has an AUTO_INCREMENT step size of %s, your invoice numbers may not be sequential. Enable the 'Calculate document numbers (slow)' setting in the Status tab to use an alternate method." , 'woocommerce-pdf-invoices-packing-slips' ), $row->Value );
printf( '
', $error );
}
}
public function settings_page() {
$settings_tabs = apply_filters( 'wpo_wcpdf_settings_tabs', array (
'general' => __('General', 'woocommerce-pdf-invoices-packing-slips' ),
'documents' => __('Documents', 'woocommerce-pdf-invoices-packing-slips' ),
)
);
// add status tab last in row
$settings_tabs['debug'] = __('Status', 'woocommerce-pdf-invoices-packing-slips' );
$active_tab = isset( $_GET[ 'tab' ] ) ? sanitize_text_field( $_GET[ 'tab' ] ) : 'general';
$active_section = isset( $_GET[ 'section' ] ) ? sanitize_text_field( $_GET[ 'section' ] ) : '';
include('views/wcpdf-settings-page.php');
}
public function add_settings_fields( $settings_fields, $page, $option_group, $option_name ) {
foreach ( $settings_fields as $settings_field ) {
if (!isset($settings_field['callback'])) {
continue;
} elseif ( is_callable( array( $this->callbacks, $settings_field['callback'] ) ) ) {
$callback = array( $this->callbacks, $settings_field['callback'] );
} elseif ( is_callable( $settings_field['callback'] ) ) {
$callback = $settings_field['callback'];
} else {
continue;
}
if ( $settings_field['type'] == 'section' ) {
add_settings_section(
$settings_field['id'],
$settings_field['title'],
$callback,
$page
);
} else {
add_settings_field(
$settings_field['id'],
$settings_field['title'],
$callback,
$page,
$settings_field['section'],
$settings_field['args']
);
// register option separately for singular options
if (is_string($settings_field['callback']) && $settings_field['callback'] == 'singular_text_element') {
register_setting( $option_group, $settings_field['args']['option_name'], array( $this->callbacks, 'validate' ) );
}
}
}
// $page, $option_group & $option_name are all the same...
register_setting( $option_group, $option_name, array( $this->callbacks, 'validate' ) );
add_filter( 'option_page_capability_'.$page, array( $this, 'settings_capabilities' ) );
}
/**
* Set capability for settings page
*/
public function settings_capabilities() {
return 'manage_woocommerce';
}
public function get_common_document_settings() {
$common_settings = array(
'paper_size' => isset( $this->general_settings['paper_size'] ) ? $this->general_settings['paper_size'] : '',
'font_subsetting' => isset( $this->general_settings['font_subsetting'] ) || ( defined("DOMPDF_ENABLE_FONTSUBSETTING") && DOMPDF_ENABLE_FONTSUBSETTING === true ) ? true : false,
'header_logo' => isset( $this->general_settings['header_logo'] ) ? $this->general_settings['header_logo'] : '',
'header_logo_height' => isset( $this->general_settings['header_logo_height'] ) ? $this->general_settings['header_logo_height'] : '',
'shop_name' => isset( $this->general_settings['shop_name'] ) ? $this->general_settings['shop_name'] : '',
'shop_address' => isset( $this->general_settings['shop_address'] ) ? $this->general_settings['shop_address'] : '',
'footer' => isset( $this->general_settings['footer'] ) ? $this->general_settings['footer'] : '',
'extra_1' => isset( $this->general_settings['extra_1'] ) ? $this->general_settings['extra_1'] : '',
'extra_2' => isset( $this->general_settings['extra_2'] ) ? $this->general_settings['extra_2'] : '',
'extra_3' => isset( $this->general_settings['extra_3'] ) ? $this->general_settings['extra_3'] : '',
);
return $common_settings;
}
public function get_document_settings( $document_type ) {
$documents = WPO_WCPDF()->documents->get_documents('all');
foreach ($documents as $document) {
if ( $document->get_type() == $document_type ) {
return $document->settings;
}
}
return false;
}
public function get_output_format( $document_type = null ) {
if ( isset( $this->debug_settings['html_output'] ) ) {
$output_format = 'html';
} else {
$output_format = 'pdf';
}
return apply_filters( 'wpo_wcpdf_output_format', $output_format, $document_type );
}
public function get_output_mode() {
if ( isset( WPO_WCPDF()->settings->general_settings['download_display'] ) ) {
switch ( WPO_WCPDF()->settings->general_settings['download_display'] ) {
case 'display':
$output_mode = 'inline';
break;
case 'download':
default:
$output_mode = 'download';
break;
}
} else {
$output_mode = 'download';
}
return $output_mode;
}
public function get_template_path( $document_type = NULL ) {
$template_path = isset( $this->general_settings['template_path'] )?$this->general_settings['template_path']:'';
// forward slash for consistency
$template_path = str_replace('\\','/', $template_path);
// add base path, checking if it's not already there
// alternative setups like Bedrock have WP_CONTENT_DIR & ABSPATH separated
if ( defined('WP_CONTENT_DIR') && strpos( WP_CONTENT_DIR, ABSPATH ) !== false ) {
$forwardslash_basepath = str_replace('\\','/', ABSPATH);
} else {
// bedrock e.a
$forwardslash_basepath = str_replace('\\','/', WP_CONTENT_DIR);
}
if ( strpos( $template_path, $forwardslash_basepath ) === false ) {
$template_path = $forwardslash_basepath . $template_path;
}
return $template_path;
}
public function set_number_store() {
check_ajax_referer( "wpo_wcpdf_next_{$_POST['store']}", 'security' );
// check permissions
if ( !current_user_can('manage_woocommerce') ) {
die();
}
$number = isset( $_POST['number'] ) ? (int) $_POST['number'] : 0;
$number_store_method = $this->get_sequential_number_store_method();
$number_store = new Sequential_Number_Store( $_POST['store'], $number_store_method );
$number_store->set_next( $number );
echo "next number ({$_POST['store']}) set to {$number}";
die();
}
public function get_sequential_number_store_method() {
global $wpdb;
$method = isset( $this->debug_settings['calculate_document_numbers'] ) ? 'calculate' : 'auto_increment';
// safety first - always use calculate when auto_increment_increment is not 1
$row = $wpdb->get_row("SHOW VARIABLES LIKE 'auto_increment_increment'");
if ( !empty($row) && !empty($row->Value) && $row->Value != 1 ) {
$method = 'calculate';
}
return $method;
}
}
endif; // class_exists
return new Settings();