From 21716a6439b419ed034b8f64fca094ceb54c20cc Mon Sep 17 00:00:00 2001 From: Bart Jaskulski <bjaskulski@protonmail.com> Date: Sun, 10 Mar 2024 01:46:46 +0100 Subject: [PATCH] feat: manually discover, which extensions to enable Signed-off-by: Bart Jaskulski <bjaskulski@protonmail.com> --- .../CustomOrdersTableCompatibility.php | 32 ++++++++ src/Extension/CommonBinding/I18n.php | 6 +- .../CommonBinding/WPDeskLicenseBridge.php | 42 ++++++++++ .../CommonBinding/WPDeskTrackerBridge.php | 21 +++++ src/Extension/ConditionalExtension.php | 78 +++++++++++++++++++ src/Extension/LoggerExtension.php | 20 ----- 6 files changed, 176 insertions(+), 23 deletions(-) create mode 100644 src/Extension/CommonBinding/CustomOrdersTableCompatibility.php create mode 100644 src/Extension/CommonBinding/WPDeskLicenseBridge.php create mode 100644 src/Extension/CommonBinding/WPDeskTrackerBridge.php create mode 100644 src/Extension/ConditionalExtension.php delete mode 100644 src/Extension/LoggerExtension.php diff --git a/src/Extension/CommonBinding/CustomOrdersTableCompatibility.php b/src/Extension/CommonBinding/CustomOrdersTableCompatibility.php new file mode 100644 index 0000000..aa33b90 --- /dev/null +++ b/src/Extension/CommonBinding/CustomOrdersTableCompatibility.php @@ -0,0 +1,32 @@ +<?php + +namespace WPDesk\Init\Extension\CommonBinding; + +use WPDesk\Init\Binding\Hookable; +use WPDesk\Init\Plugin\Plugin; + +class CustomOrdersTableCompatibility implements Hookable { + + /** @var Plugin */ + private $plugin; + + public function __construct( Plugin $plugin ) { + $this->plugin = $plugin; + } + + public function hooks(): void { + add_action('before_woocommerce_init', $this); + } + + public function __invoke(): void { + $features_util_class = '\\' . 'Automattic' . '\\' . 'WooCommerce' . '\\' . 'Utilities' . '\\' . 'FeaturesUtil'; + if ( class_exists( $features_util_class ) ) { + $features_util_class::declare_compatibility( + 'custom_order_tables', + $this->plugin->get_basename(), + true + ); + } + + } +} diff --git a/src/Extension/CommonBinding/I18n.php b/src/Extension/CommonBinding/I18n.php index 61e8edd..a522173 100644 --- a/src/Extension/CommonBinding/I18n.php +++ b/src/Extension/CommonBinding/I18n.php @@ -16,13 +16,13 @@ class I18n implements Hookable { public function hooks(): void { if ( did_action( 'plugins_loaded' ) ) { - $this->load_textdomain(); + $this->__invoke(); } else { - add_action( 'plugins_loaded', [ $this, 'load_textdomain' ] ); + add_action( 'plugins_loaded', $this ); } } - public function load_textdomain(): void { + public function __invoke(): void { \load_plugin_textdomain( $this->plugin->get_slug(), false, diff --git a/src/Extension/CommonBinding/WPDeskLicenseBridge.php b/src/Extension/CommonBinding/WPDeskLicenseBridge.php new file mode 100644 index 0000000..55db2c7 --- /dev/null +++ b/src/Extension/CommonBinding/WPDeskLicenseBridge.php @@ -0,0 +1,42 @@ +<?php + +namespace WPDesk\Init\Extension\CommonBinding; + +use WPDesk\Init\Binding\Hookable; +use WPDesk\Init\Plugin\Plugin; +use WPDesk\License\PluginRegistrator; + +class WPDeskLicenseBridge implements Hookable { + + /** @var \WPDesk_Plugin_Info */ + private $plugin_info; + + private $registrator; + + public function __construct( \WPDesk_Plugin_Info $plugin_info ) { + $this->plugin_info = $plugin_info; + } + + public function hooks(): void { + $this->registrator = $this->register_plugin(); + // add_action('plugins_loaded', $this); + } + + public function __invoke(): void { + $is_plugin_subscription_active = $this->registrator instanceof PluginRegistrator && $this->registrator->is_active(); + if ( $this->plugin instanceof ActivationAware && $is_plugin_subscription_active ) { + $this->plugin->set_active(); + } + + } + + private function register_plugin() { + if ( apply_filters( 'wpdesk_can_register_plugin', true, $this->plugin_info ) ) { + $registrator = new PluginRegistrator( $this->plugin_info ); + $registrator->initialize_license_manager(); + + return $registrator; + } + } + +} diff --git a/src/Extension/CommonBinding/WPDeskTrackerBridge.php b/src/Extension/CommonBinding/WPDeskTrackerBridge.php new file mode 100644 index 0000000..20660f9 --- /dev/null +++ b/src/Extension/CommonBinding/WPDeskTrackerBridge.php @@ -0,0 +1,21 @@ +<?php + +namespace WPDesk\Init\Extension\CommonBinding; + +use WPDesk\Init\Binding\Hookable; +use WPDesk\Init\Plugin\Plugin; + +class WPDeskTrackerBridge implements Hookable { + + /** @var Plugin */ + private $plugin; + + public function __construct( Plugin $plugin ) { + $this->plugin = $plugin; + } + + public function hooks(): void { + $tracker_factory = new \WPDesk_Tracker_Factory_Prefixed(); + $tracker_factory->create_tracker( $this->plugin->get_basename() ); + } +} diff --git a/src/Extension/ConditionalExtension.php b/src/Extension/ConditionalExtension.php new file mode 100644 index 0000000..dcc5dc5 --- /dev/null +++ b/src/Extension/ConditionalExtension.php @@ -0,0 +1,78 @@ +<?php + +declare(strict_types=1); + +namespace WPDesk\Init\Extension; + +use DI\Definition\Helper\AutowireDefinitionHelper; +use Monolog\Formatter\LineFormatter; +use Monolog\Logger; +use Monolog\Processor\PsrLogMessageProcessor; +use Monolog\Processor\UidProcessor; +use Psr\Container\ContainerInterface; +use Psr\Log\LoggerInterface; +use WPDesk\Init\Binding\Loader\ArrayBindingLoader; +use WPDesk\Init\Binding\Loader\BindingDefinitions; +use WPDesk\Init\Configuration\ReadableConfig; +use WPDesk\Init\DependencyInjection\ContainerBuilder; +use WPDesk\Init\Extension\CommonBinding\WPDeskLicenseBridge; +use WPDesk\Init\Extension\CommonBinding\WPDeskTrackerBridge; +use WPDesk\Init\Plugin\Plugin; +use WPDesk\Logger\WC\WooCommerceHandler; + +class ConditionalExtension implements Extension { + + public function bindings( ContainerInterface $c ): BindingDefinitions { + $bindings = []; + + if ( class_exists( \WPDesk\License\PluginRegistrator::class ) ) { + $bindings[] = WPDeskLicenseBridge::class; + } + + if ( class_exists( \WPDesk_Tracker::class ) ) { + $bindings[] = WPDeskTrackerBridge::class; + } + + return new ArrayBindingLoader( $bindings ); + } + + public function build( ContainerBuilder $builder, Plugin $plugin, ReadableConfig $config ): void { + $definitions = []; + + if ( class_exists( \WPDesk\License\PluginRegistrator::class ) ) { + $definitions[ WPDeskLicenseBridge::class ] = new AutowireDefinitionHelper(); + } + + if ( class_exists( \WPDesk_Tracker::class ) ) { + $definitions[ WPDeskTrackerBridge::class ] = new AutowireDefinitionHelper(); + } + + if ( class_exists( \WPDesk\Logger\WC\WooCommerceHandler::class ) ) { + $definitions[ LoggerInterface::class ] = static function () use ( $plugin ) { + $logger = new Logger( + $plugin->get_slug(), + [], + [ new PsrLogMessageProcessor( null, true ), new UidProcessor() ] + ); + + $attach_handler = function () use ( $logger, $plugin ) { + $handler = new WooCommerceHandler( wc_get_logger(), $plugin->get_slug() ); + $handler->setFormatter( + new LineFormatter( '%channel%.%level_name% [%extra.uid%]: %message% %context% %extra%' ) + ); + $logger->pushHandler( $handler ); + }; + + if ( \function_exists( 'wc_get_logger' ) ) { + $attach_handler(); + } else { + \add_action( 'woocommerce_init', $attach_handler ); + } + + return $logger; + }; + } + + $builder->add_definitions( $definitions ); + } +} diff --git a/src/Extension/LoggerExtension.php b/src/Extension/LoggerExtension.php deleted file mode 100644 index 15f0f2d..0000000 --- a/src/Extension/LoggerExtension.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php - -declare(strict_types=1); - -namespace WPDesk\Init\Extension; - -use WPDesk\Init\Configuration\ReadableConfig; -use WPDesk\Init\DependencyInjection\ContainerBuilder; -use WPDesk\Init\Plugin\Plugin; - -class LoggerExtension { - - public function build( ContainerBuilder $builder, Plugin $plugin, ReadableConfig $config ): void { - $builder->add_definitions( - [ - LoggerInterface::class => new NullLogger(), - ] - ); - } -} -- GitLab