File "class-location-zones-admin.php"

Full Path: /home/romayxjt/public_html/wp-content/plugins/orderable/inc/modules/location/zones/class-location-zones-admin.php
File size: 10.13 KB
MIME-type: text/x-php
Charset: utf-8

<?php
/**
 * Module: Location (Zones).
 *
 * @since   1.18.0
 * @package Orderable/Classes
 */

defined( 'ABSPATH' ) || exit;

/**
 * Orderable_Location_Zones_Admin class.
 */
class Orderable_Location_Zones_Admin {
	/**
	 * Init.
	 */
	public static function run() {
		add_action( 'orderable_before_time_slots_table_end', array( __CLASS__, 'output_delivery_zones_row' ), 10, 4 );
		add_action( 'admin_footer', array( __CLASS__, 'output_delivery_zones_js_templates' ) );
		add_action( 'admin_footer', array( __CLASS__, 'output_delivery_zones_modal_html' ) );
		add_action( 'orderable_before_save_service_hours', array( __CLASS__, 'delete_lookup_entry' ), 10, 2 );
		add_action( 'orderable_location_service_hour_inserted', array( __CLASS__, 'save_delivery_zone' ), 10, 3 );
		add_action( 'orderable_location_service_hour_updated', array( __CLASS__, 'save_delivery_zone' ), 10, 3 );
	}

	/**
	 * Output the delivery zones row in a given time slots table.
	 *
	 * @param string $type            Either `delivery` or `pickup`.
	 * @param int    $time_slot_id    Time slot ID.
	 * @param int    $time_slot_index Time slot index.
	 * @param array  $data            Location data.
	 * @return void
	 */
	public static function output_delivery_zones_row( $type, $time_slot_id, $time_slot_index, $data ) {
		if ( 'delivery' !== $type ) {
			return;
		}
		?>

		<tr class="orderable-table-delivery-zones-row">
			<th class="orderable-table__column orderable-table__column--medium">
				<?php esc_html_e( 'Delivery Zones', 'orderable' ); ?>
			</th>
			<td class="orderable-table-delivery-zones-row__list">
				<?php
				$slot_has_zones = false;

				if ( $data['delivery_zones'] ) {
					$zone_index = 1;
					foreach ( $data['delivery_zones'] as $zone ) {
						include Orderable_Helpers::get_template_path( 'zones/time-slot-delivery-zone.php', 'location' );
						$zone_index++;
					}
				}

				include Orderable_Helpers::get_template_path( 'zones/time-slot-no-delivery-zones.php', 'location' );
				include Orderable_Helpers::get_template_path( 'zones/time-slot-delivery-zone-actions.php', 'location' );
				?>
			</td>
		</tr>

		<?php
	}

	/**
	 * Output the JS template for delivery zone rows.
	 *
	 * @return void
	 */
	public static function output_delivery_zones_js_templates() {
		$tags = array(
			'a' => array(
				'href' => array(),
			),
		);

		$delivery_zones_page_url = sprintf(
			/* translators: opening anchor tag, closing anchor tag */
			__( 'All of the delivery zones that you have added to your store locations in Orderable are listed below. To manage them, click %1$shere%2$s.', 'orderable' ),
			'<a href="' . esc_url( admin_url( 'admin.php?page=orderable-delivery-zones' ) ) . '">',
			'</a>'
		);
		?>
		<!-- Delivery Zones for Locations UI -->
		<script type="text/html" id="tmpl-delivery-zones-row">
			<div
			class="orderable-table-delivery-zones-row__item"
			data-zone-count="{{{data.delivery_zone_id}}}"
			data-slot-id="{{{data.time_slot_id}}}"
			data-zone-id="{{{data.zone_id}}}"
			data-zone-name="{{{data.zone_name}}}"
			data-zone-postcodes="{{{data.zone_postcodes}}}"
			data-zone-fee="{{{data.zone_fee}}}"
			>

				<div class="orderable-table-delivery-zones-row__item-info">

					<h4 class="orderable-table-delivery-zones-row__item-title">
						{{{data.text_zone_title}}} {{{data.delivery_zone_id}}}
					</h4>

					<p class="orderable-table-delivery-zones-row__item-name">
						<span class="dashicons dashicons-location"></span>
						{{{data.zone_name}}}
					</p>

				</div>

				<div class="orderable-table-delivery-zones-row__item-links">

					<button type="button" class="orderable-table-delivery-zones-row__item-link js-open-add-delivery-zone-modal" data-action="edit">
						<span class="dashicons dashicons-edit"></span>
						{{{data.text_edit_zone}}}
					</button>

					<button type="button" class="orderable-table-delivery-zones-row__item-link js-remove-delivery-zone">
						<span class="dashicons dashicons-trash"></span>
						{{{data.text_remove_zone}}}
					</button>

				</div>

				<input type="hidden" name="service_hours[delivery][{{{data.time_slot_index}}}][zones][]" value="{{data.input_value}}"/>

			</div>
		</script>

		<!-- Existing Zones List Item -->
		<script type="text/html" id="tmpl-existing-zones-list-item">
			<li
			class="orderable-delivery-zones-modal__zones-list-item js-delivery-zones-list-item">
				<label for="zone_{{{data.zone_id}}}">
					<input
					autocomplete="off"
					id="zone_{{{data.zone_id}}}"
					class="orderable-delivery-zones-modal__field-checkbox"
					type="checkbox"
					name="zone_{{{data.zone_id}}}"
					value="{{{data.zone_id}}}"
					data-zone-postcodes="{{{data.zone_postcodes}}}"
					data-zone-name="{{{data.zone_name}}}"
					data-zone-fee="{{{data.zone_fee}}}"
					/>
					<span>{{{data.zone_name}}}</span>
				</label>
			</li>
		</script>

		<!-- Delivery Zones Table for WC Shipping Settings -->
		<script type="text/html" id="tmpl-delivery-zones-shipping-table">

			<div id="js-orderable-delivery-zones-table-container" class="orderable-delivery-zones-table-container">

				<h2 class="orderable-delivery-zones-heading">
					<span class="orderable-swoosh"></span>
					<?php echo esc_html__( 'Orderable Delivery Zones', 'orderable' ); ?>
				</h2>

				<p><?php echo wp_kses( $delivery_zones_page_url, $tags ); ?></p>

				<table class="orderable-delivery-zones widefat">
					<thead>
						<tr>
							<th class="orderable-delivery-zone-sort"></th>
							<th class="orderable-delivery-zone-name"><?php echo esc_html__( 'Zone name', 'orderable' ); ?></th>
							<th class="orderable-delivery-zone-region"><?php echo esc_html__( 'Regions(s)', 'orderable' ); ?></th>
							<th class="orderable-delivery-zone-locations"><?php echo esc_html__( 'Location(s)', 'orderable' ); ?></th>
							<th class="orderable-delivery-zone-methods"><?php echo esc_html__( 'Shipping method(s)', 'orderable' ); ?></th>
						</tr>
					</thead>
					<tbody id="js-orderable-delivery-zone-rows" class="orderable-delivery-zone-rows ui-sortable"></tbody>
				</table>

			</div>

		</script>

		<script type="text/html" id="tmpl-delivery-zones-list-table-row">

			<tr id="{{{data.zone_id}}}">
				<td class="zone_id column-zone_id hidden" data-colname="<?php echo esc_attr__( 'ID', 'orderable' ); ?>">{{{data.zone_id}}}</td>
				<td class="zone_name column-zone_name has-row-actions column-primary" data-colname="<?php echo esc_attr__( 'Area name', 'orderable' ); ?>">
					<span class="value">{{{data.zone_name}}}</span>
					<div class="row-actions">
						<span class="edit"><a role="button" href="#" data-zone-id="{{{data.zone_id}}}" data-zone-name="{{{data.zone_name}}}" data-zone-postcodes="{{{data.zone_postcodes}}}" data-zone-fee="{{{data.zone_fee}}}" data-action="edit"><?php esc_html_e( 'Edit', 'orderable' ); ?></a> | </span>
						<span class="delete"><a class="submitdelete" href="#" data-zone-id="{{{data.zone_id}}}"><?php esc_html_e( 'Delete', 'orderable' ); ?></a></span>
					</div>
					<button type="button" class="toggle-row">
						<span class="screen-reader-text"><?php esc_html_e( 'Show more details', 'orderable' ); ?></span>
					</button>
				</td>
				<td class="zone_postcodes column-zone_postcodes" data-colname="<?php echo esc_attr__( 'Postcode(s) / Zip Code(s)', 'orderable' ); ?>">{{{data.zone_postcodes}}}</td>
				<td class="zone_locations column-zone_locations" data-colname="<?php echo esc_attr__( 'Location(s)', 'orderable' ); ?>"><?php esc_html_e( 'N/A', 'orderable' ); ?></td>
				<td class="zone_fee column-zone_fee" data-colname="<?php echo esc_attr__( 'Fee', 'orderable' ); ?>">
					<span class="woocommerce-Price-amount amount"><bdi><span class="woocommerce-Price-currencySymbol">£</span>{{{data.zone_fee}}}</bdi></span>
				</td>
			</tr>

		</script>
		<?php
	}

	/**
	 * Output the markup for the modal window.
	 *
	 * @return void
	 */
	public static function output_delivery_zones_modal_html() {
		?>

		<div style="display: none;" id="orderable-delivery-zones-modal-wrapper" class="orderable-delivery-zones-modal-wrapper">
			<div class="orderable-delivery-zones-modal-background"></div>
			<!-- Add new -->
			<?php include Orderable_Helpers::get_template_path( 'zones/delivery-zones-modal-add-update.php', 'location' ); ?>

			<!-- Add from existing -->
			<?php include Orderable_Helpers::get_template_path( 'zones/delivery-zones-modal-add-existing.php', 'location' ); ?>
		</div>

		<?php
	}

	/**
	 * Delete lookup entry.
	 *
	 * @param int    $location_id  The location ID.
	 * @param string $service_type The service type. Either `delivery` or `pickup`.
	 * @return void
	 */
	public static function delete_lookup_entry( $location_id, $service_type ) {
		if ( empty( $location_id ) || 'delivery' !== $service_type ) {
			return;
		}

		Orderable_Location_Zones_CRUD_Handler::delete_lookup_entry( $location_id, false, false );
	}

	/**
	 * Save the delivery zone.
	 *
	 * @param array  $service_hour The service hour data.
	 * @param string $service_type The service type. Either `delivery` or `pickup`.
	 * @param int    $location_id  The location ID.
	 * @return void
	 */
	public static function save_delivery_zone( $service_hour, $service_type, $location_id ) {
		if ( empty( $service_hour['zones'] ) || 'delivery' !== $service_type || empty( $location_id ) ) {
			return;
		}

		$zones = $service_hour['zones'];

		foreach ( $zones as $zone ) {
			$zone_data = json_decode( $zone, true );

			if ( ! $zone_data ) {
				continue;
			}

			$time_slot_id = ( ! empty( $zone_data['time_slot_id'] ) ) ? absint( $zone_data['time_slot_id'] ) : false;

			if ( ! $time_slot_id ) {
				continue;
			}

			$zone_data['location_id'] = $location_id;

			if ( strlen( $zone_data['zone_id'] ) > 10 ) {
				// If the zone ID is a timestamp, we are creating a new zone.
				Orderable_Location_Zones_CRUD_Handler::add_new( $zone_data );
			} else {
				// Otherwise, we're updating and/or adding an existing zone.
				// @TODO - This could be optimised to determine if the zone
				// is already associated with the time slot before calling the
				// edit method. Not a huge priority right now.
				Orderable_Location_Zones_CRUD_Handler::edit( $zone_data );
				Orderable_Location_Zones_CRUD_Handler::create_lookup_entry( $zone_data['location_id'], $zone_data['zone_id'], $zone_data['time_slot_id'] );
			}
		}
	}
}