Skip to content
This repository was archived by the owner on Feb 23, 2024. It is now read-only.

Create AssetsController and BlockTypesController (replaces Assets.php and Library.php) #4094

Merged
merged 9 commits into from
Apr 26, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
106 changes: 15 additions & 91 deletions src/Assets.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,11 @@

use Automattic\WooCommerce\Blocks\Package;
use Automattic\WooCommerce\Blocks\Assets\Api as AssetApi;
use Automattic\WooCommerce\Blocks\Assets\AssetDataRegistry as AssetDataRegistry;

/**
* Assets class.
* Initializes block assets.
*
* @deprecated $VID:$ This class will be removed in a future release. This has been replaced by AssetsController.
* @internal
*/
class Assets {
Expand All @@ -17,121 +16,63 @@ class Assets {
* Initialize class features on init.
*
* @since 2.5.0
* Moved most initialization to BootStrap and AssetDataRegistry
* classes as a part of ongoing refactor
* @deprecated $VID:$
*/
public static function init() {
add_action( 'init', array( __CLASS__, 'register_assets' ) );
add_action( 'body_class', array( __CLASS__, 'add_theme_body_class' ), 1 );
add_action( 'admin_body_class', array( __CLASS__, 'add_theme_admin_body_class' ), 1 );
add_action( 'woocommerce_login_form_end', array( __CLASS__, 'redirect_to_field' ) );
add_action( 'wp_enqueue_scripts', array( __CLASS__, 'enqueue_scripts' ) );
add_action( 'admin_enqueue_scripts', array( __CLASS__, 'enqueue_scripts' ) );
_deprecated_function( 'Assets::init', '$VID:$' );
}

/**
* Register block scripts & styles.
*
* @since 2.5.0
* Moved data related enqueuing to new AssetDataRegistry class as part of ongoing refactoring.
* @deprecated $VID:$
*/
public static function register_assets() {
$asset_api = Package::container()->get( AssetApi::class );

self::register_style( 'wc-block-editor', plugins_url( $asset_api->get_block_asset_build_path( 'editor', 'css' ), __DIR__ ), array( 'wp-edit-blocks' ) );
self::register_style( 'wc-block-style', plugins_url( $asset_api->get_block_asset_build_path( 'style', 'css' ), __DIR__ ), array( 'wc-block-vendors-style' ) );

wp_style_add_data( 'wc-block-editor', 'rtl', 'replace' );
wp_style_add_data( 'wc-block-style', 'rtl', 'replace' );

// Shared libraries and components across multiple blocks.
$asset_api->register_script( 'wc-blocks-middleware', 'build/wc-blocks-middleware.js', [], false );
$asset_api->register_script( 'wc-blocks-data-store', 'build/wc-blocks-data.js', [ 'wc-blocks-middleware' ] );
$asset_api->register_script( 'wc-blocks', $asset_api->get_block_asset_build_path( 'blocks' ), [], false );
$asset_api->register_script( 'wc-vendors', $asset_api->get_block_asset_build_path( 'vendors' ), [], false );
$asset_api->register_script( 'wc-blocks-registry', 'build/wc-blocks-registry.js', [], false );
$asset_api->register_script( 'wc-shared-context', 'build/wc-shared-context.js', [] );
$asset_api->register_script( 'wc-shared-hocs', 'build/wc-shared-hocs.js', [], false );
$asset_api->register_script( 'wc-price-format', 'build/price-format.js', [], false );

if ( Package::feature()->is_feature_plugin_build() ) {
$asset_api->register_script( 'wc-blocks-checkout', 'build/blocks-checkout.js', [] );
}

wp_add_inline_script(
'wc-blocks-middleware',
"
var wcBlocksMiddlewareConfig = {
storeApiNonce: '" . esc_js( wp_create_nonce( 'wc_store_api' ) ) . "',
wcStoreApiNonceTimestamp: '" . esc_js( time() ) . "'
};
",
'before'
);
_deprecated_function( 'Assets::register_assets', '$VID:$' );
}

/**
* Register the vendors style file. We need to do it after the other files
* because we need to check if `wp-edit-post` has been enqueued.
*
* @deprecated $VID:$
*/
public static function enqueue_scripts() {
$asset_api = Package::container()->get( AssetApi::class );

// @todo Remove fix to load our stylesheets after editor CSS.
// See #3068 and #3898 for the rationale of this fix. It should be no
// longer necessary when the editor is loaded in an iframe (https://github.com/WordPress/gutenberg/issues/20797).
if ( wp_style_is( 'wp-edit-post' ) ) {
$block_style_dependencies = array( 'wp-edit-post' );
} else {
$block_style_dependencies = array();
}
self::register_style( 'wc-block-vendors-style', plugins_url( $asset_api->get_block_asset_build_path( 'vendors-style', 'css' ), __DIR__ ), $block_style_dependencies );
_deprecated_function( 'Assets::enqueue_scripts', '$VID:$' );
}

/**
* Add body classes.
*
* @deprecated $VID:$
* @param array $classes Array of CSS classnames.
* @return array Modified array of CSS classnames.
*/
public static function add_theme_body_class( $classes = [] ) {
$classes[] = 'theme-' . get_template();
_deprecated_function( 'Assets::add_theme_body_class', '$VID:$' );
return $classes;
}

/**
* Add theme class to admin body.
*
* @deprecated $VID:$
* @param array $classes String with the CSS classnames.
* @return array Modified string of CSS classnames.
*/
public static function add_theme_admin_body_class( $classes = '' ) {
$classes .= ' theme-' . get_template();
_deprecated_function( 'Assets::add_theme_admin_body_class', '$VID:$' );
return $classes;
}

/**
* Adds a redirect field to the login form so blocks can redirect users after login.
*/
public static function redirect_to_field() {
// phpcs:ignore WordPress.Security.NonceVerification
if ( empty( $_GET['redirect_to'] ) ) {
return;
}
echo '<input type="hidden" name="redirect" value="' . esc_attr( esc_url_raw( wp_unslash( $_GET['redirect_to'] ) ) ) . '" />'; // phpcs:ignore WordPress.Security.NonceVerification
}

/**
* 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.
* @deprecated $VID:$
*/
protected static function get_file_version( $file ) {
if ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG && file_exists( \Automattic\WooCommerce\Blocks\Package::get_path() . $file ) ) {
return filemtime( \Automattic\WooCommerce\Blocks\Package::get_path() . $file );
}
return \Automattic\WooCommerce\Blocks\Package::get_version();
public static function redirect_to_field() {
_deprecated_function( 'Assets::redirect_to_field', '$VID:$' );
}

/**
Expand All @@ -151,21 +92,4 @@ public static function register_block_script( $script_name, $handle = '', $depen
$asset_api = Package::container()->get( AssetApi::class );
$asset_api->register_block_script( $script_name, $handle, $dependencies );
}

/**
* Registers a style according to `wp_register_style`.
*
* @since 2.0.0
*
* @param string $handle Name of the stylesheet. Should be unique.
* @param string $src Full URL of the stylesheet, or path of the stylesheet relative to the WordPress root directory.
* @param array $deps Optional. An array of registered stylesheet handles this stylesheet depends on. Default empty array.
* @param string $media Optional. The media for which this stylesheet has been defined. Default 'all'. Accepts media types like
* 'all', 'print' and 'screen', or media queries like '(orientation: portrait)' and '(max-width: 640px)'.
*/
protected static function register_style( $handle, $src, $deps = [], $media = 'all' ) {
$filename = str_replace( plugins_url( '/', __DIR__ ), '', $src );
$ver = self::get_file_version( $filename );
wp_register_style( $handle, $src, $deps, $ver, $media );
}
}
23 changes: 0 additions & 23 deletions src/Assets/Api.php
Original file line number Diff line number Diff line change
Expand Up @@ -121,29 +121,6 @@ function() use ( $handle ) {
}
}

/**
* Queues a block script in the frontend.
*
* @since 2.5.0
* @since 2.6.0 Changed $name to $script_name and added $handle argument.
* @since 2.9.0 Made it so scripts are not loaded in admin pages.
* @deprecated 4.5.0 Block types register the scripts themselves.
*
* @param string $script_name Name of the script used to identify the file inside build folder.
* @param string $handle Optional. Provided if the handle should be different than the script name. `wc-` prefix automatically added.
* @param array $dependencies Optional. An array of registered script handles this script depends on. Default empty array.
*/
public function register_block_script( $script_name, $handle = '', $dependencies = [] ) {
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note; I removed these as they have been deprecated for several versions and are not being used internally.

_deprecated_function( 'register_block_script', '4.5.0' );
if ( is_admin() ) {
return;
}
$relative_src = $this->get_block_asset_build_path( $script_name );
$handle = '' !== $handle ? 'wc-' . $handle : 'wc-' . $script_name;
$this->register_script( $handle, $relative_src, $dependencies );
wp_enqueue_script( $handle );
}

/**
* Registers a style according to `wp_register_style`.
*
Expand Down
135 changes: 135 additions & 0 deletions src/AssetsController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
<?php
namespace Automattic\WooCommerce\Blocks;

use Automattic\WooCommerce\Blocks\Package;
use Automattic\WooCommerce\Blocks\Assets\Api as AssetApi;
use Automattic\WooCommerce\Blocks\Assets\AssetDataRegistry as AssetDataRegistry;

/**
* AssetsController class.
*
* @since $VID:$
* @internal
*/
final class AssetsController {

/**
* Asset API interface for various asset registration.
*
* @var AssetApi
*/
private $api;

/**
* Constructor.
*
* @param AssetApi $asset_api Asset API interface for various asset registration.
*/
public function __construct( AssetApi $asset_api ) {
$this->api = $asset_api;
$this->init();
}

/**
* Initialize class features.
*/
protected function init() {
add_action( 'init', array( $this, 'register_assets' ) );
add_action( 'body_class', array( $this, 'add_theme_body_class' ), 1 );
add_action( 'admin_body_class', array( $this, 'add_theme_body_class' ), 1 );
add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_scripts' ) );
add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts' ) );
}

/**
* Register block scripts & styles.
*/
public function register_assets() {
$this->register_style( 'wc-block-editor', plugins_url( $this->api->get_block_asset_build_path( 'editor', 'css' ), __DIR__ ), array( 'wp-edit-blocks' ) );
$this->register_style( 'wc-block-style', plugins_url( $this->api->get_block_asset_build_path( 'style', 'css' ), __DIR__ ), array( 'wc-block-vendors-style' ) );

wp_style_add_data( 'wc-block-editor', 'rtl', 'replace' );
wp_style_add_data( 'wc-block-style', 'rtl', 'replace' );

$this->api->register_script( 'wc-blocks-middleware', 'build/wc-blocks-middleware.js', [], false );
$this->api->register_script( 'wc-blocks-data-store', 'build/wc-blocks-data.js', [ 'wc-blocks-middleware' ] );
$this->api->register_script( 'wc-blocks', $this->api->get_block_asset_build_path( 'blocks' ), [], false );
$this->api->register_script( 'wc-vendors', $this->api->get_block_asset_build_path( 'vendors' ), [], false );
$this->api->register_script( 'wc-blocks-registry', 'build/wc-blocks-registry.js', [], false );
$this->api->register_script( 'wc-shared-context', 'build/wc-shared-context.js', [] );
$this->api->register_script( 'wc-shared-hocs', 'build/wc-shared-hocs.js', [], false );
$this->api->register_script( 'wc-price-format', 'build/price-format.js', [], false );

if ( Package::feature()->is_feature_plugin_build() ) {
$this->api->register_script( 'wc-blocks-checkout', 'build/blocks-checkout.js', [] );
}

wp_add_inline_script(
'wc-blocks-middleware',
"
var wcBlocksMiddlewareConfig = {
storeApiNonce: '" . esc_js( wp_create_nonce( 'wc_store_api' ) ) . "',
wcStoreApiNonceTimestamp: '" . esc_js( time() ) . "'
};
",
'before'
);
}

/**
* Register the vendors style file. We need to do it after the other files
* because we need to check if `wp-edit-post` has been enqueued.
*/
public function enqueue_scripts() {
// @todo Remove fix to load our stylesheets after editor CSS.
// See #3068 and #3898 for the rationale of this fix. It should be no
// longer necessary when the editor is loaded in an iframe (https://github.com/WordPress/gutenberg/issues/20797).
$this->register_style( 'wc-block-vendors-style', plugins_url( $this->api->get_block_asset_build_path( 'vendors-style', 'css' ), __DIR__ ), wp_style_is( 'wp-edit-post' ) ? [ 'wp-edit-post' ] : [] );
}

/**
* Add body classes to the frontend and within admin.
*
* @param string|array $classes Array or string of CSS classnames.
* @return string|array Modified classnames.
*/
public function add_theme_body_class( $classes ) {
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note I combined the 2 functions into one which handles $classes based on type instead of 2 functions for similar logic.

$class = 'theme-' . get_template();

if ( is_array( $classes ) ) {
$classes[] = $class;
} else {
$classes .= ' ' . $class . ' ';
}

return $classes;
}

/**
* 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 ) {
if ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG && file_exists( \Automattic\WooCommerce\Blocks\Package::get_path() . $file ) ) {
return filemtime( \Automattic\WooCommerce\Blocks\Package::get_path() . $file );
}
return \Automattic\WooCommerce\Blocks\Package::get_version();
}

/**
* Registers a style according to `wp_register_style`.
*
* @param string $handle Name of the stylesheet. Should be unique.
* @param string $src Full URL of the stylesheet, or path of the stylesheet relative to the WordPress root directory.
* @param array $deps Optional. An array of registered stylesheet handles this stylesheet depends on. Default empty array.
* @param string $media Optional. The media for which this stylesheet has been defined. Default 'all'. Accepts media types like
* 'all', 'print' and 'screen', or media queries like '(orientation: portrait)' and '(max-width: 640px)'.
*/
protected function register_style( $handle, $src, $deps = [], $media = 'all' ) {
$filename = str_replace( plugins_url( '/', __DIR__ ), '', $src );
$ver = self::get_file_version( $filename );
wp_register_style( $handle, $src, $deps, $ver, $media );
}
}
Loading