registerScripts(); $this->registerAdditionalCheckoutFields(); } /** * Register scripts for the checkout block */ private function registerScripts(): void { $scriptPath = WC_LICENSED_PRODUCT_PLUGIN_DIR . 'assets/js/checkout-blocks.js'; $scriptUrl = WC_LICENSED_PRODUCT_PLUGIN_URL . 'assets/js/checkout-blocks.js'; if (file_exists($scriptPath)) { wp_register_script( 'wc-licensed-product-checkout-blocks', $scriptUrl, ['wc-blocks-checkout', 'wp-element', 'wp-components', 'wp-i18n', 'wp-plugins', 'wp-data'], WC_LICENSED_PRODUCT_VERSION, true ); wp_set_script_translations( 'wc-licensed-product-checkout-blocks', 'wc-licensed-product', WC_LICENSED_PRODUCT_PLUGIN_DIR . 'languages' ); } } /** * Register additional checkout fields using WooCommerce Blocks API */ private function registerAdditionalCheckoutFields(): void { add_action('woocommerce_blocks_loaded', function (): void { // Check if the function exists (WooCommerce 8.9+) if (!function_exists('woocommerce_register_additional_checkout_field')) { return; } // Register the domain field using WooCommerce's checkout fields API // For single domain mode only (multi-domain uses custom JS component) if (!SettingsController::isMultiDomainEnabled()) { woocommerce_register_additional_checkout_field([ 'id' => 'wc-licensed-product/domain', 'label' => __('License Domain', 'wc-licensed-product'), 'location' => 'order', 'type' => 'text', 'required' => false, 'attributes' => [ 'placeholder' => __('example.com', 'wc-licensed-product'), 'pattern' => '^([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$', 'title' => __('Enter a valid domain (without http:// or www)', 'wc-licensed-product'), ], ]); } }); } /** * Returns an array of script handles to enqueue in the frontend context */ public function get_script_handles(): array { return ['wc-licensed-product-checkout-blocks']; } /** * Returns an array of script handles to enqueue in the editor context */ public function get_editor_script_handles(): array { return []; } /** * Returns script data to pass to the frontend scripts */ public function get_script_data(): array { $isMultiDomain = SettingsController::isMultiDomainEnabled(); return [ 'hasLicensedProducts' => $this->cartHasLicensedProducts(), 'licensedProducts' => $this->getLicensedProductsFromCart(), 'isMultiDomainEnabled' => $isMultiDomain, 'fieldPlaceholder' => __('example.com', 'wc-licensed-product'), 'fieldDescription' => $isMultiDomain ? __('Enter a unique domain for each license (without http:// or www).', 'wc-licensed-product') : __('Enter the domain where you will use the license (without http:// or www).', 'wc-licensed-product'), 'sectionTitle' => $isMultiDomain ? __('License Domains', 'wc-licensed-product') : __('License Domain', 'wc-licensed-product'), 'validationError' => __('Please enter a valid domain.', 'wc-licensed-product'), 'duplicateError' => __('Each license requires a unique domain.', 'wc-licensed-product'), 'licenseLabel' => __('License %d:', 'wc-licensed-product'), 'singleDomainLabel' => __('Domain', 'wc-licensed-product'), ]; } /** * Check if cart contains licensed products */ private function cartHasLicensedProducts(): bool { return !empty($this->getLicensedProductsFromCart()); } /** * Get licensed products from cart with quantities * * @return array */ private function getLicensedProductsFromCart(): array { if (!WC()->cart) { return []; } $licensedProducts = []; foreach (WC()->cart->get_cart() as $cartItem) { $product = $cartItem['data']; if ($product && $product->is_type('licensed')) { $productId = $product->get_id(); $licensedProducts[] = [ 'product_id' => $productId, 'name' => $product->get_name(), 'quantity' => (int) $cartItem['quantity'], ]; } } return $licensedProducts; } }