Make WordPress Core


Ignore:
Timestamp:
09/19/2023 12:34:50 PM (5 months 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.