<?php namespace Automattic\WooCommerce\Blocks\Domain\Services; use Automattic\WooCommerce\Blocks\Domain\Package; use Automattic\WooCommerce\Blocks\Utils\CartCheckoutUtils; /** * Service class for adding new-style Notices to WooCommerce core. * * @internal */ class Notices { /** * Holds the Package instance * * @var Package */ private $package; /** * Templates used for notices. * * @var array */ private $notice_templates = array( 'notices/error.php', 'notices/notice.php', 'notices/success.php', ); /** * Constructor * * @param Package $package An instance of the package class. */ public function __construct( Package $package ) { $this->package = $package; } /** * Initialize notice hooks. */ public function init() { if ( wp_is_block_theme() ) { add_filter( 'woocommerce_kses_notice_allowed_tags', [ $this, 'add_kses_notice_allowed_tags' ] ); add_filter( 'wc_get_template', [ $this, 'get_notices_template' ], 10, 5 ); add_action( 'wp_head', [ $this, 'enqueue_notice_styles' ] ); } } /** * Allow SVG icon in notices. * * @param array $allowed_tags Allowed tags. * @return array */ public function add_kses_notice_allowed_tags( $allowed_tags ) { $svg_args = array( 'svg' => array( 'aria-hidden' => true, 'xmlns' => true, 'width' => true, 'height' => true, 'viewbox' => true, 'focusable' => true, ), 'path' => array( 'd' => true, ), ); return array_merge( $allowed_tags, $svg_args ); } /** * Replaces core notice templates with those from blocks. * * The new notice templates match block components with matching icons and styling. The differences are: * 1. Core has notices for info, success, and error notices, blocks has notices for info, success, error, * warning, and a default notice type. * 2. The block notices use different CSS classes to the core notices. Core uses `woocommerce-message`, `is-info` * and `is-error` classes, blocks uses `wc-block-components-notice-banner is-error`, * `wc-block-components-notice-banner is-info`, and `wc-block-components-notice-banner is-success`. * 3. The markup of the notices is different, with the block notices using SVG icons and a slightly different * structure to accommodate this. * * @param string $template Located template path. * @param string $template_name Template name. * @param array $args Template arguments. * @param string $template_path Template path. * @param string $default_path Default path. * @return string */ public function get_notices_template( $template, $template_name, $args, $template_path, $default_path ) { $directory = get_stylesheet_directory(); $file = $directory . '/woocommerce/' . $template_name; if ( file_exists( $file ) ) { return $file; } if ( in_array( $template_name, $this->notice_templates, true ) ) { $template = $this->package->get_path( 'templates/block-' . $template_name ); wp_enqueue_style( 'wc-blocks-style' ); } return $template; } /** * Replaces all notices with the new block based notices. * * @return void */ public function enqueue_notice_styles() { wp_enqueue_style( 'wc-blocks-style' ); } }