Fix fatal when adding the Product Gallery (Beta) block into a pattern (#51189)

* Fix fatal when adding the Product Gallery (Beta) block into a pattern

* Add changelog file

* Linting
This commit is contained in:
Albert Juhé Lluveras 2024-09-17 09:49:53 +02:00 committed by Christopher Allford
parent 00dcadac4c
commit 877b2dca7a
No known key found for this signature in database
GPG Key ID: 80E44C778F08A88E
5 changed files with 33 additions and 10 deletions

View File

@ -10,6 +10,10 @@ import {
import { BlockEditProps, InnerBlockTemplate } from '@wordpress/blocks'; import { BlockEditProps, InnerBlockTemplate } from '@wordpress/blocks';
import { useEffect } from '@wordpress/element'; import { useEffect } from '@wordpress/element';
import { useSelect } from '@wordpress/data'; import { useSelect } from '@wordpress/data';
import ErrorPlaceholder, {
ErrorObject,
} from '@woocommerce/editor-components/error-placeholder';
import { __ } from '@wordpress/i18n';
/** /**
* Internal dependencies * Internal dependencies
@ -132,14 +136,16 @@ export const Edit = ( {
useEffect( () => { useEffect( () => {
const mode = getMode( currentTemplateId, templateType ); const mode = getMode( currentTemplateId, templateType );
const newProductGalleryClientId =
attributes.productGalleryClientId || clientId;
setAttributes( { setAttributes( {
...attributes, ...attributes,
mode, mode,
productGalleryClientId: clientId, productGalleryClientId: newProductGalleryClientId,
} ); } );
// Move the Thumbnails block to the correct above or below the Large Image based on the thumbnailsPosition attribute. // Move the Thumbnails block to the correct above or below the Large Image based on the thumbnailsPosition attribute.
moveInnerBlocksToPosition( attributes, clientId ); moveInnerBlocksToPosition( attributes, newProductGalleryClientId );
}, [ }, [
setAttributes, setAttributes,
attributes, attributes,
@ -148,6 +154,18 @@ export const Edit = ( {
templateType, templateType,
] ); ] );
if ( attributes.productGalleryClientId !== clientId ) {
const error = {
message: __(
'productGalleryClientId and clientId codes mismatch.',
'woocommerce'
),
type: 'general',
} as ErrorObject;
return <ErrorPlaceholder error={ error } isLoading={ false } />;
}
return ( return (
<div { ...blockProps }> <div { ...blockProps }>
<InspectorControls> <InspectorControls>

View File

@ -136,10 +136,10 @@ export const moveInnerBlocksToPosition = (
): void => { ): void => {
const { getBlock, getBlockRootClientId, getBlockIndex } = const { getBlock, getBlockRootClientId, getBlockIndex } =
select( 'core/block-editor' ); select( 'core/block-editor' );
const { moveBlockToPosition } = dispatch( 'core/block-editor' );
const productGalleryBlock = getBlock( clientId ); const productGalleryBlock = getBlock( clientId );
if ( productGalleryBlock ) { if ( productGalleryBlock?.name === 'woocommerce/product-gallery' ) {
const { moveBlockToPosition } = dispatch( 'core/block-editor' );
const previousLayout = productGalleryBlock.innerBlocks.length const previousLayout = productGalleryBlock.innerBlocks.length
? productGalleryBlock.innerBlocks[ 0 ].attributes.layout ? productGalleryBlock.innerBlocks[ 0 ].attributes.layout
: null; : null;

View File

@ -0,0 +1,4 @@
Significance: patch
Type: fix
Fix error when adding the Product Gallery (Beta) block into a pattern

View File

@ -110,11 +110,14 @@ class ProductGallery extends AbstractBlock {
* @return string Rendered block type output. * @return string Rendered block type output.
*/ */
protected function render( $attributes, $content, $block ) { protected function render( $attributes, $content, $block ) {
$post_id = $block->context['postId'] ?? ''; $post_id = $block->context['postId'] ?? '';
$product = wc_get_product( $post_id );
if ( ! $product instanceof \WC_Product ) {
return '';
}
$product_gallery_images = ProductGalleryUtils::get_product_gallery_images( $post_id, 'thumbnail', array() ); $product_gallery_images = ProductGalleryUtils::get_product_gallery_images( $post_id, 'thumbnail', array() );
$classname_single_image = ''; $classname_single_image = '';
// This is a temporary solution. We have to refactor this code when the block will have to be addable on every page/post https://github.com/woocommerce/woocommerce-blocks/issues/10882.
global $product;
if ( count( $product_gallery_images ) < 2 ) { if ( count( $product_gallery_images ) < 2 ) {
// The gallery consists of a single image. // The gallery consists of a single image.
@ -124,8 +127,6 @@ class ProductGallery extends AbstractBlock {
$number_of_thumbnails = $block->attributes['thumbnailsNumberOfThumbnails'] ?? 0; $number_of_thumbnails = $block->attributes['thumbnailsNumberOfThumbnails'] ?? 0;
$classname = $attributes['className'] ?? ''; $classname = $attributes['className'] ?? '';
$dialog = isset( $attributes['mode'] ) && 'full' !== $attributes['mode'] ? $this->render_dialog() : ''; $dialog = isset( $attributes['mode'] ) && 'full' !== $attributes['mode'] ? $this->render_dialog() : '';
$post_id = $block->context['postId'] ?? '';
$product = wc_get_product( $post_id );
$product_gallery_first_image = ProductGalleryUtils::get_product_gallery_image_ids( $product, 1 ); $product_gallery_first_image = ProductGalleryUtils::get_product_gallery_image_ids( $product, 1 );
$product_gallery_first_image_id = reset( $product_gallery_first_image ); $product_gallery_first_image_id = reset( $product_gallery_first_image );
$product_id = strval( $product->get_id() ); $product_id = strval( $product->get_id() );

View File

@ -26,7 +26,7 @@ class ProductGalleryUtils {
$product_gallery_images = array(); $product_gallery_images = array();
$product = wc_get_product( $post_id ); $product = wc_get_product( $post_id );
if ( $product ) { if ( $product instanceof \WC_Product ) {
$all_product_gallery_image_ids = self::get_product_gallery_image_ids( $product ); $all_product_gallery_image_ids = self::get_product_gallery_image_ids( $product );
if ( 'full' === $size || 'full' !== $size && count( $all_product_gallery_image_ids ) > 1 ) { if ( 'full' === $size || 'full' !== $size && count( $all_product_gallery_image_ids ) > 1 ) {