5. 2 Xử lý ajax trong file pfajaxhandler.php && validate form submit (ok)

<?php
if (class_exists('Coreelements_AJAX')) {
  return;
}
class Coreelements_AJAX {
  use OptionFunctions;
}
<?php
if (!class_exists('PF_SF_Val')) {
  class PF_SF_Val {
    use OptionFunctions;
    public $FieldOutput;
    public $ScriptOutput;
    public function __construct() {}
    function GetMiniSearch($minisearchc = 1) {
      switch ($minisearchc) {
        case '3':
          return '<div class="col-lg-3 col-md-3 col-sm-6 colhorsearch lionel2">';
        break;
      }
    }
    function ShowOnlyWidgetCheck($widget, $url, $minisearch) {
      $showonlywidget_check = 'show';
      $showonlywidget       = $this->PFSFIssetControl('setupsearchfields_' . $url . '_showonlywidget', '', '0');
      $minisearchadm        = $this->PFSFIssetControl('setupsearchfields_' . $url . '_minisearch', '', '0');
      $minisearchso         = $this->PFSFIssetControl('setupsearchfields_' . $url . '_minisearchso', '', '0');
      if ($showonlywidget == 0 && $widget == 0) {
        $showonlywidget_check = 'show';
      } elseif ($showonlywidget == 1 && $widget == 0) {
        $showonlywidget_check = 'hide';
      } else {
        $showonlywidget_check = 'show';
      }
      if ($minisearch == 1 && $minisearchadm == 0) {
        $showonlywidget_check = 'hide';
      } elseif ($minisearch == 0 && $minisearchso == 1) {
        $showonlywidget_check = 'hide';
      }
      return $showonlywidget_check;
    }
    function GetValue($title, $url, $ftype, $widget = 0, $pfgetdata = array(), $hormode = 0, $minisearch = 0, $minisearchc = 1) {
      $showonlywidget_check = $this->ShowOnlyWidgetCheck($widget, $url, $minisearch);
      switch ($ftype) {
        case '4':
          if ($showonlywidget_check == 'show') {
            $target      = $this->PFSFIssetControl('setupsearchfields_' . $url . '_target_target', '', '');
            $fieldtext   = '';
            $placeholder = $this->PFSFIssetControl('setupsearchfields_' . $url . '_placeholder', '', '');
            if ($hormode == 1 && $widget == 1 && $minisearch == 1) {
              $this->FieldOutput .= $this->GetMiniSearch($minisearchc);
            }
            if (array_key_exists($url, $pfgetdata)) {
              $valtext = ' value = "' . $pfgetdata[$url] . '" ';
            } else {
              $valtext = '';
            }
            $this->FieldOutput .= '
						<div id="' . $url . '_main">
							<label class="lbl-ui pflabelfixsearch pflabelfixsearch' . $url . '">
								<input type="text" name="' . $url . '" id="' . $url . '" class="input" placeholder="' . $placeholder . '"' . $valtext . ' />
							</label>
						</div>';
            $this->ScriptOutput .= '
						$( "#' . $url . '" ).on("keydown",function(){
							$( "#' . $url . '" ).autocomplete({
					      source: function( request, response ) {
					        $.ajax({
					          url: theme_scriptspf.ajaxurl,
					          dataType: "jsonp",
					          data: {
					          	action: "pfget_autocomplete",
					            q: request.term,
					            security: theme_scriptspf.pfget_autocomplete,
					            lang: "vi",
					            ftype: "' . $target . '"
					          },
					          success: function( data ) {
					            response( data );
					          }
					        });
					      },
					      minLength: 2,
					      select: function( event, ui ) {
					        $("#' . $url . '").val(ui.item);
					      }
						  });
						});';
            if ($hormode == 1 && $widget == 1 && $minisearch == 1) {
              $this->FieldOutput .= '</div>';
            }
          }
          break;
      }
    }
  }
}
?>
<?php

if (class_exists('AutoCMPLT')) {
  return;
}
class AutoCMPLT extends Coreelements_AJAX {
  public function pf_ajax_autocomplete() {
    check_ajax_referer('pfget_autocomplete', 'security');
    header('Content-Type: application/javascript; charset=UTF-8;');
    if (isset($_GET['ftype']) && $_GET['ftype'] != '') {
      $ftype = sanitize_text_field($_GET['ftype']);
    }
    if (isset($_GET['callback']) && $_GET['callback'] != '') {
      $callback = sanitize_text_field($_GET['callback']);
    };
    $tax_query                = false;
    $setup3_pointposttype_pt1 = $this->PFSAIssetControl('setup3_pointposttype_pt1', '', '');
    $args                     = array('post_type' => $setup3_pointposttype_pt1, 'post_status' => 'publish', 'posts_per_page' => 5);
    $output_arr               = array();
    $the_query                = new WP_Query($args);
    if ($the_query->have_posts()):
      while ($the_query->have_posts()): $the_query->the_post();
        if ($ftype == 'title' || $ftype == 'description' || $ftype == 'title_description') {
          $output_arr[] = html_entity_decode(get_the_title());
        }
      endwhile;
      wp_reset_postdata();
    endif;
    echo $callback . '(' . json_encode($output_arr) . ');';
    die();
  }
}
<?php
if ( ! defined( 'ABSPATH' ) ) {
  die( '-1' );
}
class SearchShortcode extends WPBakeryShortCode {
  use OptionFunctions;
  function __construct() {
    add_shortcode( 'pf_searchw', array( $this, 'single_pf_searchw_module_html' ) );
  }
  public function single_pf_searchw_module_html( $atts ) {
    $output = $title = $number = $el_class = $mini_style = '';
    extract( 
      shortcode_atts( 
        array(
          'minisearchc' => 1,
          'searchbg' => '',
          'searchtext' => '',
          'mini_padding_tb' => 0,
          'mini_padding_lr' => 0,
          'mini_bg_color' => '',
          'mini_radius' => 0
        ), $atts 
      ) 
    );
    $coln = '<div class="col-lg-3 col-md-3 col-sm-6 colhorsearch">';
    switch ($minisearchc) {
      case '3':
      $coln = '<div class="col-lg-3 col-md-3 col-sm-6 colhorsearch lionel1">';
      break;
    }
    $mini_style = " style='";
    if (!empty($mini_bg_color)) {
      $mini_style .= "background-color:".$mini_bg_color.';';
    }
    $mini_style .= "padding: ".$mini_padding_tb."px ".$mini_padding_lr."px;";
    if (!empty($mini_radius)) {
      $mini_style .= "border-radius:".$mini_radius.'px;';
    }
    $mini_style .= "'";
    if ($searchbg != '' && $searchtext != '') {
      $searchb_style = " style='color:".$searchtext."!important;background-color:".$searchbg."!important'";
    } else {
      $searchb_style = "";
    }
    ob_start();
    ?>
    <div class="-mini-search <?php echo ' pfministyle'.$minisearchc;?>"<?php echo $mini_style;?>>
      <form id="pointfinder-search-form-manual" class="pfminisearch" method="get" action="<?php echo esc_url(home_url("/")); ?>" data-ajax="false">
        <div class="pfsearch-content golden-forms">
          <div class="pf-row">
            <?php 
              $setup1s_slides = $this->PFSAIssetControl('setup1s_slides','','');
              if(is_array($setup1s_slides)){     
              $PFListSF = new PF_SF_Val();
              foreach ($setup1s_slides as $value) {
                $PFListSF->GetValue($value['title'],$value['url'],4,1,[],1,1,3);
              }
              echo $PFListSF->FieldOutput;
              echo $coln;
                echo '<div id="pfsearchsubvalues"></div>';
                echo '<input type="hidden" name="s" value=""/>';
                echo '<input type="hidden" name="serialized" value="1"/>';
                echo '<input type="hidden" name="action" value="pfs"/>';
                echo '<a class="button pfsearch" id="pf-search-button-manual"'.$searchb_style.'><i class="pfadmicon-glyph-627"></i> '.esc_html__('SEARCH', 'pointfindercoreelements').'</a>';
                $script_output = '
                (function($) {
                  $(function(){'.$PFListSF->ScriptOutput;$script_output .= '});';
                }
                $script_output .='})(jQuery);';
                wp_add_inline_script('theme-scriptspf',$script_output,'after');
              echo '</div>';
            ?>
          </div>
        </div>
      </form>
    </div>
  <?php
    $output = ob_get_contents();
    ob_end_clean();
    return $output;
  }
}
new SearchShortcode();
<?php

if (!trait_exists('OptionFunctions')) {
  /**
   * Option Functions
   */
  trait OptionFunctions {
    public function PFSAIssetControl($field, $field2 = '', $default = '') {
      $pointfindertheme_option = array(
        'setup3_pointposttype_pt1' => 'listing',
        'setup1s_slides'           => array(
          0 => array(
            'select' => '4',
            'title'  => 'Keyword',
            'url'    => 'jobskeyword',
            'sort'   => '12',
          ),
        ),
      );
      return $pointfindertheme_option['' . $field . ''];
    }
    public function PFSFIssetControl($field, $field2 = '', $default = '') {
      $pfsearchfields_options = array(
        'setupsearchfields_jobskeyword_minisearch'       => '1',
        'setupsearchfields_field_listingtype_minisearch' => '1',
        'setupsearchfields_jobskeyword_placeholder'      => 'Từ khóa',
        'setupsearchfields_jobskeyword_target_target'    => 'title',
        'setupsearchfields_jobskeyword_showonlywidget'   => '0',
        'setupsearchfields_jobskeyword_minisearchso'     => '0'
      );
      return $pfsearchfields_options['' . $field . ''];
    }
  }
}
<?php
class Coreelements_Loader {
  protected $actions;
  public function __construct() {
    $this->actions = array();
  }
  public function add_action($hook, $component, $callback, $priority = 10, $accepted_args = 1) {
    $this->actions = $this->add($this->actions, $hook, $component, $callback, $priority, $accepted_args);
  }
  private function add($hooks, $hook, $component, $callback, $priority, $accepted_args) {
    $hooks[] = array(
      'hook'          => $hook,
      'component'     => $component,
      'callback'      => $callback,
      'priority'      => $priority,
      'accepted_args' => $accepted_args,
    );
    return $hooks;
  }
  public function run() {
    foreach ($this->actions as $hook) {
      add_action($hook['hook'], array($hook['component'], $hook['callback']), $hook['priority'], $hook['accepted_args']);
    }
  }
}
?>
<?php
class Coreelements {
  use OptionFunctions;
  protected $loader;
  public function __construct() {
    $this->load_dependencies();
    $this->define_public_hooks();
    $this->define_ajax_hooks();
  }
  private function load_dependencies() {
    require_once PFCOREELEMENTSDIR . '/pfgetsearchfields.php';
    if (function_exists('vc_set_shortcodes_templates_dir')) {
      require_once PFCOREELEMENTSDIR . '/includes/pf-search.php';
    }
    require_once PFCOREELEMENTSDIR . '/coreelements-loader.php';
    require_once PFCOREELEMENTSDIR . '/coreelements-public.php';
    require_once PFCOREELEMENTSDIR . '/coreelements-ajax.php';
    require_once PFCOREELEMENTSDIR . '/autocomplete.php';
    require_once PFCOREELEMENTSDIR . '/coreelements-dashboard-page.php';
    $this->loader = new Coreelements_Loader();
  }
  private function define_public_hooks() {
    $plugin_public = new Coreelements_Public();
    $this->loader->add_action('wp_enqueue_scripts', $plugin_public, 'enqueue_styles_scripts');
    $plugin_dashboardpage = new DashboardPageClass();
    $this->loader->add_action('dashboardpage_hook', $plugin_dashboardpage, 'dashpage_maindash');
  }
  private function define_ajax_hooks() {
    $AutoCMPLT = new AutoCMPLT();
    $this->loader->add_action('PF_AJAX_HANDLER_pfget_autocomplete', $AutoCMPLT, 'pf_ajax_autocomplete');
    $this->loader->add_action('PF_AJAX_HANDLER_nopriv_pfget_autocomplete', $AutoCMPLT, 'pf_ajax_autocomplete');
  }
  public function run() {
    $this->loader->run();
  }
}
?>
<?php
if (!isset($_POST['action'])) {
  if (!isset($_GET['action'])) {
    die('Not supported.');
  }
};
$absolute_path = __FILE__;
$path_to_file  = explode('wp-content', $absolute_path);
$path_to_wp    = $path_to_file[0];
require_once $path_to_wp . '/wp-load.php';
if (empty($action)) {
  $action = trim($_GET['action']);
}
$allowed_actions = array(
  'pfget_autocomplete',
);
if (in_array($action, $allowed_actions)) {
  if (is_user_logged_in()) {
    do_action('PF_AJAX_HANDLER_' . $action);
  } else {
    do_action('PF_AJAX_HANDLER_nopriv_' . $action);
  }
} else {
  die('-2');
}
?>
<?php
if (class_exists('DashboardPageClass')) {
  return;
}
class DashboardPageClass {
  public function __construct() {}
  public function dashpage_maindash() {
    echo '<section role="main" style="margin-top: 100px;">';
	    echo '<div class="pf-container">';
		    echo '<div class="pf-row">';
			    echo '<div class="col-lg-12">';
			    	the_content();
			    echo '</div>';
		    echo '</div>';
	    echo '</div>';
    echo '</section>';
  }
}
?>
<?php
class Coreelements_Public {
  public function enqueue_styles_scripts() {
    wp_register_script('theme-scriptspf', PFCOREELEMENTSURLPUBLIC . 'js/theme-scripts.js', ['jquery', 'jquery-ui-autocomplete','jquery-ui-widget', 'jquery-ui-position'], '2.0', true);
    wp_enqueue_script('theme-scriptspf');
    wp_localize_script('theme-scriptspf', 'theme_scriptspf', array('ajaxurl' => PFCOREELEMENTSURLINC . 'pfajaxhandler.php', 'pfget_autocomplete' => wp_create_nonce('pfget_autocomplete'),
    ));
  }
}
?>
jQuery(document).ready(function($) {
  $('body').on('click', '#pf-search-button-manual', function() {
    var form = $('#pointfinder-search-form-manual');
    form.validate();
    if (form.valid()) {
      form.submit();
    };
    return false;
  });
});

Last updated