Warning! The settings below are meant for debugging/development only. Do not use them on a live website!' , 'woocommerce-pdf-invoices-packing-slips' );
}
/**
* Custom fields section callback.
*
* @return void.
*/
public function custom_fields_section() {
_e( 'These are used for the (optional) footer columns in the Modern (Premium) template, but can also be used for other elements in your custom template' , 'woocommerce-pdf-invoices-packing-slips' );
}
/**
* Checkbox callback.
*
* args:
* option_name - name of the main option
* id - key of the setting
* value - value if not 1 (optional)
* default - default setting (optional)
* description - description (optional)
*
* @return void.
*/
public function checkbox( $args ) {
extract( $this->normalize_settings_args( $args ) );
// output checkbox
printf( ' ', $id, $setting_name, $value, checked( $value, $current, false ), !empty($disabled) ? 'disabled="disabled"' : '' );
// print store empty input if true
if( $store_unchecked ) {
printf( ' ', $option_name, $id );
}
// output description.
if ( isset( $description ) ) {
printf( '
%s
', $description );
}
}
/**
* Text input callback.
*
* args:
* option_name - name of the main option
* id - key of the setting
* size - size of the text input (em)
* default - default setting (optional)
* description - description (optional)
* type - type (optional)
*
* @return void.
*/
public function text_input( $args ) {
extract( $this->normalize_settings_args( $args ) );
if (empty($type)) {
$type = 'text';
}
printf( ' ', $type, $id, $setting_name, esc_attr( $current ), $size, $placeholder, !empty($disabled) ? 'disabled="disabled"' : '' );
// output description.
if ( isset( $description ) ) {
printf( '%s
', $description );
}
}
/**
* Combined checkbox & text input callback.
*
* args:
* option_name - name of the main option
* id - key of the setting
* value - value if not 1 (optional)
* default - default setting (optional)
* description - description (optional)
*
* @return void.
*/
public function checkbox_text_input( $args ) {
$args = $this->normalize_settings_args( $args );
extract( $args );
unset($args['description']); // already extracted, should only be used here
// get checkbox
ob_start();
$this->checkbox( $args );
$checkbox = ob_get_clean();
// get text input for insertion in wrapper
$input_args = array(
'id' => $args['text_input_id'],
'default' => isset( $args['text_input_default'] ) ? (string) $args['text_input_default'] : NULL,
'size' => isset( $args['text_input_size'] ) ? $args['text_input_size'] : NULL,
) + $args;
unset($input_args['current']);
ob_start();
$this->text_input( $input_args );
$text_input = ob_get_clean();
if (!empty($text_input_wrap)) {
printf( "{$checkbox} {$text_input_wrap}", $text_input);
} else {
echo "{$checkbox} {$text_input}";
}
// output description.
if ( isset( $description ) ) {
printf( '%s
', $description );
}
}
// Single text option (not part of any settings array)
public function singular_text_element( $args ) {
$option_name = $args['option_name'];
$id = $args['id'];
$size = isset( $args['size'] ) ? $args['size'] : '25';
$class = isset( $args['translatable'] ) && $args['translatable'] === true ? 'translatable' : '';
$option = get_option( $option_name );
if ( isset( $option ) ) {
$current = $option;
} else {
$current = isset( $args['default'] ) ? $args['default'] : '';
}
$html = sprintf( ' ', $id, $option_name, $current, $size, $class );
// Displays option description.
if ( isset( $args['description'] ) ) {
$html .= sprintf( '%s
', $args['description'] );
}
echo $html;
}
/**
* Textarea callback.
*
* args:
* option_name - name of the main option
* id - key of the setting
* width - width of the text input (em)
* height - height of the text input (lines)
* default - default setting (optional)
* description - description (optional)
*
* @return void.
*/
public function textarea( $args ) {
extract( $this->normalize_settings_args( $args ) );
printf( '%3$s', $id, $setting_name, esc_textarea( $current ), $width, $height, $placeholder );
// output description.
if ( isset( $description ) ) {
printf( '%s
', $description );
}
}
/**
* Select element callback.
*
* @param array $args Field arguments.
*
* @return string Select field.
*/
public function select( $args ) {
extract( $this->normalize_settings_args( $args ) );
if ( isset( $enhanced_select ) ) {
if ( isset( $multiple ) ) {
$setting_name = "{$setting_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( '', $id, $setting_name, $placeholder, $title, $class, $css, $multiple );
} else {
printf( '', $id, $setting_name );
}
foreach ( $options as $key => $label ) {
if ( isset( $multiple ) && is_array( $current ) ) {
$selected = in_array($key, $current) ? ' selected="selected"' : '';
printf( '%s ', $key, $selected, $label );
} else {
printf( '%s ', $key, selected( $current, $key, false ), $label );
}
}
echo ' ';
if (isset($custom)) {
printf( '', $id );
if (is_callable( array( $this, $custom['type'] ) ) ) {
$this->{$custom['type']}( $custom['args'] );
}
echo '
';
?>
%s', $args['description'] );
}
}
public function radio_button( $args ) {
extract( $this->normalize_settings_args( $args ) );
foreach ( $options as $key => $label ) {
printf( ' ', $id, $setting_name, $key, checked( $current, $key, false ) );
printf( ' %4$s ', $id, $setting_name, $key, $label);
}
// Displays option description.
if ( isset( $args['description'] ) ) {
printf( '%s
', $args['description'] );
}
}
/**
* Multiple text element callback.
* @param array $args Field arguments.
* @return string Text input field.
*/
public function multiple_text_input( $args ) {
extract( $this->normalize_settings_args( $args ) );
if (!empty($header)) {
echo "{$header} :
";
}
printf('', $id);
foreach ($fields as $name => $field) {
$size = $field['size'];
$placeholder = isset( $field['placeholder'] ) ? $field['placeholder'] : '';
if (isset($field['label_width'])) {
$style = sprintf( 'style="display:inline-block; width:%1$s;"', $field['label_width'] );
} else {
$style = '';
}
$description = isset( $field['description'] ) ? ''.$field['description'].' ' : '';
// output field label
if (isset($field['label'])) {
printf( '%4$s: ', $id, $name, $style, $field['label'] );
}
// output field
$field_current = isset($current[$name]) ? $current[$name] : '';
$type = isset( $field['type'] ) ? $field['type'] : 'text';
printf( ' %8$s ', $type, $id, $setting_name, $name, esc_attr( $field_current ), $size, $placeholder, $description );
}
echo "
";
// Displays option description.
if ( isset( $args['description'] ) ) {
printf( '%s
', $args['description'] );
}
}
/**
* Multiple text element callback.
* @param array $args Field arguments.
* @return string Text input field.
*/
public function multiple_checkboxes( $args ) {
extract( $this->normalize_settings_args( $args ) );
foreach ($fields as $name => $label) {
// $label = $field['label'];
// output checkbox
$field_current = isset($current[$name]) ? $current[$name] : '';
printf( ' ', $id, $setting_name, $name, $value, checked( $value, $field_current, false ) );
// output field label
printf( '%3$s ', $id, $name, $label );
}
// Displays option description.
if ( isset( $args['description'] ) ) {
printf( '%s
', $args['description'] );
}
}
/**
* Media upload callback.
*
* @param array $args Field arguments.
*
* @return string Media upload button & preview.
*/
public function media_upload( $args ) {
extract( $this->normalize_settings_args( $args ) );
if( !empty($current) && $attachment = wp_get_attachment_image_src( $current, 'full', false ) ) {
$general_settings = get_option('wpo_wcpdf_settings_general');
$attachment_src = $attachment[0];
$attachment_width = $attachment[1];
$attachment_height = $attachment[2];
// check if we have the height saved on settings
$header_logo_height = !empty($general_settings['header_logo_height']) ? $general_settings['header_logo_height'] : '3cm';
if ( stripos( $header_logo_height, 'mm' ) != false ) {
$in_height = floatval($header_logo_height)/25.4;
} elseif ( stripos( $header_logo_height, 'cm' ) != false ) {
$in_height = floatval($header_logo_height)/2.54;
} elseif ( stripos( $header_logo_height, 'in' ) != false ) {
$in_height = floatval($header_logo_height);
} else {
// don't display resolution
}
printf(' ', $attachment_src, $attachment_width, $attachment_height, $id );
if ( !empty($attachment_height) && !empty($in_height) ) {
$attachment_resolution = round(absint($attachment_height)/$in_height);
printf('', __('Image resolution','woocommerce-pdf-invoices-packing-slips'), $attachment_resolution );
}
printf('%2$s ', $id, $remove_button_text );
}
printf( ' ', $id, $setting_name, $current );
printf( '%2$s ', $uploader_title, $uploader_button_text, $remove_button_text, $id );
// Displays option description.
if ( isset( $description ) ) {
printf( '%s
', $description );
}
}
/**
* Next document number edit callback.
*
* @param array $args Field arguments.
*/
public function next_number_edit( $args ) {
extract( $args );
$number_store_method = WPO_WCPDF()->settings->get_sequential_number_store_method();
$number_store = new Sequential_Number_Store( $store, $number_store_method );
$next_number = $number_store->get_next();
$nonce = wp_create_nonce( "wpo_wcpdf_next_{$store}" );
printf( ' %5$s ', $store, $size, $next_number, $nonce, __( 'Save', 'woocommerce-pdf-invoices-packing-slips' ) );
// Displays option description.
if ( isset( $description ) ) {
printf( '%s
', $description );
}
}
/**
* Wrapper function to create tabs for settings in different languages
* @param [type] $args [description]
* @param [type] $callback [description]
* @return [type] [description]
*/
public function i18n_wrap ( $args ) {
extract( $this->normalize_settings_args( $args ) );
if ( $languages = $this->get_languages() ) {
printf( '', $option_name, $id)
?>
$language_name ) {
$translation_id = "{$option_name}_{$id}_{$lang_code}";
printf('%s ', $translation_id, $language_name );
}
?>
$language_name ) {
$translation_id = "{$option_name}_{$id}_{$lang_code}";
printf( '
', $translation_id );
$args['lang'] = $lang_code;
// don't use internationalized placeholders since they're not translated,
// to avoid confusion (user thinking they're all the same)
if ( $callback == 'multiple_text_input' ) {
foreach ($fields as $key => $field_args) {
if (!empty($field_args['placeholder']) && isset($field_args['i18n_placeholder'])) {
$args['fields'][$key]['placeholder'] = '';
}
}
} else {
if (!empty($args['placeholder']) && isset($args['i18n_placeholder'])) {
$args['placeholder'] = '';
}
}
// specific description for internationalized fields (to compensate for missing placeholder)
if (!empty($args['i18n_description'])) {
$args['description'] = $args['i18n_description'];
}
if ( is_array( $callback ) ) {
call_user_func( $callback, $args );
} else {
call_user_func( array( $this, $callback ), $args );
}
echo '
';
}
?>
$data) {
$languages[$data['language_code']] = $data['native_name'];
}
} else {
return false;
}
return $languages;
}
public function normalize_settings_args ( $args ) {
$args['value'] = isset( $args['value'] ) ? $args['value'] : 1;
$args['placeholder'] = isset( $args['placeholder'] ) ? $args['placeholder'] : '';
$args['store_unchecked'] = isset( $args['store_unchecked'] ) && $args['store_unchecked'] ? true : false;
// get main settings array
$option = get_option( $args['option_name'] );
$args['setting_name'] = "{$args['option_name']}[{$args['id']}]";
if ( !isset($args['lang']) && !empty($args['translatable']) ) {
$args['lang'] = 'default';
}
if (isset($args['lang'])) {
// i18n settings name
$args['setting_name'] = "{$args['setting_name']}[{$args['lang']}]";
// copy current option value if set
if ( $args['lang'] == 'default' && !empty($option[$args['id']]) && !isset( $option[$args['id']]['default'] ) ) {
// we're switching back from WPML to normal
// try english first
if ( isset( $option[$args['id']]['en'] ) ) {
$args['current'] = $option[$args['id']]['en'];
} elseif ( is_array( $option[$args['id']] ) ) {
// fallback to the first language if english not found
$first = array_shift($option[$args['id']]);
if (!empty($first)) {
$args['current'] = $first;
}
} elseif ( is_string( $option[$args['id']] ) ) {
$args['current'] = $option[$args['id']];
} else {
// nothing, really?
$args['current'] = '';
}
} else {
if ( isset( $option[$args['id']][$args['lang']] ) ) {
$args['current'] = $option[$args['id']][$args['lang']];
} elseif (isset( $option[$args['id']]['default'] )) {
$args['current'] = $option[$args['id']]['default'];
}
}
} else {
// copy current option value if set
if ( isset( $option[$args['id']] ) ) {
$args['current'] = $option[$args['id']];
}
}
// falback to default or empty if no value in option
if ( !isset($args['current']) ) {
$args['current'] = isset( $args['default'] ) ? $args['default'] : '';
} elseif ( empty($args['current']) && isset($args['default_if_empty']) && $args['default_if_empty'] == true ) { // force fallback if empty 'current' and 'default_if_empty' equals to true
$args['current'] = isset( $args['default'] ) ? $args['default'] : '';
}
return $args;
}
/**
* Validate options.
*
* @param array $input options to valid.
*
* @return array validated options.
*/
public function validate( $input ) {
// echo '';var_dump($input);die(' ');
// Create our array for storing the validated options.
$output = array();
if (empty($input) || !is_array($input)) {
return $input;
}
if (!empty($input['wpo_wcpdf_setting_store_empty'])) { //perhaps we should use a more unique/specific name for this
foreach ($input['wpo_wcpdf_setting_store_empty'] as $key) {
if (empty($input[$key])) {
$output[$key] = 0;
}
}
unset($input['wpo_wcpdf_setting_store_empty']);
}
// Loop through each of the incoming options.
foreach ( $input as $key => $value ) {
// Check to see if the current option has a value. If so, process it.
if ( isset( $input[$key] ) ) {
if ( is_array( $input[$key] ) ) {
foreach ( $input[$key] as $sub_key => $sub_value ) {
$output[$key][$sub_key] = $input[$key][$sub_key];
}
} else {
$output[$key] = $input[$key];
}
}
}
// Return the array processing any additional functions filtered by this action.
return apply_filters( 'wpo_wcpdf_validate_input', $output, $input );
}
}
endif; // class_exists
return new Settings_Callbacks();