page_id = 'fields';
$this->section_id = 'billing';
$this->tabs = array(
'fields' => __('Checkout Fields', 'woo-checkout-field-editor-pro'),
'advanced_settings' => __('Advanced Settings', 'woo-checkout-field-editor-pro'),
'pro' => __('Premium Features', 'woo-checkout-field-editor-pro'),
'themehigh_plugins' => __('Other Free Plugins', 'woo-checkout-field-editor-pro'),
);
$this->sections = array(
'billing' => __('Billing Fields', 'woo-checkout-field-editor-pro'),
'shipping' => __('Shipping Fields', 'woo-checkout-field-editor-pro'),
'additional' => __('Additional Fields', 'woo-checkout-field-editor-pro'),
);
}
public static function instance() {
if(is_null(self::$_instance)){
self::$_instance = new self();
}
return self::$_instance;
}
public function define_admin_hooks(){
// Show in order details page
add_action('woocommerce_admin_order_data_after_order_details', array($this, 'order_data_after_order_details'), 20, 1);
add_action('woocommerce_admin_order_data_after_billing_address', array($this, 'order_data_after_billing_address'), 20, 1);
add_action('woocommerce_admin_order_data_after_shipping_address', array($this, 'order_data_after_shipping_address'), 20, 1);
}
public function init(){
$this->field_form = new THWCFD_Admin_Form_Field();
$this->field_form_props = $this->field_form->get_field_form_props();
$this->render_page();
}
public function reset_to_default() {
$nonse = isset($_REQUEST['thwcfd_security_manage_fields']) ? $_REQUEST['thwcfd_security_manage_fields'] : false;
$capability = THWCFD_Utils::wcfd_capability();
if(!wp_verify_nonce($nonse, 'thwcfd_section_fields') || !current_user_can($capability)){
die();
}
delete_option('wc_fields_billing');
delete_option('wc_fields_shipping');
delete_option('wc_fields_additional');
return $this->print_notices(__('Checkout fields successfully reset', 'woo-checkout-field-editor-pro'), 'updated', true);
}
public function render_page(){
$this->output_tabs();
$this->output_sections();
$this->output_content();
}
public function render_checkout_fields_heading_row(){
?>
|
|
|
|
|
|
|
|
|
|
|
|
get_current_section();
$action = isset($_POST['f_action']) ? $_POST['f_action'] : false;
if($action === 'new')
echo $this->save_or_update_field($section, $action);
if($action === 'edit')
echo $this->save_or_update_field($section, $action);
if(isset($_POST['save_fields']))
echo $this->save_fields($section);
if(isset($_POST['reset_fields']))
echo $this->reset_to_default();
$fields = THWCFD_Utils::get_fields($section);
?>
field_form->output_field_forms();
}
public function get_property_set_json($name, $field){
$json = '';
if(is_array($field)){
foreach($field as $pname => $pvalue){
$pvalue = is_array($pvalue) ? implode(',', $pvalue) : $pvalue;
$pvalue = is_string($pvalue) ? esc_attr($pvalue) : $pvalue;
$field[$pname] = $pvalue;
}
$field['name'] = $name;
$json = json_encode($field);
}
return $json;
}
private function save_or_update_field($section, $action) {
$nonse = isset($_REQUEST['thwcfd_security_manage_field']) ? $_REQUEST['thwcfd_security_manage_field'] : false;
$capability = THWCFD_Utils::wcfd_capability();
if(!wp_verify_nonce($nonse, 'thwcfd_field_form') || !current_user_can($capability)){
die();
}
try {
$result = false;
$fields = THWCFD_Utils::get_fields($section);
$field = $this->prepare_field_from_posted_data($_POST);
$this->add_wpml_support($field);
$name = isset($field['name']) ? $field['name'] : false;
if($name){
if($action === 'new'){
$priority = THWCFD_Utils::prepare_field_priority($fields, false, true);
$field['custom'] = 1;
$field['priority'] = $priority;
}else{
$oname = isset($_POST['i_oname']) ? sanitize_key($_POST['i_oname']) : false;
if($name && $oname && $name !== $oname ){
unset($fields[$oname]);
}
}
$fields[$name] = $field;
}
$result = THWCFD_Utils::update_fields($section, $fields);
if($result == true) {
$this->print_notices(__('Your changes were saved.', 'woo-checkout-field-editor-pro' ), 'updated');
}else {
$this->print_notices(__('Your changes were not saved due to an error (or you made none!).', 'woo-checkout-field-editor-pro'), 'error');
}
} catch (Exception $e) {
$this->print_notices(__('Your changes were not saved due to an error.', 'woo-checkout-field-editor-pro'), 'error');
}
}
private function save_fields($section) {
$nonse = isset($_REQUEST['thwcfd_security_manage_fields']) ? $_REQUEST['thwcfd_security_manage_fields'] : false;
$capability = THWCFD_Utils::wcfd_capability();
if(!wp_verify_nonce($nonse, 'thwcfd_section_fields') || !current_user_can($capability)){
die();
}
try {
$f_names = !empty( $_POST['f_name'] ) ? $_POST['f_name'] : array();
$f_names = array_map('sanitize_key', $f_names);
if(empty($f_names)){
$this->print_notices(__('Your changes were not saved due to no fields found.', 'woo-checkout-field-editor-pro'), 'error');
return;
}
$f_order = !empty( $_POST['f_order'] ) ? $_POST['f_order'] : array();
$f_order = array_map('absint', $f_order);
$f_deleted = !empty( $_POST['f_deleted'] ) ? $_POST['f_deleted'] : array();
$f_deleted = array_map('absint', $f_deleted);
$f_enabled = !empty( $_POST['f_enabled'] ) ? $_POST['f_enabled'] : array();
$f_enabled = array_map('absint', $f_enabled);
$fields = THWCFD_Utils::get_fields($section);
$max = max( array_map( 'absint', array_keys( $f_names ) ) );
for($i = 0; $i <= $max; $i++) {
$name = $f_names[$i];
if(isset($fields[$name])){
$is_deleted = isset($f_deleted[$i]) && $f_deleted[$i] ? true : false;
if($is_deleted){
unset($fields[$name]);
continue;
}
$order = isset($f_order[$i]) ? $f_order[$i] : 0;
$enabled = isset($f_enabled[$i]) ? $f_enabled[$i] : 0;
$priority = THWCFD_Utils::prepare_field_priority($fields, $order, false);
$field = $fields[$name];
$field['priority'] = $priority;
$field['enabled'] = $enabled;
$fields[$name] = $field;
}
}
$fields = THWCFD_Utils::sort_fields($fields);
$result = THWCFD_Utils::update_fields($section, $fields);
if($result == true) {
$this->print_notices(__('Your changes were saved.', 'woo-checkout-field-editor-pro'), 'updated');
}else {
$this->print_notices(__('Your changes were not saved due to an error (or you made none!).', 'woo-checkout-field-editor-pro'), 'error');
}
} catch (Exception $e) {
$this->print_notices(__('Your changes were not saved due to an error.', 'woo-checkout-field-editor-pro'), 'error');
}
}
private function prepare_field_from_posted_data($posted){
$field_props = $this->field_form_props;
$field = array();
foreach ($field_props as $pname => $prop) {
$iname = 'i_'.$pname;
$pvalue = '';
if($prop['type'] === 'checkbox'){
$pvalue = isset($posted[$iname]) && $posted[$iname] ? 1 : 0;
}else if(isset($posted[$iname])){
//$pvalue = is_array($posted[$iname]) ? implode(',', $posted[$iname]) : trim(stripslashes($posted[$iname]));
// $pvalue = is_array($posted[$iname]) ? $posted[$iname] : trim(stripslashes($posted[$iname]));
if(($pname === 'type') || ($pname === 'name')){
$pvalue = !empty($posted[$iname]) ? sanitize_key($posted[$iname]) : "";
}else if(($pname === 'label')){
//$pvalue = !empty($posted[$iname]) ? htmlentities(stripslashes($posted[$iname])) : "";
$pvalue = !empty($posted[$iname]) ? wp_unslash(wp_filter_post_kses($posted[$iname])) : "";
}else if(($pname === 'validate')){
$pvalue = !empty($posted[$iname]) ? (array) $posted[$iname] : array();
$pvalue = array_map( 'sanitize_key', $pvalue );
}else if($pname === 'class'){
//$pvalue = is_string($pvalue) ? array_map('trim', explode(',', $pvalue)) : $pvalue;
$pvalue = !empty($posted[$iname]) ? $posted[$iname] : '';
$pvalue = is_string($pvalue) ? preg_split('/(\s*,*\s*)*,+(\s*,*\s*)*/', $pvalue) : array();
$pvalue = array_map('sanitize_key', $pvalue);
}else{
$pvalue = !empty($posted[$iname]) ? sanitize_text_field(wp_unslash($posted[$iname])) : "";
}
}
$field[$pname] = $pvalue;
}
$type = isset($field['type']) ? $field['type'] : '';
if(!$type){
$type = isset($posted['i_otype']) ? sanitize_key($posted['i_otype']) : '';
$field['type'] = $type;
}
$name = isset($field['name']) ? $field['name'] : '';
if(!$name){
$field['name'] = isset($posted['i_oname']) ? sanitize_key($posted['i_oname']) : '';
}
if($type === 'select' || $type === 'multiselect'){
$field['validate'] = '';
}else if($type === 'radio'){
$field['validate'] = '';
$field['placeholder'] = '';
}else if($type === 'number'){
$field['validate'] = array('number');
}else if($type === 'checkbox'){
if(isset($posted['i_default'])){
$field['default'] = sanitize_text_field($posted['i_default']);
}else{
$field['default'] = '';
}
}
if($type === 'select' || $type === 'radio' || $type === 'checkboxgroup' || $type === 'multiselect'){
$options_json = isset($posted['i_options_json']) ? trim(stripslashes($posted['i_options_json'])) : '';
$options_arr = THWCFD_Utils::prepare_options_array($options_json, $type);
$keys = array_keys($options_arr);
// $keys = array_map('sanitize_key', $keys);
$keys = array_map('sanitize_text_field', $keys);
$values = array_values($options_arr);
$values = array_map('htmlspecialchars', $values);
$options_arr = array_combine($keys, $values);
$field['options'] = $options_arr;
// // Sanitize default value same like option values
// $default_value = isset($field['default']) ? $field['default'] : '';
// if($default_value){
// $field['default'] = sanitize_key($default_value);
// }
}else{
$field['options'] = '';
}
$field['autocomplete'] = isset($posted['i_autocomplete']) ? sanitize_text_field($posted['i_autocomplete']) : '';
$field['priority'] = isset($posted['i_priority']) ? absint($posted['i_priority']) : '';
//$field['custom'] = isset($posted['i_custom']) ? $posted['i_custom'] : '';
$field['custom'] = isset($posted['i_custom']) && $posted['i_custom'] ? 1 : 0;
return $field;
}
/******* Display & Update Field Values *******/
/*********************************************/
public function order_data_after_order_details($order){
$fields = THWCFD_Utils::get_fields('additional');
//$this->display_fields_in_admin_order($order, $fields, '
');
$this->display_fields_in_admin_order($order, $fields, '');
}
public function order_data_after_billing_address($order){
$fields = THWCFD_Utils::get_fields('billing');
$this->display_fields_in_admin_order($order, $fields, '');
}
public function order_data_after_shipping_address($order){
$fields = THWCFD_Utils::get_fields('shipping');
$this->display_fields_in_admin_order($order, $fields, '');
}
public function display_fields_in_admin_order($order, $fields, $prefix_html = ''){
if(is_array($fields)){
$html = '';
$order_id = THWCFD_Utils::get_order_id($order);
foreach($fields as $name => $field){
if(THWCFD_Utils::is_active_custom_field($field) && isset($field['show_in_order']) && $field['show_in_order'] && !THWCFD_Utils::is_wc_handle_custom_field($field)){
$order = wc_get_order( $order_id );
// $value = get_post_meta( $order_id, $key, true );
$value = $order->get_meta( $name, true );
if(!empty($value)){
$value = THWCFD_Utils::get_option_text($field, $value);
$label = isset($field['label']) && $field['label'] ? esc_html($field['label'], 'woo-checkout-field-editor-pro') : $name;
$html .= ''. $label .':
'. wptexturize($value) .'
';
}
}
}
if($html){
echo ''.$prefix_html.$html.'
';
}
}
}
/******* TABS & SECTIONS *******/
/*******************************/
public function get_current_tab(){
return isset( $_GET['tab'] ) ? sanitize_key( $_GET['tab'] ) : 'fields';
}
public function get_current_section(){
$tab = $this->get_current_tab();
$section = '';
if($tab === 'fields'){
$section = isset( $_GET['section'] ) ? sanitize_key( $_GET['section'] ) : 'billing';
}
return $section;
}
public function output_tabs(){
$current_tab = $this->get_current_tab();
if(empty($this->tabs)){
return;
}
echo '';
foreach( $this->tabs as $id => $label ){
$active = ( $current_tab == $id ) ? 'nav-tab-active' : '';
//$label = __($label, 'woo-checkout-field-editor-pro');
echo ''.$label.'';
}
echo '
';
}
public function output_sections() {
$result = false;
$current_tab = $this->get_current_tab();
$current_section = $this->get_current_section();
if(empty($this->sections)){
return;
}
$array_keys = array_keys( $this->sections );
echo '';
foreach( $this->sections as $id => $label ){
// $label = __($label, 'woo-checkout-field-editor-pro');
$url = $this->get_admin_url($current_tab, sanitize_title($id));
echo '- '. $label .' '. (end( $array_keys ) == $id ? '' : '|') .'
';
}
echo '
';
if($result){
echo $result;
}
}
public function get_admin_url($tab = false, $section = false){
$url = 'admin.php?page=checkout_form_designer';
if($tab && !empty($tab)){
$url .= '&tab='. $tab;
}
if($section && !empty($section)){
$url .= '§ion='. $section;
}
return admin_url($url);
}
private function add_wpml_support($field){
$context = 'woo-checkout-field-editor-pro';
$label = isset($field['label']) ? $field['label'] : '';
if($label){
$name = 'Field label - ' . $label;
do_action( 'wpml_register_single_string', 'woo-checkout-field-editor-pro', $name, $label );
}
$placeholder = isset($field['placeholder']) ? $field['placeholder'] : '';
if($placeholder){
$name = 'Field placeholder - ' . $placeholder;
do_action( 'wpml_register_single_string', 'woo-checkout-field-editor-pro', $name, $placeholder );
}
$options = isset($field['options']) ? $field['options'] : '';
if($options){
if(is_array($options)){
$index = 0;
foreach($options as $option_value => $option_text){
$name = 'Field option text - ' . $option_text;
do_action( 'wpml_register_single_string', 'woo-checkout-field-editor-pro', $name, $option_text );
$index++;
}
}
}
}
}
endif;