180 lines
5.3 KiB
PHP
180 lines
5.3 KiB
PHP
<?php
|
|
namespace Automattic\WooCommerce\Blocks\Integrations;
|
|
|
|
/**
|
|
* Class used for tracking registered integrations with various Block types.
|
|
*/
|
|
class IntegrationRegistry {
|
|
/**
|
|
* Integration identifier is used to construct hook names and is given when the integration registry is initialized.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $registry_identifier = '';
|
|
|
|
/**
|
|
* Registered integrations, as `$name => $instance` pairs.
|
|
*
|
|
* @var IntegrationInterface[]
|
|
*/
|
|
protected $registered_integrations = [];
|
|
|
|
/**
|
|
* Initializes all registered integrations.
|
|
*
|
|
* Integration identifier is used to construct hook names and is given when the integration registry is initialized.
|
|
*
|
|
* @param string $registry_identifier Identifier for this registry.
|
|
*/
|
|
public function initialize( $registry_identifier = '' ) {
|
|
if ( $registry_identifier ) {
|
|
$this->registry_identifier = $registry_identifier;
|
|
}
|
|
|
|
if ( empty( $this->registry_identifier ) ) {
|
|
_doing_it_wrong( __METHOD__, esc_html( __( 'Integration registry requires an identifier.', 'woocommerce' ) ) );
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Hook: integration_registration.
|
|
*
|
|
* Runs before integrations are initialized allowing new integration to be registered for use. This should be
|
|
* used as the primary hook for integrations to include their scripts, styles, and other code extending the
|
|
* blocks.
|
|
*
|
|
* @param IntegrationRegistry $this Instance of the IntegrationRegistry class which exposes the IntegrationRegistry::register() method.
|
|
*/
|
|
do_action( 'woocommerce_blocks_' . $this->registry_identifier . '_registration', $this );
|
|
|
|
foreach ( $this->get_all_registered() as $registered_integration ) {
|
|
$registered_integration->initialize();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Registers an integration.
|
|
*
|
|
* @param IntegrationInterface $integration An instance of IntegrationInterface.
|
|
*
|
|
* @return boolean True means registered successfully.
|
|
*/
|
|
public function register( IntegrationInterface $integration ) {
|
|
$name = $integration->get_name();
|
|
|
|
if ( $this->is_registered( $name ) ) {
|
|
/* translators: %s: Integration name. */
|
|
_doing_it_wrong( __METHOD__, esc_html( sprintf( __( '"%s" is already registered.', 'woocommerce' ), $name ) ) );
|
|
return false;
|
|
}
|
|
|
|
$this->registered_integrations[ $name ] = $integration;
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Checks if an integration is already registered.
|
|
*
|
|
* @param string $name Integration name.
|
|
* @return bool True if the integration is registered, false otherwise.
|
|
*/
|
|
public function is_registered( $name ) {
|
|
return isset( $this->registered_integrations[ $name ] );
|
|
}
|
|
|
|
/**
|
|
* Un-register an integration.
|
|
*
|
|
* @param string|IntegrationInterface $name Integration name, or alternatively a IntegrationInterface instance.
|
|
* @return boolean|IntegrationInterface Returns the unregistered integration instance if unregistered successfully.
|
|
*/
|
|
public function unregister( $name ) {
|
|
if ( $name instanceof IntegrationInterface ) {
|
|
$name = $name->get_name();
|
|
}
|
|
|
|
if ( ! $this->is_registered( $name ) ) {
|
|
/* translators: %s: Integration name. */
|
|
_doing_it_wrong( __METHOD__, esc_html( sprintf( __( 'Integration "%s" is not registered.', 'woocommerce' ), $name ) ) );
|
|
return false;
|
|
}
|
|
|
|
$unregistered = $this->registered_integrations[ $name ];
|
|
unset( $this->registered_integrations[ $name ] );
|
|
return $unregistered;
|
|
}
|
|
|
|
/**
|
|
* Retrieves a registered Integration by name.
|
|
*
|
|
* @param string $name Integration name.
|
|
* @return IntegrationInterface|null The registered integration, or null if it is not registered.
|
|
*/
|
|
public function get_registered( $name ) {
|
|
return $this->is_registered( $name ) ? $this->registered_integrations[ $name ] : null;
|
|
}
|
|
|
|
/**
|
|
* Retrieves all registered integrations.
|
|
*
|
|
* @return IntegrationInterface[]
|
|
*/
|
|
public function get_all_registered() {
|
|
return $this->registered_integrations;
|
|
}
|
|
|
|
/**
|
|
* Gets an array of all registered integration's script handles for the editor.
|
|
*
|
|
* @return string[]
|
|
*/
|
|
public function get_all_registered_editor_script_handles() {
|
|
$script_handles = [];
|
|
$registered_integrations = $this->get_all_registered();
|
|
|
|
foreach ( $registered_integrations as $registered_integration ) {
|
|
$script_handles = array_merge(
|
|
$script_handles,
|
|
$registered_integration->get_editor_script_handles()
|
|
);
|
|
}
|
|
|
|
return array_unique( array_filter( $script_handles ) );
|
|
}
|
|
|
|
/**
|
|
* Gets an array of all registered integration's script handles.
|
|
*
|
|
* @return string[]
|
|
*/
|
|
public function get_all_registered_script_handles() {
|
|
$script_handles = [];
|
|
$registered_integrations = $this->get_all_registered();
|
|
|
|
foreach ( $registered_integrations as $registered_integration ) {
|
|
$script_handles = array_merge(
|
|
$script_handles,
|
|
$registered_integration->get_script_handles()
|
|
);
|
|
}
|
|
|
|
return array_unique( array_filter( $script_handles ) );
|
|
}
|
|
|
|
/**
|
|
* Gets an array of all registered integration's script data.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function get_all_registered_script_data() {
|
|
$script_data = [];
|
|
$registered_integrations = $this->get_all_registered();
|
|
|
|
foreach ( $registered_integrations as $registered_integration ) {
|
|
$script_data[ $registered_integration->get_name() . '_data' ] = $registered_integration->get_script_data();
|
|
}
|
|
|
|
return array_filter( $script_data );
|
|
}
|
|
}
|