Gutenberg blokk saját beállításokkal JavaScriptben.

Gutenberg Blokkok Testreszabása: Hogyan Adjunk Hozzá Saját Beállításokat?

Üdv, WordPress fejlesztő társ! Ha már megismerkedtél a Gutenberg blokk szerkesztő világával, biztosan felmerült benned, hogy vannak azok a beépített blokkok, amiknek van valami egészen *csini* beállítás panelje a jobb oldalon. És te is szeretnél ilyet építeni a saját egyedi blokkjaidhoz. Nos, ez nem csak a React mágia – jó adag PHP alapozással és egy csipetnyi JavaScript finomsággal is megvalósítható. Nézzük, hogyan!

Miért Fontosak a Saját Beállítások?

Egy blokk sokkal hasznosabb és professzionálisabb, ha a felhasználó számos tulajdonságot módosíthat a kódba mártás nélkül. Elképzelhető egy “Hős szekció” blokk, ahol a háttérszínt, a címsor stílusát vagy a gomb típusát egy panelen át lehet állítani. Ez nemcsak a felhasználói élményt javítja, hanem konzisztens dizájnt is biztosít. A kulcs a register_block_type PHP függvény és a blokk attributes (tulajdonságok) szolgáltatásának ötvözése a JavaScript oldali InspectorControls komponenssel.

A Háttér: PHP Regisztráció és Attribútumok

Minden a PHP oldalon kezdődik. Amikor regisztrálod a blokkot, megadhatod az alapértelmezett attribútumokat. Ezek a változók lesznek, amiket a JavaScript kezel, és amelyek a blokk kimenetét befolyásolják.

<?php
function register_my_custom_block() {
    wp_register_script(
        'my-custom-block-editor-script',
        get_template_directory_uri() . '/blocks/my-block/editor.js',
        array('wp-blocks', 'wp-element', 'wp-editor', 'wp-components')
    );

    register_block_type('my-namespace/my-block', array(
        'editor_script' => 'my-custom-block-editor-script',
        'attributes'      => array(
            'primaryColor' => array(
                'type'    => 'string',
                'default' => '#007cba',
            ),
            'isRounded' => array(
                'type'    => 'boolean',
                'default' => false,
            ),
            'titleText' => array(
                'type'    => 'string',
                'default' => 'Üdvözöllek!',
            ),
        ),
        'render_callback' => 'render_my_custom_block',
    ));
}
add_action('init', 'register_my_custom_block');

function render_my_custom_block($attributes) {
    $classes = $attributes['isRounded'] ? 'is-rounded' : '';
    $styles  = 'background-color:' . esc_attr($attributes['primaryColor']) . ';';

    ob_start(); ?>
    <div class="my-custom-block <?php echo $classes; ?>" style="<?php echo $styles; ?>">
        <h2><?php echo esc_html($attributes['titleText']); ?></h2>
        <!-- További tartalom -->
    </div>
    <?php
    return ob_get_clean();
}
?>

Az Irányítópult: JavaScript és az InspectorControls

Itt jön a JavaScript – de ne ijedj meg, nem kell mélységekbe menni. A wp.editor.InspectorControls egy olyan komponens, ami a jobb oldali panelbe ágyazza be a vezérlőidet. Használhatsz alap HTML inputokat, de a Gutenberg @wordpress/components csomagja rengeteg kész elemet kínál (pl. TextControl, ToggleControl, ColorPalette). Egy egyszerű példa:

const { registerBlockType } = wp.blocks;
const { InspectorControls, ColorPalette } = wp.editor;
const { PanelBody, TextControl, ToggleControl } = wp.components;

registerBlockType('my-namespace/my-block', {
    title: 'Egyedi Blokkom',
    icon: 'smiley',
    category: 'design',

    attributes: {
        primaryColor: {
            type: 'string',
            default: '#007cba',
        },
        isRounded: {
            type: 'boolean',
            default: false,
        },
        titleText: {
            type: 'string',
            default: 'Üdvözöllek!',
        },
    },

    edit: function(props) {
        const { attributes, setAttributes } = props;

        function onChangePrimaryColor(newColor) {
            setAttributes({ primaryColor: newColor });
        }

        function onToggleRounded() {
            setAttributes({ isRounded: !attributes.isRounded });
        }

        function onChangeTitleText(newText) {
            setAttributes({ titleText: newText });
        }

        return [
            wp.element.createElement(
                InspectorControls,
                { key: 'inspector' },
                wp.element.createElement(
                    PanelBody,
                    { title: 'Blokk Beállítások', initialOpen: true },
                    wp.element.createElement(TextControl, {
                        label: 'Cím szövege',
                        value: attributes.titleText,
                        onChange: onChangeTitleText,
                    }),
                    wp.element.createElement(ToggleControl, {
                        label: 'Kerekített sarkok',
                        checked: attributes.isRounded,
                        onChange: onToggleRounded,
                    }),
                    wp.element.createElement('div', null, [
                        wp.element.createElement('p', null, 'Elsődleges szín'),
                        wp.element.createElement(ColorPalette, {
                            color: attributes.primaryColor,
                            onChange: onChangePrimaryColor,
                        }),
                    ])
                )
            ),
            // A blokk előnézeti tartalma a szerkesztőben
            wp.element.createElement(
                'div',
                {
                    className: 'my-custom-block-preview',
                    style: { backgroundColor: attributes.primaryColor, borderRadius: attributes.isRounded ? '10px' : '0' }
                },
                wp.element.createElement('h2', null, attributes.titleText)
            ),
        ];
    },

    save: function(props) {
        // A save függvény csak a statikus kimenetet definiálja, a renderelés a PHP render_callback-re bízándó
        return null;
    },
});

Gyakori Buktatók és Tanácsok

1. Ne felejtsd el a setAttributes-t! A vezérlők csak akkor változtatják a blokk állapotát, ha a változást expliciten beállítod. Az onChange eseménykezelőkben mindig hívd meg a setAttributes-t a frissített értékkel. 2. A PHP és JavaScript attribútumok szinkronban legyenek. A két oldalon ugyanazok a kulcsok és típusok szerepeljenek. Egy eltérés könnyen hibákhoz vezet. 3. Használd a render_callback-et a komplex kimenethez. Ahogy a fenti PHP példában is láttad, a save()-ben return null-t adtunk vissza, és a teljes renderelést a PHP render_callback-re bíztuk. Ez sokkal rugalmasabb, mert kihasználhatod a WordPress template függvényeket és a szerveroldali logikát. 4. A stílusok kezelése: A blokk stílusait célszerű külön CSS vagy SCSS fájlban kezelni. Regisztráld őket a register_block_type-nál (editor_style a szerkesztői nézethez, style a frontendhez). Ha dinamikus stílusokat (pl. a kiválasztott színt) kell beadni, a PHP render_callback-ben inline stílusként érdemes megjeleníteni, ahogy az a példában is szerepelt.

Frontend Finomhangolás: Egy Csipetnyi jQuery és SCSS

Míg a blokk magja a fenti technikákkal kész, a frontend megjelenését még finomíthatod. Például a kerekített osztály hozzáadásakor egy sima CSS átmenetet is adhatsz, ami sokkal professzionálisabb hatást kelt. Használj SCSS-t a könnyebb karbantartás érdekében.

// my-block.scss
.my-custom-block {
    padding: 2rem;
    transition: all 0.3s ease-in-out;

    &.is-rounded {
        border-radius: 10px;
    }

    h2 {
        margin-top: 0;
        color: #333;
    }
}

És ha valami interaktív elemet szeretnél a frontenden (ami nem a Gutenberghez kötődik), ott a jó öreg jQuery is bevethető – például egy sima gombklikk esemény kezelésére.

// A theme JavaScript fájljában
jQuery(document).ready(function($) {
    $('.my-custom-block .action-button').on('click', function() {
        $(this).toggleClass('active');
        // Egyedi interakció logika...
    });
});

Összegzés

Saját Gutenberg blokk beállítások létrehozása egy izgalmas egyesítése a WordPress PHP háttérének és a modern, komponens-alapú JavaScriptnek. A titok a tiszta kommunikációban rejlik a két világ között: a PHP határozza meg az attribútumok vázát és a végső kimenetet, míg a JavaScript biztosítja az intuitív szerkesztői felületet. Kezdj egyszerűvel – egy szövegmezővel és egy kapcsológombbal –, és fokozatosan építsd fel a palettádat. Így blokkjaid nemcsak funkcionálisak, hanem igazi élmény lesz velük dolgozni a szerkesztők számára is.

Ha ezt a rendszert megérted, szinte bármilyen egyedi komponenst meg tudsz valósítani, ami pontosan a projektjeid igényeit szolgálja. További kódolást! 🚀