# \[FRAMEWORK] Xây dựng page Account Phần 7 (ok)

![](/files/7ay7n9iOrxspWhxcn5gU)

C:\xampp\htdocs\wordpress8\wp-content\themes\addframwork\framework\ajax\event.php

```
<?php
add_action('wp_ajax_event_favorite_process', 'event_favorite_process');
function event_favorite_process() {
  if (!isset($_POST['token']) or !is_numeric($_POST["id"]) or !wp_verify_nonce($_POST['token'], BJ_NONCE_KEY . 'event' . $_POST["id"])) {
    die(json_encode(["error"]));
  }
  $type            = isset($_POST["type"]) && in_array($_POST["type"], ["going", "maybe"]) ? $_POST['type'] : "maybe";
  $current_user_id = get_current_user_id();
  global $bj_controller;
  $model  = $bj_controller->Model("event");
  $result = $model->event_favorite_process_user($_POST["id"], $current_user_id, $type);
  if ($result != false) {
    if (isset($_POST['page']) && $_POST['page'] == "single") {
      die(json_encode(["success", count($model->get_event_list_user($_POST["id"])), count($model->get_event_list_user($_POST["id"], "maybe"))]));
    } else {
      die(json_encode(["success"]));
    }
  }
  die(json_encode(["error"]));
}
?>
```

C:\xampp\htdocs\wordpress8\wp-content\themes\addframwork\framework\models\event.php

```
<?php
class BJ_event_Model {
  private $table_event = 'bj_event';
  public function get_list_event_id_saved($user_id) {
    global $wpdb;
    $arr    = [];
    $table  = $wpdb->prefix . "bj_event_user";
    $result = $wpdb->get_results($wpdb->prepare(" SELECT event_id FROM  {$table} WHERE user_id = %d ", $user_id), ARRAY_A);
    if (!empty($result)) {
      foreach ($result as $value) {
        $arr[] = $value["event_id"];
      }
    }
    return $arr;
  }
  public function get_list_event_saved($user_id) {
    global $wpdb;
    $table         = $wpdb->prefix . $this->table_event;
    $list_event_id = $this->get_list_event_id_saved($user_id);
    if (!empty($list_event_id)) {
      $array  = implode("','", $list_event_id);
      $result = $wpdb->get_results("SELECT * FROM  {$table} WHERE id IN ('{$array}')", ARRAY_A);
      if (!empty($result)) {
        return $result;
      }
    }
  }
  public function get_event_user_status($event_id, $user_id) {
    global $wpdb;
    $table  = $wpdb->prefix . "bj_event_user";
    $result = $wpdb->get_results($wpdb->prepare(" SELECT type FROM  {$table} WHERE event_id = %d AND user_id = %d", $event_id, $user_id), ARRAY_A);
    if (!empty($result)) {
      return $result[0]["type"];
    }
  }
  public function get_event_list_user($event_id,$type = "going"){
    global $wpdb;
    $arr = [];
    $table = $wpdb->prefix."bj_event_user";
    $result = $wpdb->get_results ( $wpdb->prepare(" SELECT user_id FROM  {$table} WHERE event_id = %d AND type = %s",$event_id,$type) ,ARRAY_A);
    if(!empty($result)){
      foreach ($result as  $value) {
        $arr[] = $value["user_id"];
      }
    };
    return $arr;
  }
  public function event_favorite_process_user($event_id, $user_id, $type = "maybe") {
    global $wpdb;
    $table  = $wpdb->prefix . "bj_event_user";
    $result = $wpdb->get_results($wpdb->prepare(" SELECT id ,type FROM  {$table} WHERE event_id = %d AND user_id = %d", $event_id, $user_id), ARRAY_A);
    if (empty($result)) {
      $wpdb->insert($table, ["event_id" => $event_id, "user_id" => $user_id, "type" => $type], ["%d", "%d", "%s"]);
      $favorite_result = $wpdb->insert_id;
    } else {
      $result = $result[0];
      if ($result["type"] == $type) {
        $favorite_result = $wpdb->delete($table, ["event_id" => $event_id, "user_id" => $user_id], ["%d", "%d"]);
      } else {
        $favorite_result = $wpdb->update($table, ["type" => $type], ["event_id" => $event_id, "user_id" => $user_id], ["%s"], ["%d", "%d"]);
      }
    }
    $table  = $wpdb->prefix . "bj_event";
    $result = $wpdb->update($table, ["going" => count($this->get_event_list_user($event_id))], ["id" => $event_id], ["%d"], ["%d"]);
    return $favorite_result;
  }
}
```

C:\xampp\htdocs\wordpress8\wp-content\themes\addframwork\functions.php

```
<?php
add_action('after_setup_theme', 'blankslate_setup');
function blankslate_setup() {
  load_theme_textdomain('blankslate', get_template_directory() . '/languages');
  add_theme_support('title-tag');
  add_theme_support('post-thumbnails');
  add_theme_support('responsive-embeds');
  add_theme_support('automatic-feed-links');
  add_theme_support('html5', array('search-form', 'navigation-widgets'));
  add_theme_support('woocommerce');
  global $content_width;
  if (!isset($content_width)) {$content_width = 1920;}
  register_nav_menus(array('main-menu' => esc_html__('Main Menu', 'blankslate')));
}
add_filter('document_title_separator', 'blankslate_document_title_separator');
function blankslate_document_title_separator($sep) {
  $sep = esc_html('|');
  return $sep;
}
add_filter('the_title', 'blankslate_title');
function blankslate_title($title) {
  if ($title == '') {
    return esc_html('...');
  } else {
    return wp_kses_post($title);
  }
}
function blankslate_schema_type() {
  $schema = 'https://schema.org/';
  if (is_single()) {
    $type = "Article";
  } elseif (is_author()) {
    $type = 'ProfilePage';
  } elseif (is_search()) {
    $type = 'SearchResultsPage';
  } else {
    $type = 'WebPage';
  }
  echo 'itemscope itemtype="' . esc_url($schema) . esc_attr($type) . '"';
}
add_filter('nav_menu_link_attributes', 'blankslate_schema_url', 10);
function blankslate_schema_url($atts) {
  $atts['itemprop'] = 'url';
  return $atts;
}
if (!function_exists('blankslate_wp_body_open')) {
  function blankslate_wp_body_open() {
    do_action('wp_body_open');
  }
}
add_action('wp_body_open', 'blankslate_skip_link', 5);
function blankslate_skip_link() {
  echo '<a href="#content" class="skip-link screen-reader-text">' . esc_html__('Skip to the content', 'blankslate') . '</a>';
}
add_filter('the_content_more_link', 'blankslate_read_more_link');
function blankslate_read_more_link() {
  if (!is_admin()) {
    return ' <a href="' . esc_url(get_permalink()) . '" class="more-link">' . sprintf(__('...%s', 'blankslate'), '<span class="screen-reader-text">  ' . esc_html(get_the_title()) . '</span>') . '</a>';
  }
}
add_filter('excerpt_more', 'blankslate_excerpt_read_more_link');
function blankslate_excerpt_read_more_link($more) {
  if (!is_admin()) {
    global $post;
    return ' <a href="' . esc_url(get_permalink($post->ID)) . '" class="more-link">' . sprintf(__('...%s', 'blankslate'), '<span class="screen-reader-text">  ' . esc_html(get_the_title()) . '</span>') . '</a>';
  }
}
add_filter('big_image_size_threshold', '__return_false');
add_filter('intermediate_image_sizes', 'remove_default_img_sizes', 10, 1);
function remove_default_img_sizes($sizes) {
  $targets = ['medium_large', 'large', '1536x1536', '2048x2048', 'woocommerce_thumbnail', 'woocommerce_single', 'woocommerce_gallery_thumbnail', 'shop_catalog', 'shop_single', 'shop_thumbnail'];
  foreach ($sizes as $size_index => $size) {
    if (in_array($size, $targets)) {
      unset($sizes[$size_index]);
    }
  }
  return $sizes;
}
// == Start Script
add_action('wp_enqueue_scripts', 'ecademy_enqueue_style');
function ecademy_enqueue_style() {
  wp_enqueue_script('jquery');
  wp_enqueue_style("custom_css", get_stylesheet_directory_uri() . "/css/custom.css", array(), '1.1.0', 'all');
  $script_data_array = array(
    'ajaxurl'  => admin_url('admin-ajax.php'),
    'security' => wp_create_nonce('file_upload'),
  );
  wp_enqueue_script('custom_js', get_stylesheet_directory_uri() . '/js/custom.js', array('jquery'), '123', 'all', true);
  wp_localize_script('custom_js', 'app', $script_data_array);
}
function wpdocs_selectively_enqueue_admin_script($hook) {
  wp_enqueue_script('custom_js', get_stylesheet_directory_uri() . '/js/admin.js', array('jquery'), '123', 'all', true);
  wp_enqueue_style("custom_css", get_stylesheet_directory_uri() . "/css/admin.css", array(), '1.1.0', 'all');
}
add_action('admin_enqueue_scripts', 'wpdocs_selectively_enqueue_admin_script');
// == End Script
// Start App
require get_template_directory() . '/inc/define.php';
require get_template_directory() . '/framework/init.php';
require get_template_directory() . '/inc/functions/function-setup.php';
require get_template_directory() . '/inc/functions/function-global.php';
require_once get_template_directory().'/framework/ajax/business.php';
require_once get_template_directory().'/framework/ajax/deal.php';
require_once get_template_directory().'/framework/ajax/event.php';
// End App
```

C:\xampp\htdocs\wordpress8\wp-content\themes\addframwork\js\account-business.js

```
jQuery(document).ready(function($) {
  function account_activity_business_load(type) {
    $(".status").removeClass("d-none");
    $.ajax({
      url: app.ajaxUrl,
      type: "post",
      dataType: "text",
      data: {
        action: 'account_activity_load_list_' + type,
        token: $("#nonce_token").val()
      },
      success: function(output) {
        $(".tab-" + type + " .account-list-item").append(output);
        $(".status").addClass("d-none");
      }
    });
  }

  function account_get_tab_number(type = "activity") {
    $.ajax({
      url: app.ajaxUrl,
      type: "post",
      dataType: "text",
      data: {
        action: 'account_activity_get_tab_number',
        type: type,
        token: $("#nonce_token").val()
      },
      success: function(output) {
        if (output != "error") {
          const obj = JSON.parse(output, function(key, value) {
            $(".account-load-btn[data-id='" + key + "'] span").text(value);
          });
        }
      }
    });
  }
  // ==
  account_activity_business_load("deal");
  account_get_tab_number();
  // ==
  $('body').on('click', '#change-acc', function(e) {
    const $this = $(this);
    const btnScan = $('#scan-voucher');
    const type = $this.attr('data-type');
    const userId = $this.attr('data-id');
    const tab_active = $(".tab-active").data("tab-id");
    $.ajax({
      url: app.ajaxUrl,
      type: "post",
      dataType: "text",
      data: {
        action: 'change_business_activity',
        token: $('#nonce_token').val(),
        type: type,
        id: userId,
      },
      beforeSend: function() {
        $(".account-list-item:not('.news') .col-6").not(".col-addnew").remove();
        $this.find('svg').addClass('spin');
      },
      success: function(response) {
        $(".menu-tab-account .li").not(".active").find("a").addClass("load");
        $this.find('svg').removeClass('spin');
        btnScan.toggle();
        if (type == 'activity') {
          // xử lý data business
          account_get_tab_number("business");
          $this.attr('data-type', 'business').find('span').text(app.business);
          $(".account-list-item .col-addnew").removeClass("d-none");
          if (tab_active != "news") {
            account_activity_business_load(tab_active);
          }
          $(".menu-tab-account ul li:last-child,.tab-news").addClass("d-none");
          $(".col-activity-event").remove();
          return;
        }
        $this.attr('data-type', 'activity').find('span').text(app.activity);
        $(".account-list-item .col-addnew").addClass("d-none");
        account_get_tab_number();
        if (tab_active != "news") {
          account_activity_business_load(tab_active);
        }
        $(".menu-tab-account ul li:last-child,.tab-news").removeClass("d-none");
      },
      error: function() {
        $this.find('svg').removeClass('spin');
        alert('Error');
      }
    })
    return false;
  });
  // ==
  var exclude_img = [];
  var input_btn = 0;
  var xp = -1;
  $(document).on("click", ".add-image-btn", function(e) {
    let select = $(this).closest("form");
    input_btn++;
    select.find(".list-input-file").append("<input type='file' name='upload_files[]' id='filenumber" + input_btn + "' class='img_file upload_files' accept='.gif,.jpg,.jpeg,.png,' multiple/>");
    $("#filenumber" + input_btn).click();
  });
  $(document).on("change", ".upload_files", function(e) {
    let select = $(this).closest("form")
    files = e.target.files;
    filesLength = files.length;
    for (var i = 0; i < filesLength; i++) {
      var f = files[i];
      var res_ext = files[i].name.split(".");
      var img_or_video = res_ext[res_ext.length - 1];
      var fileReader = new FileReader();
      fileReader.name = f.name;
      fileReader.onload = function(e) {
        xp++;
        var file = e.target;
        select.find(".images-box").append("<div class='box preview-image'><div class='images-preview' style='background-image: url(" + e.target.result + ")'><button type='button' data-id='" + xp + "' class='remove-img btn-close' title='Remove'></button></div></div>");
      };
      fileReader.readAsDataURL(f);
    }
  });
  $(document).on("click", ".images-box .remove-img", function() {
    $(this).closest(".box").remove();
    exclude_img.push($(this).attr("data-id"));
  });
  // ==
  var is_busy = false;
  var add_deal_form = "#add-deal-form ";
  $(add_deal_form).submit(function() {
    if (is_busy == true) return;
    is_busy = true;
    var formData = new FormData(document.getElementById("add-deal-form"));
    formData.append('action', 'add_deal');
    formData.append('exclude_img', exclude_img);
    $.ajax({
      url: app.ajaxUrl,
      type: "post",
      contentType: false,
      processData: false,
      data: formData,
      success: function(output) {
        is_busy = false;
        if (output == "success") {
          $("#alert-success").modal("show");
          $("#add_deal_form").remove();
        }
      }
    });
    return false;
  });
  $(document).on("click", ".deal.add-favorite", function() {
    if (is_busy == true) return;
    is_busy = true;
    let select = $(this);
    $.ajax({
      url: app.ajaxUrl,
      type: "post",
      dataType: "text",
      data: {
        action: 'deal_favorite_process',
        id: $(this).data("id"),
        token: $(this).data("token"),
      },
      success: function(output) {
        $(".status").addClass("d-none");
        is_busy = false;
        if (output == "success") {
          select.toggleClass("added");
        }
      }
    })
  });
  $(document).on("click", ".event.add-favorite", function() {
    if (is_busy == true) return;
    is_busy = true;
    let select = $(this);
    let page = $(this).data("page");
    let id = $(this).data("id");
    $.ajax({
      url: app.ajaxUrl,
      type: "post",
      dataType: "text",
      data: {
        action: 'event_favorite_process',
        id: id,
        type: $(this).data("type"),
        page: $(this).data("page"),
        token: $(this).data("token"),
      },
      success: function(output) {
        is_busy = false;
        let result = $.parseJSON(output);
        if (result[0] == "success") {
          if (page == "single") {
            $(".event.add-favorite").not(select).removeClass("added");
            $(".n-o-going").text(result[1]);
            $(".n-o-maybe").text(result[2]);
          }
          $(select).toggleClass("added");
        }
      }
    })
  });
  $(".account-load-btn").click(function() {
    if ($(this).hasClass("load")) {
      let data_type = $(this).data("id");
      let account_type = $("#change-acc").data("type");
      account_activity_business_load(data_type);
      $(this).removeClass("load");
    }
  })
});
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://learnphp.gitbook.io/learnphp/wordpress-advand/framework-xay-dung-page-account-phan-7-ok.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
