Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
93 changes: 93 additions & 0 deletions assets/wp/js/account-address.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
(function ($) {
"use strict";

function districtFields() {
return $(
"#billing_kiriof_destination_area, #shipping_kiriof_destination_area",
);
}

function districtNameField($field) {
var addressType = String($field.attr("id") || "").indexOf("shipping_") === 0
? "shipping"
: "billing";
return $("#" + addressType + "_kiriof_destination_area_name");
}

function clearDistrict($field) {
$field.val("").trigger("change.select2");
districtNameField($field).val("");
}

$(function () {
var select = $.fn.selectWoo || $.fn.select2;
var $fields = districtFields();

if (!$fields.length || !select || typeof kiriofAjax === "undefined") {
return;
}

$fields.each(function () {
var $field = $(this);
select.call($field, {
minimumInputLength: 3,
placeholder:
typeof kiriofAccountAddress !== "undefined"
? kiriofAccountAddress.selectOption
: "Select Option",
allowClear: true,
ajax: {
url: kiriofAjax.ajaxurl,
dataType: "json",
type: "POST",
delay: 250,
data: function (params) {
var term = params && params.term ? params.term : "";
return {
action: "kiriminaja_subdistrict_search",
nonce: kiriofAjax.nonce,
term: term,
data: { term: term, search: term },
};
},
processResults: function (response) {
var rows = response && response.success !== false && response.data
? response.data
: [];
return {
results: $.map(rows, function (row) {
return { id: row.id, text: row.text };
}),
};
},
cache: true,
},
});

$field
.on("select2:select.kiriofAccountDistrict", function (event) {
var selected = event.params && event.params.data ? event.params.data : {};
districtNameField($field).val(selected.text || "");
})
.on("select2:clear.kiriofAccountDistrict", function () {
districtNameField($field).val("");
});
});

$("#billing_postcode, #shipping_postcode").each(function () {
$(this).data("kiriofInitialPostcode", String($(this).val() || ""));
}).on(
"input.kiriofAccountDistrict change.kiriofAccountDistrict",
function () {
var currentPostcode = String($(this).val() || "");
if (currentPostcode === String($(this).data("kiriofInitialPostcode") || "")) {
return;
}
var prefix = String(this.id || "").indexOf("shipping_") === 0
? "shipping"
: "billing";
clearDistrict($("#" + prefix + "_kiriof_destination_area"));
},
);
});
})(jQuery);
16 changes: 16 additions & 0 deletions inc/Base/Enqueue.php
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,22 @@ function enqueueWp(){
KIRIOF_VERSION,
array( 'in_footer' => true )
);
if ( function_exists( 'is_account_page' ) && is_account_page() && function_exists( 'is_wc_endpoint_url' ) && is_wc_endpoint_url( 'edit-address' ) ) {
wp_enqueue_script(
'kiriof-account-address',
KIRIOF_URL . 'assets/wp/js/account-address.js',
array( 'kiriof-script', 'jquery', 'select2' ),
KIRIOF_VERSION,
array( 'in_footer' => true )
);
wp_localize_script(
'kiriof-account-address',
'kiriofAccountAddress',
array(
'selectOption' => __( 'Select Option', 'kiriminaja-official' ),
)
);
}

// Localize script to pass ajax URL and nonce
wp_localize_script(
Expand Down
120 changes: 120 additions & 0 deletions inc/Controllers/AccountAddressController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
<?php
namespace KiriminAjaOfficial\Controllers;

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

use KiriminAjaOfficial\Services\CustomerDistrictService;

class AccountAddressController {
public function register(): void {
add_filter( 'woocommerce_address_to_edit', array( $this, 'addDistrictFields' ), 20, 2 );
add_action( 'woocommerce_after_save_address_validation', array( $this, 'validateDistrict' ), 10, 4 );
add_action( 'woocommerce_customer_save_address', array( $this, 'saveDistrict' ), 10, 2 );
}

public function addDistrictFields( array $fields, string $address_type ): array {
if ( ! $this->isEditAddressRequest( $address_type ) ) {
return $fields;
}

$district = ( new CustomerDistrictService() )->get( get_current_user_id(), $address_type );
$field_key = $address_type . '_kiriof_destination_area';
$name_key = $address_type . '_kiriof_destination_area_name';
$options = array( '' => __( 'Select Option', 'kiriminaja-official' ) );
if ( '' !== $district['id'] && '' !== $district['name'] ) {
$options[ $district['id'] ] = $district['name'];
}

$field = array(
'label' => __( 'District', 'kiriminaja-official' ),
'required' => true,
'class' => array( 'form-row-wide' ),
'type' => 'select',
'options' => $options,
'value' => $district['id'],
'priority' => 61,
);
$name_field = array(
'type' => 'hidden',
'value' => $district['name'],
'priority' => 62,
);

$fields = $this->insertAfterPostcode( $fields, $field_key, $field );
$fields = $this->insertAfterKey( $fields, $field_key, $name_key, $name_field );

return $fields;
}

public function validateDistrict( int $user_id, string $address_type, array $address, $customer ): void {
unset( $user_id, $address, $customer );
if ( ! in_array( $address_type, array( 'billing', 'shipping' ), true ) ) {
return;
}

$district_id = $this->postedDistrictId( $address_type );
$district_name = $this->postedDistrictName( $address_type );
if ( $district_id < 1 || '' === $district_name ) {
wc_add_notice( __( 'Please select a District.', 'kiriminaja-official' ), 'error' );
}
}

public function saveDistrict( int $user_id, string $address_type ): void {
if ( ! in_array( $address_type, array( 'billing', 'shipping' ), true ) ) {
return;
}

( new CustomerDistrictService() )->save(
$user_id,
$address_type,
$this->postedDistrictId( $address_type ),
$this->postedDistrictName( $address_type )
);
}

private function isEditAddressRequest( string $address_type = '' ): bool {
if ( ! function_exists( 'is_account_page' ) || ! is_account_page() || ! function_exists( 'is_wc_endpoint_url' ) || ! is_wc_endpoint_url( 'edit-address' ) ) {
return false;
}
if ( '' === $address_type ) {
return true;
}

$requested_type = sanitize_key( (string) get_query_var( 'edit-address' ) );
return '' === $requested_type || $requested_type === $address_type;
}

private function postedDistrictId( string $address_type ): int {
$key = $address_type . '_kiriof_destination_area';
// phpcs:ignore WordPress.Security.NonceVerification.Missing -- WooCommerce verifies the account address nonce before this hook.
return isset( $_POST[ $key ] ) ? absint( wp_unslash( $_POST[ $key ] ) ) : 0;
}

private function postedDistrictName( string $address_type ): string {
$key = $address_type . '_kiriof_destination_area_name';
// phpcs:ignore WordPress.Security.NonceVerification.Missing -- WooCommerce verifies the account address nonce before this hook.
return isset( $_POST[ $key ] ) ? sanitize_text_field( wp_unslash( $_POST[ $key ] ) ) : '';
}

private function insertAfterPostcode( array $fields, string $field_key, array $field ): array {
$postcode_key = 0 === strpos( $field_key, 'shipping_' ) ? 'shipping_postcode' : 'billing_postcode';
return $this->insertAfterKey( $fields, $postcode_key, $field_key, $field );
}

private function insertAfterKey( array $fields, string $after_key, string $field_key, array $field ): array {
$result = array();
foreach ( $fields as $key => $value ) {
$result[ $key ] = $value;
if ( $after_key === $key ) {
$result[ $field_key ] = $field;
}
}
if ( ! isset( $result[ $field_key ] ) ) {
$result[ $field_key ] = $field;
}
return $result;
}
}
58 changes: 44 additions & 14 deletions inc/Controllers/CheckoutController.php
Original file line number Diff line number Diff line change
Expand Up @@ -505,6 +505,10 @@ function kiriof_add_checkout_nonce_field(){
}
function add_custom_select_options_field_and_script($checkout)
{
if ( ! is_cart() && ! is_checkout() ) {
return;
}

if ( ! $this->kiriof_cart_needs_shipping() ) {
$this->kiriof_clear_logistics_session();
$this->kiriof_render_virtual_cart_district_cleanup();
Expand Down Expand Up @@ -1150,6 +1154,26 @@ function afterCheckoutBeforeCreated($order,$data ){
//save meta subdistrict shipping woocommerce
if( isset($_POST['kiriof_shipping_destination_area']) && !empty($_POST['kiriof_shipping_destination_area']) ) $order->update_meta_data( '_shipping_kiriof_destination_area', sanitize_text_field(wp_unslash($_POST['kiriof_shipping_destination_area'])) );
if( isset($_POST['kiriof_shipping_destination_area_name']) && !empty($_POST['kiriof_shipping_destination_area_name']) ) $order->update_meta_data( '_shipping_kiriof_destination_name', sanitize_text_field(wp_unslash($_POST['kiriof_shipping_destination_area_name'])) );

if ( is_user_logged_in() ) {
$district_service = new \KiriminAjaOfficial\Services\CustomerDistrictService();
if ( isset( $_POST['kiriof_destination_area'] ) ) {
$district_service->save(
get_current_user_id(),
'billing',
wp_unslash( $_POST['kiriof_destination_area'] ),
isset( $_POST['kiriof_destination_area_name'] ) ? wp_unslash( $_POST['kiriof_destination_area_name'] ) : ''
);
}
if ( ! empty( $_POST['ship_to_different_address'] ) ) {
$district_service->save(
get_current_user_id(),
'shipping',
isset( $_POST['kiriof_shipping_destination_area'] ) ? wp_unslash( $_POST['kiriof_shipping_destination_area'] ) : '',
isset( $_POST['kiriof_shipping_destination_area_name'] ) ? wp_unslash( $_POST['kiriof_shipping_destination_area_name'] ) : ''
);
}
}

//save meta Insurance shipping woocommerce
if( isset($data['kiriof_shipping_insurance']) && !empty($data['kiriof_shipping_insurance']) ) $order->update_meta_data( '_shipping_kiriof_insurance', sanitize_text_field( ( wp_unslash($data['kiriof_shipping_insurance']) == true ) ? 'yes' : '' ) );
Expand Down Expand Up @@ -1577,17 +1601,21 @@ private function kiriof_remove_fields_checkout($fields,$fields_selected){
}
private function kiriof_add_field_subdistrict( $fields ){
$field_key = $this->field_destination_key;
$district_service = new \KiriminAjaOfficial\Services\CustomerDistrictService();
$customer = isset( WC()->customer ) && WC()->customer instanceof \WC_Customer ? WC()->customer : get_current_user_id();
$saved_billing = $district_service->get( $customer, 'billing' );
$saved_shipping = $district_service->get( $customer, 'shipping' );
//billing session
$destination_id = WC()->session->get('destination_id') ?? '';
$destination_name = WC()->session->get('destination_name') ?? '';
$destination_id = WC()->session->get('destination_id') ?: $saved_billing['id'];
$destination_name = WC()->session->get('destination_name') ?: $saved_billing['name'];
$options = array( '' => esc_html__( 'Select Option', 'kiriminaja-official' ) );
if ( ! empty( $destination_id ) ) {
$options[ $destination_id ] = $destination_name;
}

//shipping session
$shipping_dest_id = WC()->session->get('shipping_destination_id') ?? '';
$shipping_dest_name = WC()->session->get('shipping_destination_name') ?? '';
$shipping_dest_id = WC()->session->get('shipping_destination_id') ?: $saved_shipping['id'];
$shipping_dest_name = WC()->session->get('shipping_destination_name') ?: $saved_shipping['name'];
$shipping_options = array( '' => esc_html__( 'Select Option', 'kiriminaja-official' ) );
if ( ! empty( $shipping_dest_id ) ) {
$shipping_options[ $shipping_dest_id ] = $shipping_dest_name;
Expand Down Expand Up @@ -2018,16 +2046,18 @@ public function kiriof_store_api_update_checkout( $data ) {
// meta, NOT from WC()->session, so session-only storage leaves the
// field empty in the cart response and can cause empty shipping rates.
if ( isset( WC()->customer ) && is_object( WC()->customer ) ) {
if ( $destination_id > 0 ) {
WC()->customer->update_meta_data( 'shipping_kiriminaja-official/kiriof_destination_area', (string) $destination_id );
WC()->customer->update_meta_data( 'billing_kiriminaja-official/kiriof_destination_area', (string) $destination_id );
} else {
WC()->customer->update_meta_data( 'shipping_kiriminaja-official/kiriof_destination_area', '' );
WC()->customer->update_meta_data( 'billing_kiriminaja-official/kiriof_destination_area', '' );
}
WC()->customer->update_meta_data( 'shipping_kiriminaja-official/kiriof_destination_area_name', $destination_name );
WC()->customer->update_meta_data( 'billing_kiriminaja-official/kiriof_destination_area_name', $destination_name );
WC()->customer->save_meta_data();
( new \KiriminAjaOfficial\Services\CustomerDistrictService() )->save(
WC()->customer,
'shipping',
$destination_id,
$destination_name
);
( new \KiriminAjaOfficial\Services\CustomerDistrictService() )->save(
WC()->customer,
'billing',
$destination_id,
$destination_name
);
}

WC()->session->set( 'kiriof_insurance', $insurance );
Expand Down
3 changes: 2 additions & 1 deletion inc/Init.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ public static function get_services(){
Controllers\TransactionProcessController::class,
Controllers\ShippingDiscountCouponController::class,
Controllers\CheckoutController::class,
Controllers\AccountAddressController::class,
Controllers\TrackingFrontPageController::class,
Controllers\EditOrderController::class,
Controllers\CodAdjustmentController::class,
Expand All @@ -51,4 +52,4 @@ public static function register_services(){
private static function instantiate($class ){
return new $class();
}
}
}
Loading
Loading