File "setting.php"

Full Path: /home/aiclgcwq/photonindustriespvt.com/wp-content/plugins/agile-store-locator/includes/admin/setting.php
File size: 23.83 KB
MIME-type: text/x-php
Charset: utf-8

<?php

namespace AgileStoreLocator\Admin;

if (!defined('ABSPATH')) {
    exit; // Exit if accessed directly.
}

use AgileStoreLocator\Admin\Base;

/**
 * The settings manager including UI, templates, cache etc functionality of the plugin.
 *
 * @link       https://agilestorelocator.com
 * @since      1.4.3
 *
 * @package    AgileStoreLocator
 * @subpackage AgileStoreLocator/Admin/Setting
 */

class Setting extends Base
{
    /**
     * [__construct description]
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * [backup_template Backup the Template into theme Root Directory]
     * @return [type] [description]
     */
    public function backup_template()
    {
        $template  = isset($_REQUEST['template']) ? sanitize_text_field($_REQUEST['template']) : null;
        $response  = \AgileStoreLocator\Helper::backup_template($template);

        return $this->send_response($response);
    }

    /**
     * [remove_template Remove the template file from the Theme Directory]
     * @return [type] [description]
     */
    public function remove_template()
    {
        $template  = isset($_REQUEST['template']) ? sanitize_text_field($_REQUEST['template']) : null;
        $response  = \AgileStoreLocator\Helper::remove_template($template);

        return $this->send_response($response);
    }

    /**
     * [expertise_level description]
     * @return [type] [description]
     */
    public function expertise_level()
    {
        $level_status = (isset($_REQUEST['status']) && $_REQUEST['status'] == '1') ? '1' : '0';

        //  Update the expertise level
        update_option('asl-expertise', $level_status);

        $this->send_response(['success' => true, 'msg' => esc_attr__('Level has been changed.', 'asl_locator')]);
    }

    /**
     * [change_options Save the Settings in the Settings table]
     */
    public function change_options($json_return = false)
    {
        global $wpdb;
        $prefix = ASL_PREFIX;

        // Data
        $content = isset($_POST['content']) ? stripslashes_deep($_POST['content']) : null;
        $type    = isset($_POST['stype']) ? stripslashes_deep($_POST['stype']) : null;

        //  Response
        $response          = new \stdclass();
        $response->success = false;

        //  When type is hidden
        if (in_array($type, ['hidden', 'cache'])) {
            $c = $wpdb->get_results("SELECT count(*) AS 'count' FROM {$prefix}settings WHERE `type` = '{$type}'");

            $data_params = ['content' => wp_json_encode($content), 'type'=> $type];

            if ($c[0]->count >= 1) {
                $wpdb->update($prefix . 'settings', $data_params, ['type'=> $type]);
            } else {
                $wpdb->insert($prefix . 'settings', $data_params);
            }

            $response->msg     = esc_attr__('Settings has been updated.', 'asl_locator');
            $response->success = true;
        }

        //  return as JSON
        if ($json_return) {
            return $response;
        }

        return $this->send_response($response);
    }

    /**
     * [save_setting save ASL Setting]
     * @return [type] [description]
     */
    public function save_setting()
    {
        global $wpdb;

        $response  = new \stdclass();

        //  Settings data
        $data_     = stripslashes_deep($_POST['data']);

        //  Remove Script tag will be saved in wp_options
        $remove_script_tag = $data_['remove_maps_script'];
        unset($data_['remove_maps_script']);

        //  Config keys
        $keys     =  array_keys($data_);

        // Hava a value?
        if (isset($data_['country_restrict']) && $data_['country_restrict']) {
            // Restrict the country validation
            $validation_result = $this->validate_country_restrictions($data_['country_restrict']);

            if (!$validation_result['valid']) {
                $response->msg      = esc_attr__('Invalid value for country restriction. Only ISO 3166-1 alpha-2 country codes are supported.', 'asl_locator');
                $response->success  = false;
                return $this->send_response($response);
            }

            $data_['country_restrict'] = $validation_result['country_restrict'];
        }

        //  Loop over the setting items
        foreach ($keys as $key) {
            $wpdb->update(
                ASL_PREFIX . 'configs',
                ['value' => $data_[$key]],
                ['key'   => $key]
            );
        }

        //  register/de-register the lead cron job for the follow-ups
        if (isset($data_['lead_follow_up'])) {
            \AgileStoreLocator\Cron\LeadCron::schedule_cron($data_['lead_follow_up'], $data_);
        }

        ///////////////////////////
        //  Save Custom Settings //
        ///////////////////////////
        $custom_map_style = $_POST['map_style'];

        //  Custom Map Style
        \AgileStoreLocator\Helper::set_setting(stripslashes($custom_map_style), 'map_style', 'map_style');

        $custom_slug_fields = $_POST['slug_attr_ddl'];

        //  Slug Attributes
        \AgileStoreLocator\Helper::set_setting(stripslashes($custom_slug_fields), 'slug_attr_ddl');

        update_option('asl-remove_maps_script', $remove_script_tag);

        $response->msg     = esc_attr__('Setting has been updated successfully.', 'asl_locator');
        $response->success = true;

        //  Valid the Default Coordinates
        $is_valid  = \AgileStoreLocator\Helper::validate_coordinate($data_['default_lat'], $data_['default_lng']);

        //  is invalid?
        if (!$is_valid) {
            $response->msg .= '<br>' . esc_attr__('Error! Default Lat & Lng are invalid values, please try to swap them.', 'asl_locator');
            $response->success  = false;
        }

        return $this->send_response($response);
    }

    /**
     * [manage_cache Refresh the JSON]
     * @return [type] [description]
     */
    public function manage_cache()
    {
        global $wpdb;

        $response          = new \stdclass();
        $response->success = false;

        $cache_status = (isset($_REQUEST['status']) && $_REQUEST['status'] == '1') ? '1' : '0';
        $cache_lang   = (isset($_REQUEST['asl-lang'])) ? sanitize_text_field($_REQUEST['asl-lang']) : null;

        //  Todo, Make sure the folder exist?
        if (!file_exists(ASL_UPLOAD_DIR)) {
            mkdir(ASL_UPLOAD_DIR, 0775, true);
        }

        if (!$cache_lang) {
            $response->error = esc_attr__('Error! Lang is not defined.', 'asl_locator');
            
        }

        //  en_US is default
        if ($cache_lang == 'en_US') {
            $cache_lang = '';
        }

        //  JSON file
        $json_file = 'locator-data' . (($cache_lang) ? '-' . $cache_lang : '') . '.json';

        //  Generate the JSON file when enabled
        if ($cache_status == '1') {
            //  Generate the Output
            $public_request = new \AgileStoreLocator\Frontend\Request();
            $output_result  = $public_request->load_stores(true, $cache_lang);

            //  Save the output
            $response->output   = file_put_contents(ASL_UPLOAD_DIR . $json_file, json_encode($output_result));

            //  When fails
            if (!$response->output) {
                $response->path   = ASL_UPLOAD_DIR . $json_file;
            }

            $response->msg      = esc_attr__('Cache JSON has been generated successfully for language ' . $cache_lang, 'asl_locator');
        } else {
            $response->msg      = esc_attr__('Cache JSON is disabled for language ' . $cache_lang, 'asl_locator');
        }

        //  Save the cache settings
        $this->change_options(true);

        //  Show as success
        $response->success  = true;

        return $this->send_response($response);
    }

    /**
     * [load_custom_template Load ASL Custom Template]
     * @return [type] [description]
     */
    public function load_custom_template()
    {
        global $wpdb;

        $response          = new \stdclass();
        $response->success = false;

        $data_ = stripslashes_deep($_POST);

        //  List template doesn't have any infobox
        if (in_array($data_['template'], ['template-list', 'template-list-2', 'store-grid']) && $data_['section'] == 'infobox') {
            $response->error = esc_attr__('Template has no infobox.', 'asl_locator');
            return $this->send_response($response);
        }

        $html  = '';

        if ($data_['template'] != 'cards-templates') {
            $count = $wpdb->get_results($wpdb->prepare("SELECT COUNT('name') as 'count' FROM " . ASL_PREFIX . 'settings WHERE `name` = %s AND `type` = %s', $data_['template'], $data_['section']));

            if ($count[0]->count >= 1) {
                //  Template Query
                $results = $wpdb->get_results($wpdb->prepare('SELECT `content` FROM ' . ASL_PREFIX . 'settings WHERE `name` = %s AND `type` = %s', $data_['template'], $data_['section']), ARRAY_A);

                if ($results) {
                    $html = $results[0]['content'];
                }
            } else {
                
                // include simple products HTML
                //$view_file_path = ASL_PLUGIN_PATH . 'public/views/' . (($data_['template'] == 'advanced_marker') ? 'markers/' : '') . $data_['template'] . '-' . $data_['section'] . '.html';

                $view_file_path = \AgileStoreLocator\Helper::get_customizer_file_path($data_['template'], $data_['section']);

                $html = file_get_contents($view_file_path);
            }
        } elseif ($data_['template'] == 'cards-templates') {
            if (file_exists(STYLESHEETPATH . '/' . $data_['section'] . '.php')) {
                $view_file_path = STYLESHEETPATH . '/' . $data_['section'] . '.php';
            } else {
                $view_file_path = ASL_PLUGIN_PATH . 'public/partials/' . $data_['section'] . '.php';
            }

            $html = file_get_contents($view_file_path);
        }

        if (!empty($html)) {
            $response->html = $html;

            $response->msg     = esc_attr__('HTML added in TextEditor', 'asl_locator');
            $response->success = true;
        }

        return $this->send_response($response);
    }

    /**
     * [save_custom_template Load ASL Custom Template]
     * @return [type] [description]
     */
    public function save_custom_template()
    {
        global $wpdb;

        $response          = new \stdclass();
        $response->success = false;

        $data_ = stripslashes_deep($_POST);

        // $ext = substr($data_['template'], strrpos($data_['template'], '.') + 1);

        if (!empty($data_['html'])) {

            if ($data_['template'] != 'cards-templates') {
                //  get previous quantity
                $count = $wpdb->get_results($wpdb->prepare("SELECT COUNT('name') as 'count' FROM " . ASL_PREFIX . 'settings WHERE `name` = %s AND `type` = %s', $data_['template'], $data_['section']));

                $data_params = ['name' =>  $data_['template'], 'type' => $data_['section'], 'content' => $data_['html']];

                if ($count[0]->count >= 1) {
                    //  Execute the Update Query
                    $wpdb->update(ASL_PREFIX . 'settings', $data_params, ['name' => $data_['template'], 'type' => $data_['section']]);
                } else {
                    //  Execute the Insert Query
                    $wpdb->insert(ASL_PREFIX . 'settings', $data_params);
                }

                $response->msg     = esc_attr__('Template Updated', 'asl_locator');
                $response->success = true;
            }
        }

        return $this->send_response($response);
    }

    /**
     * [reset_custom_template Load ASL Custom Template]
     * @return [type] [description]
     */
    public function reset_custom_template()
    {
        global $wpdb;

        $response          = new \stdclass();
        $response->success = false;

        $data_ = stripslashes_deep($_POST);

        if ($data_['template'] != 'cards-templates') {
            
            //$view_file_path = ASL_PLUGIN_PATH . 'public/views/' . (($data_['template'] == 'advanced_marker') ? 'markers/' : '') . $data_['template'] . '-' . $data_['section'] . '.html';
            $view_file_path = \AgileStoreLocator\Helper::get_customizer_file_path($data_['template'], $data_['section']);
        }
        elseif ($data_['template'] == 'cards-templates') {
            $view_file_path = ASL_PLUGIN_PATH . 'public/partials/' . $data_['section'] . '.php';
        }

        // include simple products HTML
        $html = file_get_contents($view_file_path);

        $response->html    = $html;
        $response->msg     = esc_attr__('Default template is loaded', 'asl_locator');
        $response->success = true;

        return $this->send_response($response);
    }

    /**
   * [load_ui_settings Load ASL Custom Template]
   * @return [type] [description]
   */
    public function load_ui_settings()
    {
        global $wpdb;

        $response          = new \stdclass();
        $response->success = false;

        $template = $_POST['template'];

        $colors   = [
            'template-0'  => [
                'primary'           => 'clr-primary',
                'header'            => '',
                'header-color'      => '',
                'infobox-color'     => '',
                'infobox-bg'        => '',
                'infobox-a'         => 'clr-copy',
                'action-btn-color'  => '',
                'action-btn-bg'     => 'clr-copy',
                'color'             => '',
                'list-bg'           => '',
                'list-title'        => '',
                'list-sub-title'    => '',
                'highlighted'       => ''
            ],
            'template-wc'  => [
                'primary'   => 'clr-primary'
            ],
        ];

        $white                  = '#FFFFFF';
        $black                  = '#000000';

        $tmpl_0_primary         = '#cb2800';
        $tmpl_0_title_color     = '#32373c';
        $tmpl_0_sub_title_color = '#6a6a6a';
        $tmpl_0_list_color      = '#555d66';
        $tmpl_0_header_bg       = '#F7F7F7';
        $tmpl_0_header_color    = '#32373c';
        $tmpl_0_highlighted     = '#F7F7F7';

        $tmpl_1_primary         = '#000000';
        $tmpl_1_secondary       = '#EF5A28';
        $tmpl_1_title_color     = '#32373c';
        $tmpl_1_sub_title_color = '#6a6a6a';
        $tmpl_1_list_color      = '#555d66';
        $tmpl_1_header_bg       = $tmpl_1_primary;
        $tmpl_1_highlighted     = '#F7F7F7';

        $tmpl_2_primary         = '#cb2800';
        $tmpl_2_secondary       = '#cb2800';
        $tmpl_2_title_color     = '#32373c';
        $tmpl_2_sub_title_color = '#6a6a6a';
        $tmpl_2_list_color      = '#555d66';
        $tmpl_2_header_bg       = '#F7F7F7';
        $tmpl_2_highlighted     = '#F7F7F7';

        $tmpl_3_primary         = '#cb2800';
        $tmpl_3_title_color     = '#32373c';
        $tmpl_3_sub_title_color = '#6a6a6a';
        $tmpl_3_list_color      = '#555d66';
        $tmpl_3_header_bg       = '#F7F7F7';
        $tmpl_3_highlighted     = '#F7F7F7';

        //  the default colors that will load with the customizer
        $default_colors = [
            'template-0'  => [
                'primary'                => $tmpl_0_primary,
                'header'                 => $tmpl_0_header_bg,
                'header-color'           => $tmpl_0_header_color,
                'infobox-color'          => $tmpl_0_list_color,
                'infobox-bg'             => $white,
                'infobox-a'              => $tmpl_0_primary,
                'action-btn-color'       => $white,
                'action-btn-bg'          => $tmpl_0_primary,
                'color'                  => $tmpl_0_list_color,
                'list-bg'                => $white,
                'list-title'             => $tmpl_0_title_color,
                'list-sub-title'         => $tmpl_0_sub_title_color,
                'highlighted'            => $tmpl_0_highlighted,
                'highlighted-list-color' => $tmpl_0_primary
            ],
            'template-wc'  => [
                'primary'   => $tmpl_0_primary
            ]
        ];

        $default_fonts  = [
            'template-0'  => [
                'font-size'   => 13,
                'title-size'  => 15,
                'btn-size'    => 13
            ],
            'template-wc'  => [
                'font-size'   => 13,
                'title-size'  => 16,
                'btn-size'    => 13
            ]
        ];

        $html     = '';
        $fields   = '';

        //  Only get the array of active default color
        $default_colors  = $default_colors[$template];
        $default_fonts   = $default_fonts[$template];

        $fields_settings = \AgileStoreLocator\Helper::get_setting('ui-template', $template);

        if ($fields_settings) {
            $fields = json_decode($fields_settings);
        }

        //  Start Stream
        ob_start();

        // include ui customizer fields products HTML
        include ASL_PLUGIN_PATH . 'admin/partials/ui-customizer-fields.php';

        $html = ob_get_contents();

        //  Clean it
        ob_end_clean();

        $response->html     = $html;
        $response->msg      = esc_attr__('Template UI settings updated', 'asl_locator');
        $response->success  = true;

        return $this->send_response($response);
    }

    /**
     * [sl_theme_ui_save Save ASL UI Settings]
     * @return [type] [description]
     */
    public function sl_theme_ui_save()
    {
        global $wpdb;

        $response          = new \stdclass();
        $response->success = false;

        $data_    = stripslashes_deep($_POST['sl_formData']);
        $template = sanitize_text_field($_POST['sl_template']);

        $data     = json_encode($data_);

        \AgileStoreLocator\Helper::set_setting($data, 'ui-template', $template);

        $response->msg     = esc_attr__('Template updated', 'asl_locator');
        $response->success = true;

        return $this->send_response($response);
    }

    /**
     * [validate_country_restrictions Validate the country restriction]
     * @param  [type] $country_restrict [description]
     * @return [type]                   [description]
     */
    private function validate_country_restrictions($country_restrict)
    {
        // List of valid ISO 3166-1 alpha-2 country codes
        $valid_countries = [
            'AF', 'AX', 'AL', 'DZ', 'AS', 'AD', 'AO', 'AI', 'AQ', 'AG', 'AR', 'AM', 'AW', 'AU', 'AT', 'AZ',
            'BS', 'BH', 'BD', 'BB', 'BY', 'BE', 'BZ', 'BJ', 'BM', 'BT', 'BO', 'BQ', 'BA', 'BW', 'BV', 'BR',
            'IO', 'BN', 'BG', 'BF', 'BI', 'CV', 'KH', 'CM', 'CA', 'KY', 'CF', 'TD', 'CL', 'CN', 'CX', 'CC',
            'CO', 'KM', 'CG', 'CD', 'CK', 'CR', 'HR', 'CU', 'CW', 'CY', 'CZ', 'DK', 'DJ', 'DM', 'DO', 'EC',
            'EG', 'SV', 'GQ', 'ER', 'EE', 'SZ', 'ET', 'FK', 'FO', 'FJ', 'FI', 'FR', 'GF', 'PF', 'TF', 'GA',
            'GM', 'GE', 'DE', 'GH', 'GI', 'GR', 'GL', 'GD', 'GP', 'GU', 'GT', 'GG', 'GN', 'GW', 'GY', 'HT',
            'HM', 'VA', 'HN', 'HK', 'HU', 'IS', 'IN', 'ID', 'IR', 'IQ', 'IE', 'IM', 'IL', 'IT', 'JM', 'JP',
            'JE', 'JO', 'KZ', 'KE', 'KI', 'KP', 'KR', 'KW', 'KG', 'LA', 'LV', 'LB', 'LS', 'LR', 'LY', 'LI',
            'LT', 'LU', 'MO', 'MG', 'MW', 'MY', 'MV', 'ML', 'MT', 'MH', 'MQ', 'MR', 'MU', 'YT', 'MX', 'FM',
            'MD', 'MC', 'MN', 'ME', 'MS', 'MA', 'MZ', 'MM', 'NA', 'NR', 'NP', 'NL', 'NC', 'NZ', 'NI', 'NE',
            'NG', 'NU', 'NF', 'MK', 'MP', 'NO', 'OM', 'PK', 'PW', 'PS', 'PA', 'PG', 'PY', 'PE', 'PH', 'PN',
            'PL', 'PT', 'PR', 'QA', 'RE', 'RO', 'RU', 'RW', 'BL', 'SH', 'KN', 'LC', 'MF', 'PM', 'VC', 'WS',
            'SM', 'ST', 'SA', 'SN', 'RS', 'SC', 'SL', 'SG', 'SX', 'SK', 'SI', 'SB', 'SO', 'ZA', 'GS', 'SS',
            'ES', 'LK', 'SD', 'SR', 'SJ', 'SE', 'CH', 'SY', 'TW', 'TJ', 'TZ', 'TH', 'TL', 'TG', 'TK', 'TO',
            'TT', 'TN', 'TR', 'TM', 'TC', 'TV', 'UG', 'UA', 'AE', 'GB', 'US', 'UM', 'UY', 'UZ', 'VU', 'VE',
            'VN', 'VG', 'VI', 'WF', 'EH', 'YE', 'ZM', 'ZW'
        ];

        $countries             = explode(',', $country_restrict);
        $valid                 = true;
        $countries_to_restrict = [];

        foreach ($countries as $country) {
            $country                 = strtoupper(trim($country));
            $countries_to_restrict[] = $country;
            if (!in_array($country, $valid_countries)) {
                $valid = false;
                break;
            }
        }

        return [
            'valid'            => $valid,
            'country_restrict' => implode(',', $countries_to_restrict)
        ];
    }

    /**
     * [save_custom_fields Save Custom Fields AJAX]
     * @return [type] [description]
     */
    public function save_custom_fields()
    {
        global $wpdb;
        $prefix = ASL_PREFIX;

        $response          = new \stdclass();
        $response->success = false;

        $fields = isset($_POST['fields']) ? ($_POST['fields']) : [];

        //  Filter the JSON for XSS
        $filter_fields = [];

        foreach ($fields as $field_key => $field) {
            $field_key = strip_tags($field_key);

            $field['type']  = strip_tags(sanitize_text_field($field['type']));
            $field['name']  = strip_tags(sanitize_text_field($field['name']));
            $field['label'] = strip_tags(sanitize_text_field($field['label']));

            $filter_fields[$field_key] = $field;
        }

        $c = $wpdb->get_results("SELECT count(*) AS 'count' FROM {$prefix}settings WHERE `type` = 'fields'");

        $data_params = ['content' => wp_json_encode($filter_fields), 'type'=> 'fields'];

        if ($c[0]->count >= 1) {
            $wpdb->update($prefix . 'settings', $data_params, ['type'=> 'fields']);
        } else {
            $wpdb->insert($prefix . 'settings', $data_params);
        }

        /*$wpdb->show_errors = true;
        $response->error = $wpdb->print_error();
        $response->error1 = $wpdb->last_error;*/

        $response->msg     = esc_attr__('Fields has been updated successfully.', 'asl_locator');
        $response->success = true;

        return $this->send_response($response);
    }

    /**
   * [import_configs Import the Configs]
   * @return [type] [description]
   */
    public function import_configs()
    {
        $response          = new \stdclass();
        $response->title   = esc_attr__('Configuration Import', 'asl_locator');

        // Must be an administrator
        if (current_user_can('administrator')) {
            $jsonText          = isset($_POST['configs']) ? stripslashes_deep($_POST['configs']) : null;
            $import_results    = ($jsonText) ? (\AgileStoreLocator\Model\Config::import_configuration($jsonText)) : false;

            //  Has imported or not?
            if ($import_results > 0) {
                $response->message = esc_attr__('Config has been imported successfully', 'asl_locator');
                $response->success = true;
            } else {
                $response->message = esc_attr__('Failed to import configuration, contact support for help.', 'asl_locator');
            }
        } else {
            $response->message = esc_attr__('Administrator permissions are required.', 'asl_locator');
        }

        return $this->send_response($response);
    }

    /**
     * [export_configs Export the Configs]
     * @return [type] [description]
     */
    public function export_configs()
    {
        $response  = new \stdclass();

        $response->configs = \AgileStoreLocator\Model\Config::export_config();

        $response->message              = esc_attr__('Config exported successfully', 'asl_locator');
        $response->copy_message         = esc_attr__('Copied successfully', 'asl_locator');
        $response->export_text_content  = esc_attr__('Warning! Export includes all configuration including API keys, labels, customizations and maps related settings.', 'asl_locator');
        $response->success              = true;

        return $this->send_response($response);
    }
}