gruene-seele/dev/dhl-for-woocommerce/includes/class-pr-dhl-blocks-integration.php
Kevin Adametz 0f641ef33a Housekeeping: offene Dev-Dateien eingecheckt + Sidebar „Bestellungen"→„Versand"
- Sidebar-Menü „Bestellungen" in „Versand" umbenannt (layout-sidenav), sonst nur
  Blade-Formatierung.
- Entwicklungspläne in ISO-Datumsformat umbenannt (entwicklungsplan-aktualisiert-*).
- dev/dhl-for-woocommerce/ (DHL-Plugin) + dev/partnercenter-api.zip + PastedGraphic
  hinzugefügt.
- .claude/ bewusst NICHT eingecheckt (lokale Claude-Code-Konfiguration).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-28 12:04:41 +00:00

433 lines
13 KiB
PHP

<?php
use Automattic\WooCommerce\Blocks\Integrations\IntegrationInterface;
if (! defined('ABSPATH')) {
exit;
}
/**
* Class for integrating with WooCommerce Blocks.
*
* @category Shipping
*/
class PR_DHL_Blocks_Integration implements IntegrationInterface
{
/**
* The name of the integration.
*
* @return string
*/
public function get_name()
{
return 'pr-dhl';
}
/**
* When called, invokes any initialization/setup for the integration.
*/
public function initialize()
{
$this->register_scripts_and_styles();
$this->register_ajax_actions();
$this->localize_scripts();
}
/**
* Registers scripts and styles for both editor and frontend.
*/
private function register_scripts_and_styles()
{
// Register main integration script and style
$this->register_main_integration();
// Register block editor scripts
$this->register_block_script(
'pr-dhl-preferred-services-editor',
'/build/pr-dhl-preferred-services.js',
'/build/pr-dhl-preferred-services.asset.php'
);
// Register frontend scripts for blocks
$this->register_frontend_script(
'pr-dhl-preferred-services-frontend',
'/build/pr-dhl-preferred-services-frontend.js',
'/build/pr-dhl-preferred-services-frontend.asset.php'
);
// Register block editor scripts
$this->register_block_script(
'pr-dhl-closest-drop-point-editor',
'/build/pr-dhl-closest-drop-point.js',
'/build/pr-dhl-closest-drop-point.asset.php'
);
// Register frontend scripts for blocks
$this->register_frontend_script(
'pr-dhl-closest-drop-point-frontend',
'/build/pr-dhl-closest-drop-point-frontend.js',
'/build/pr-dhl-closest-drop-point-frontend.asset.php'
);
// Register parcel finder editor scripts
$this->register_block_script(
'pr-dhl-parcel-finder-editor',
'/build/pr-dhl-parcel-finder.js',
'/build/pr-dhl-parcel-finder.asset.php'
);
// Register frontend scripts for parcel finder
$this->register_frontend_script(
'pr-dhl-parcel-finder-frontend',
'/build/pr-dhl-parcel-finder-frontend.js',
'/build/pr-dhl-parcel-finder-frontend.asset.php'
);
// Register block styles
$this->register_styles();
}
/**
* Registers the main JS and CSS files required for the integration.
*/
private function register_main_integration()
{
$script_path = '/build/index.js';
$style_path = '/build/style-index.css';
$script_url = PR_DHL_PLUGIN_DIR_URL.$script_path;
$style_url = PR_DHL_PLUGIN_DIR_URL.$style_path;
$script_asset_path = PR_DHL_PLUGIN_DIR_PATH.'/build/index.asset.php';
$script_asset = file_exists($script_asset_path)
? require $script_asset_path
: [
'dependencies' => [],
'version' => $this->get_file_version($script_path),
];
wp_enqueue_style(
'pr-dhl-preferred-services-integration',
$style_url,
[],
$this->get_file_version($style_path)
);
wp_register_script(
'pr-dhl-preferred-services-integration',
$script_url,
$script_asset['dependencies'],
$script_asset['version'],
true
);
wp_set_script_translations(
'pr-dhl-preferred-services-integration',
'dhl-for-woocommerce',
PR_DHL_PLUGIN_DIR_PATH.'/lang'
);
}
/**
* Registers block styles for the block editor.
*/
private function register_styles()
{
$block_style_path = '/build/style-index.css';
$block_style_url = PR_DHL_PLUGIN_DIR_URL.$block_style_path;
wp_enqueue_style(
'pr-dhl-blocks-style',
$block_style_url,
[],
$this->get_file_version($block_style_path)
);
}
/**
* Helper method to register block editor scripts.
*
* @param string $handle Script handle name.
* @param string $script_path Path to the JS file.
* @param string $asset_path Path to the asset file.
*/
private function register_block_script($handle, $script_path, $asset_path)
{
$script_url = PR_DHL_PLUGIN_DIR_URL.$script_path;
$asset_file = PR_DHL_PLUGIN_DIR_PATH.$asset_path;
$asset = file_exists($asset_file) ? require $asset_file : [
'dependencies' => [],
'version' => $this->get_file_version($script_path),
];
wp_register_script(
$handle,
$script_url,
$asset['dependencies'],
$asset['version'],
true
);
wp_set_script_translations(
$handle,
'dhl-for-woocommerce',
PR_DHL_PLUGIN_DIR_PATH.'/lang'
);
}
/**
* Helper method to register frontend scripts.
*
* @param string $handle Script handle name.
* @param string $script_path Path to the JS file.
* @param string $asset_path Path to the asset file.
*/
private function register_frontend_script($handle, $script_path, $asset_path)
{
$script_url = PR_DHL_PLUGIN_DIR_URL.$script_path;
$asset_file = PR_DHL_PLUGIN_DIR_PATH.$asset_path;
$asset = file_exists($asset_file) ? require $asset_file : [
'dependencies' => [],
'version' => $this->get_file_version($script_path),
];
// Enqueue Google Maps
$dhl_settings = PR_DHL()->get_shipping_dhl_settings();
wp_enqueue_script(
$handle,
$script_url,
$asset['dependencies'],
$asset['version'],
true
);
wp_set_script_translations(
$handle,
'dhl-for-woocommerce',
PR_DHL_PLUGIN_DIR_PATH.'/lang'
);
}
/**
* Registers AJAX actions.
*/
private function register_ajax_actions()
{
add_action('wp_ajax_pr_dhl_set_checkout_post_data', [$this, 'handle_set_checkout_post_data']);
add_action('wp_ajax_nopriv_pr_dhl_set_checkout_post_data', [$this, 'handle_set_checkout_post_data']);
add_action('wp_ajax_pr_dhl_get_preferred_days', [$this, 'handle_get_preferred_days']);
add_action('wp_ajax_nopriv_pr_dhl_get_preferred_days', [$this, 'handle_get_preferred_days']);
}
/**
* Returns an array of script handles to enqueue in the frontend context.
*
* @return string[]
*/
public function get_script_handles()
{
return [
'pr-dhl-preferred-services-integration',
'pr-dhl-preferred-services-frontend',
'pr-dhl-closest-drop-point-frontend',
'pr-dhl-parcel-finder-frontend',
];
}
/**
* Returns an array of script handles to enqueue in the editor context.
*
* @return string[]
*/
public function get_editor_script_handles()
{
return [
'pr-dhl-preferred-services-integration',
'pr-dhl-preferred-services-editor',
'pr-dhl-closest-drop-point-editor',
'pr-dhl-parcel-finder-editor',
];
}
/**
* An array of key, value pairs of data made available to the block on the client side.
*
* @return array
*/
public function get_script_data()
{
return [
'pr-dhl-active' => true,
];
}
/**
* Localizes scripts with necessary data.
*/
private function localize_scripts()
{
// Fetch the shipping settings.
$dhl_settings = $this->get_dhl_settings();
$localize_data = [
'pluginUrl' => PR_DHL_PLUGIN_DIR_URL,
'dhlSettings' => $dhl_settings,
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('pr_dhl_nonce'),
'parcel_nonce' => wp_create_nonce('dhl_parcelfinder'),
'DHL_ENGLISH_REGISTRATION_LINK' => DHL_ENGLISH_REGISTRATION_LINK,
'DHL_GERMAN_REGISTRATION_LINK' => DHL_GERMAN_REGISTRATION_LINK,
'locale' => get_locale(),
'valid_countries' => ['SE', 'FI', 'BE', 'AT', 'FR'],
'droppointAddressTypes' => PR_DHL()->get_droppoint_address_types(),
];
// Localize the editor script.
wp_localize_script(
'pr-dhl-preferred-services-editor',
'prDhlGlobals',
$localize_data
);
// Localize the frontend scripts.
wp_localize_script(
'pr-dhl-preferred-services-frontend',
'prDhlGlobals',
$localize_data
);
// Localize the frontend scripts.
wp_localize_script(
'pr-dhl-closest-drop-point-frontend',
'prDhlGlobals',
$localize_data
);
}
/**
* Get the DHL settings that are relevant to the blocks.
*
* @throws Exception
*/
private function get_dhl_settings(): array
{
$dhl_settings = PR_DHL()->get_shipping_dhl_settings();
$settings_keys = [
'dhl_display_packstation',
'dhl_display_parcelshop',
'dhl_display_post_office',
'dhl_preferred_day',
'dhl_preferred_location',
'dhl_preferred_neighbour',
'dhl_preferred_day_cost',
'dhl_display_google_maps',
'dhl_closest_drop_point',
];
$filtered_settings = [];
foreach ($settings_keys as $key) {
$value = $dhl_settings[$key] ?? false;
if ($value === 'yes') {
$value = true;
} elseif (! is_numeric($value)) {
$value = false;
}
// Remove 'dhl_' prefix from the key.
$clean_key = str_replace('dhl_', '', $key);
$filtered_settings[$clean_key] = $value;
}
return $filtered_settings;
}
/**
* Get the file modified time as a cache buster if we're in dev mode.
*
* @param string $file Local path to the file.
* @return string The cache buster value to use for the given file.
*/
protected function get_file_version($file)
{
$file_path = PR_DHL_PLUGIN_DIR_PATH.$file;
if (defined('SCRIPT_DEBUG') && SCRIPT_DEBUG && file_exists($file_path)) {
return filemtime($file_path);
}
return PR_DHL_VERSION;
}
public function handle_set_checkout_post_data()
{
// Verify nonce
if (! isset($_POST['nonce']) || ! wp_verify_nonce($_POST['nonce'], 'pr_dhl_nonce')) {
wp_send_json_error(['message' => 'Invalid nonce'], 400);
wp_die();
}
// Check if data is provided
if (! isset($_POST['data']) || ! is_array($_POST['data'])) {
wp_send_json_error(['message' => 'No data provided.'], 400);
wp_die();
}
// Sanitize data
$sanitized_data = array_map('sanitize_text_field', wp_unslash($_POST['data']));
// Store data in WooCommerce session
WC()->session->set('pr_dhl_checkout_post_data', $sanitized_data);
wp_send_json_success(['message' => 'Data saved successfully.'], 200);
wp_die();
}
public function handle_get_preferred_days()
{
// Verify nonce
if (! isset($_POST['nonce']) || ! wp_verify_nonce($_POST['nonce'], 'pr_dhl_nonce')) {
wp_send_json_error(['message' => 'Invalid nonce'], 400);
wp_die();
}
// Retrieve post_data from WooCommerce session
$order_data = WC()->session->get('pr_dhl_checkout_post_data');
if (empty($order_data) || ! is_array($order_data)) {
wp_send_json_error(['message' => 'No checkout data found.'], 400);
wp_die();
}
// Use the order_data to get the preferred days
$postcode = isset($order_data['shipping_postcode']) ? $order_data['shipping_postcode'] : '';
$shipping_country = isset($order_data['shipping_country']) ? $order_data['shipping_country'] : '';
if (empty($postcode)) {
wp_send_json_error(['message' => 'Postcode not found in checkout data.'], 400);
wp_die();
}
try {
$front_end_packet = new PR_DHL_Front_End_Paket;
// Call the validate_extra_services_available function with parameters
$display_preferred = $front_end_packet->validate_extra_services_available(
true,
$shipping_country);
if (! $display_preferred) {
wp_send_json_error(['message' => 'Preferred services not available.'], 400);
wp_die();
}
$preferred_day_time = PR_DHL()->get_dhl_preferred_day_time($postcode);
wp_send_json_success(['preferredDays' => $preferred_day_time['preferred_day']], 200);
} catch (Exception $e) {
wp_send_json_error(['message' => $e->getMessage()], 500);
}
wp_die();
}
}