Make WordPress Core


Ignore:
Timestamp:
09/19/2023 12:34:50 PM (3 years ago)
Author:
Bernhard Reiter
Message:

Blocks: Implement block insertion functions.

For #59313, we need to implement functions to insert a given parsed block into another parsed block's inner blocks, and to prepend and append to that array, respectively.

We will use those functions in combination with traverse_and_serialize_blocks (see #59327) to implement automatic insertion of hooked blocks into block templates and patterns.

Props gziolo.
Fixes #59385.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tests/phpunit/tests/blocks/blockHooks.php

    r56610 r56618  
    1818         */
    1919        public function tear_down() {
    20                 $registry = WP_Block_Type_Registry::get_instance();
    21 
    22                 foreach ( array( 'tests/my-block', 'tests/my-container-block' ) as $block_name ) {
     20                $registry    = WP_Block_Type_Registry::get_instance();
     21                $block_names = array(
     22                        'tests/injected-one',
     23                        'tests/injected-two',
     24                );
     25                foreach ( $block_names as $block_name ) {
    2326                        if ( $registry->is_registered( $block_name ) ) {
    2427                                $registry->unregister( $block_name );
     
    98101                );
    99102        }
     103
     104        /**
     105         * @ticket 59385
     106         *
     107         * @covers ::insert_inner_block
     108         *
     109         * @dataProvider data_insert_inner_block
     110         *
     111         * @param string $block_index     Block index to insert the block at.
     112         * @param string $expected_markup Expected markup after the block is inserted.
     113         */
     114        public function test_insert_inner_block( $block_index, $expected_markup ) {
     115                $original_markup = <<<HTML
     116<!-- wp:tests/group {"layout":{"type":"constrained"}} -->
     117        <div class="wp-block-group">
     118                <!-- wp:paragraph -->
     119                        <p>Foo</p>
     120                <!-- /wp:paragraph -->
     121        </div>
     122<!-- /wp:tests/group -->
     123HTML;
     124
     125                $inserted_block = array(
     126                        'blockName'    => 'tests/hooked-block',
     127                        'attrs'        => array(),
     128                        'innerBlocks'  => array(),
     129                        'innerHTML'    => '',
     130                        'innerContent' => array(),
     131                );
     132
     133                $expected = parse_blocks( $expected_markup )[0];
     134                $block    = parse_blocks( $original_markup )[0];
     135                insert_inner_block( $block, $block_index, 1, $inserted_block );
     136                $this->assertSame( $expected, $block );
     137        }
     138
     139        /**
     140         * Data provider.
     141         *
     142         * @return array[]
     143         */
     144        public function data_insert_inner_block() {
     145                $expected_before_markup = <<<HTML
     146<!-- wp:tests/group {"layout":{"type":"constrained"}} -->
     147        <div class="wp-block-group">
     148                <!-- wp:tests/hooked-block /--><!-- wp:paragraph -->
     149                        <p>Foo</p>
     150                <!-- /wp:paragraph -->
     151        </div>
     152<!-- /wp:tests/group -->
     153HTML;
     154
     155                $expected_after_markup = <<<HTML
     156<!-- wp:tests/group {"layout":{"type":"constrained"}} -->
     157        <div class="wp-block-group">
     158                <!-- wp:paragraph -->
     159                        <p>Foo</p>
     160                <!-- /wp:paragraph --><!-- wp:tests/hooked-block /-->
     161        </div>
     162<!-- /wp:tests/group -->
     163HTML;
     164
     165                return array(
     166                        'insert before given block' => array(
     167                                'block_index'     => 0,
     168                                'expected_markup' => $expected_before_markup,
     169                        ),
     170                        'insert after given block'  => array(
     171                                'block_index'     => 1,
     172                                'expected_markup' => $expected_after_markup,
     173                        ),
     174                );
     175        }
     176
     177        /**
     178         * @ticket 59385
     179         *
     180         * @covers ::prepend_inner_block
     181         */
     182        public function test_prepend_inner_block() {
     183                $original_markup = <<<HTML
     184<!-- wp:tests/group {"layout":{"type":"constrained"}} -->
     185        <div class="wp-block-group">
     186                <!-- wp:paragraph -->
     187                        <p>Foo</p>
     188                <!-- /wp:paragraph -->
     189        </div>
     190<!-- /wp:tests/group -->
     191HTML;
     192
     193                $inserted_block = array(
     194                        'blockName'    => 'tests/hooked-block',
     195                        'attrs'        => array(),
     196                        'innerBlocks'  => array(),
     197                        'innerHTML'    => '',
     198                        'innerContent' => array(),
     199                );
     200
     201                $expected_markup = <<<HTML
     202<!-- wp:tests/group {"layout":{"type":"constrained"}} -->
     203        <div class="wp-block-group">
     204                <!-- wp:tests/hooked-block /--><!-- wp:paragraph -->
     205                        <p>Foo</p>
     206                <!-- /wp:paragraph -->
     207        </div>
     208<!-- /wp:tests/group -->
     209HTML;
     210
     211                $expected = parse_blocks( $expected_markup )[0];
     212                $block    = parse_blocks( $original_markup )[0];
     213                prepend_inner_block( $block, $inserted_block );
     214                $this->assertSame( $expected, $block );
     215        }
     216
     217        /**
     218         * @ticket 59385
     219         *
     220         * @covers ::append_inner_block
     221         */
     222        public function test_append_inner_block() {
     223                $original_markup = <<<HTML
     224<!-- wp:tests/group {"layout":{"type":"constrained"}} -->
     225        <div class="wp-block-group">
     226                <!-- wp:paragraph -->
     227                        <p>Foo</p>
     228                <!-- /wp:paragraph -->
     229        </div>
     230<!-- /wp:tests/group -->
     231HTML;
     232
     233                $inserted_block = array(
     234                        'blockName'    => 'tests/hooked-block',
     235                        'attrs'        => array(),
     236                        'innerBlocks'  => array(),
     237                        'innerHTML'    => '',
     238                        'innerContent' => array(),
     239                );
     240
     241                $expected_markup = <<<HTML
     242<!-- wp:tests/group {"layout":{"type":"constrained"}} -->
     243        <div class="wp-block-group">
     244                <!-- wp:paragraph -->
     245                        <p>Foo</p>
     246                <!-- /wp:paragraph --><!-- wp:tests/hooked-block /-->
     247        </div>
     248<!-- /wp:tests/group -->
     249HTML;
     250
     251                $expected = parse_blocks( $expected_markup )[0];
     252                $block    = parse_blocks( $original_markup )[0];
     253                append_inner_block( $block, $inserted_block );
     254                $this->assertSame( $expected, $block );
     255        }
    100256}
Note: See TracChangeset for help on using the changeset viewer.