{"id":233529,"date":"2023-02-15T17:00:00","date_gmt":"2023-02-15T14:00:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233529"},"modified":"2023-02-26T12:25:54","modified_gmt":"2023-02-26T09:25:54","slug":"crea-un-blocco-gutenberg-personalizzato-parte-5-impostazioni-dellispettore","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/crea-un-blocco-gutenberg-personalizzato-parte-5-impostazioni-dellispettore\/","title":{"rendered":"Crea un blocco Gutenberg personalizzato &#8211; Parte 5: Impostazioni dell&#8217;ispettore"},"content":{"rendered":"\n<p>Nei passaggi precedenti abbiamo appreso le nozioni di base su come eseguire il rendering di componenti e attributi in un blocco. In questo passaggio ci concentreremo su ci\u00f2 che WordPress (almeno nel codice) chiama Inspector: la barra laterale sul lato destro nell&#8217;editor. Toccheremo alcuni nuovi componenti che hanno senso posizionare nella barra laterale e come gestirli.<\/p>\n<h2>Componente Ispettore\/barra laterale<\/h2>\n<p>Per inserire le impostazioni personalizzate e l&#8217;HTML nella barra laterale di Inspector, avvolgerai tutto all&#8217;interno di un componente chiamato <code>InspectorControls<\/code>. Qualunque cosa tu metta all&#8217;interno di questo componente verr\u00e0 emessa nella barra laterale e non all&#8217;interno del blocco\/editor stesso. Puoi praticamente mettere il componente e il suo contenuto ovunque nella restituzione della <code>edit<\/code>funzione.<\/p>\n<p>A parte questo, gestiresti le impostazioni all&#8217;interno della barra laterale come se fossero all&#8217;interno del blocco. Ogni impostazione richiede un attributo e tu carichi e aggiorni gli attributi allo stesso modo.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153127-61e50856030af.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153127-61e50856030af.png\" alt=\"Crea un blocco Gutenberg personalizzato - Parte 5: Impostazioni dell&#039;ispettore\"><\/a><\/p>\n<p>Diamo prima una rapida occhiata a come appare la barra laterale del nostro blocco (quando il nostro blocco \u00e8 attivo nell&#8217;editor), in base al codice che abbiamo trovato nel passaggio precedente.<\/p>\n<p>Tutti i blocchi mostreranno per impostazione predefinita l&#8217;icona, il nome e la descrizione del blocco e la sezione Avanzate \u2013 compresso. All&#8217;interno di Advanced troverai un input di testo per fornire una classe CSS per il blocco.<\/p>\n<h2>Aggiunta di una sezione della barra laterale e di alcune impostazioni<\/h2>\n<p>La barra laterale \u00e8 suddivisa in sezioni (denominate pannelli nel codice) e per un design e una funzionalit\u00e0 ottimali (inclusa la funzionalit\u00e0 di compressione aperta) dovremmo utilizzare i componenti di WordPress per produrre correttamente i pannelli.<\/p>\n<p>Utilizza il componente <code>PanelBody<\/code>per aggiungere una sezione (quelle che puoi aprire o comprimere), che si trova nel <code>wp.components<\/code>pacchetto. Il componente accetta alcuni oggetti di scena, ad esempio per il titolo e se il pannello deve essere aperto o chiuso come predefinito. Puoi anche fornire una classe personalizzata, un&#8217;icona e allegare una funzione evento al trigger di apertura-chiusura.<\/p>\n<p>All&#8217;interno <code>PanelBody<\/code>di WordPress consiglia quindi di utilizzare il <code>PanelRow<\/code>componente che agisce come contenitori generici all&#8217;interno del pannello, per garantire la razionalizzazione del design. Questo componente applica automaticamente uno stile di margine e riga flessibile per i tuoi contenuti. A causa dello <code>flex-direction: row<\/code>stile &quot; &quot;, dovresti avvolgere ogni impostazione all&#8217;interno di uno <code>PanelRow<\/code>. Oppure puoi saltarlo del tutto e assumerti la responsabilit\u00e0 di modellarlo tu stesso con div e simili.<\/p>\n<h3>Aggiunta di un pannello e delle impostazioni<\/h3>\n<p>Aggiungiamo un pannello della barra laterale per il nostro blocco con alcune impostazioni all&#8217;interno, solo per vederlo in pratica. Aggiungeremo un controllo di attivazione\/disattivazione, un input selezionato, un colorpicker e una casella di controllo, solo per fare un po&#8217; di esperienza con diversi tipi di componenti di input. Ho lasciato il contenuto del blocco (con le due <code>RichText<\/code>s) e la <code>save<\/code>funzione proprio come prima.<\/p>\n<pre><code>const { registerBlockType } = wp.blocks;\nconst { RichText, InspectorControls } = wp.blockEditor;\nconst { ToggleControl, PanelBody, PanelRow, CheckboxControl, SelectControl, ColorPicker } = wp.components;\n\u00a0\nregisterBlockType('awp\/firstblock', {\n    title: 'My first block',\n    category: 'common',\n    icon: 'smiley',\n    description: 'Learning in progress',\n    keywords: ['example', 'test'],\n    attributes: {\n        myRichHeading: {\n            type: 'string',\n        },\n        myRichText: {\n            type: 'string',\n            source: 'html',\n            selector: 'p'\n        },\n        toggle: {\n            type: 'boolean',\n            default: true\n        },\n        favoriteAnimal: {\n            type: 'string',\n            default: 'dogs'\n        },\n        favoriteColor: {\n            type: 'string',\n            default: '#DDDDDD'\n        },\n        activateLasers: {\n            type: 'boolean',\n            default: false\n        }\n    },\n    edit: (props) =&gt; { \n        const { attributes, setAttributes } = props;\n        return (&lt;div&gt;\n                &lt;InspectorControls&gt;\n                    &lt;PanelBody\n                        title=\"Most awesome settings ever\"\n                        initialOpen={true}\n                    &gt;\n                        &lt;PanelRow&gt;\n                            &lt;ToggleControl\n                                label=\"Toggle me\"\n                                checked={attributes.toggle}\n                                onChange={(newval) =&gt; setAttributes({ toggle: newval })}\n                            \/&gt;\n                        &lt;\/PanelRow&gt;\n                        &lt;PanelRow&gt;\n                            &lt;SelectControl\n                                label=\"What's your favorite animal?\"\n                                value={attributes.favoriteAnimal}\n                                options={[\n                                    {label: \"Dogs\", value: 'dogs'},\n                                    {label: \"Cats\", value: 'cats'},\n                                    {label: \"Something else\", value: 'weird_one'},\n                                ]}\n                                onChange={(newval) =&gt; setAttributes({ favoriteAnimal: newval })}\n                            \/&gt;\n                        &lt;\/PanelRow&gt;\n                        &lt;PanelRow&gt;\n                            &lt;ColorPicker\n                                color={attributes.favoriteColor}\n                                onChangeComplete={(newval) =&gt; setAttributes({ favoriteColor: newval.hex })}\n                                disableAlpha\n                            \/&gt;\n                        &lt;\/PanelRow&gt;\n                        &lt;PanelRow&gt;\n                            &lt;CheckboxControl\n                                label=\"Activate lasers?\"\n                                checked={attributes.activateLasers}\n                                onChange={(newval) =&gt; setAttributes({ activateLasers: newval })}\n                            \/&gt;\n                        &lt;\/PanelRow&gt;\n                    &lt;\/PanelBody&gt;\n                &lt;\/InspectorControls&gt;\n                &lt;RichText \n                    tagName=\"h2\"\n                    placeholder=\"Write your heading here\"\n                    value={attributes.myRichHeading}\n                    onChange={(newtext) =&gt; setAttributes({ myRichHeading: newtext })}\n                \/&gt;\n                &lt;RichText\n                    tagName=\"p\"\n                    placeholder=\"Write your paragraph here\"\n                    value={attributes.myRichText}\n                    onChange={(newtext) =&gt; setAttributes({ myRichText: newtext })}\n                \/&gt;\n            &lt;\/div&gt;\n        );\n    },\n    save: (props) =&gt; { \n        const { attributes } = props;\n        return (&lt;div&gt;\n                &lt;RichText.Content \n                    tagName=\"h2\"\n                    value={attributes.myRichHeading}\n                \/&gt;\n                &lt;RichText.Content \n                    tagName=\"p\"\n                    value={attributes.myRichText}\n                \/&gt;\n            &lt;\/div&gt;\n        );\n    }\n});<\/code><\/pre>\n<p>Come sempre iniziamo destrutturando i componenti e la funzione che vogliamo utilizzare. All&#8217;interno definiamo un attributo per input e abbiniamo il tipo, ad esempio il controllo toggle si aspetta un valore booleano e poich\u00e9 i valori del menu a discesa sono stringhe anche quell&#8217;attributo dovrebbe essere una stringa di tipo <code>attributes<\/code>.<code>registerBlockType()<\/code><\/p>\n<p>Alla riga <code>#41<\/code>iniziamo il <code>InspectorControls<\/code>componente e tutto da quel punto fino alla riga <code>#80<\/code>apparir\u00e0 nella barra laterale. Il resto apparir\u00e0 all&#8217;interno dell&#8217;editor stesso e non ho apportato modifiche l\u00ec.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153127-61e50857e3c95.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153127-61e50857e3c95.png\" alt=\"Crea un blocco Gutenberg personalizzato - Parte 5: Impostazioni dell&#039;ispettore\"><\/a><\/p>\n<p>All&#8217;interno creiamo prima un pannello con <code>PanelBody<\/code>e con il prop <code>initialOpen<\/code>impostato su true diciamo a Gutenberg che questo pannello dovrebbe essere aperto per impostazione predefinita. E poi sta a noi cosa aggiungere all&#8217;interno di ogni <code>PanelRow<\/code>.<\/p>\n<p>Per il componente <code>ToggleControl<\/code>utilizziamo gli stessi prop come abbiamo fatto prima con gli input di testo, tranne per il fatto che al posto del prop <code>value<\/code>forniamo il valore dell&#8217;attributo all&#8217;interno del prop <code>checked<\/code>. Questo si applica a tutti gli input che si aspettano un attributo selezionato in HTML semplice, ad esempio le caselle di controllo. Per i pulsanti di opzione useresti il \u200b\u200bsupporto <code>selected<\/code>in quanto questo \u00e8 ci\u00f2 che useresti anche nel semplice HTML. Tieni presente che l&#8217;attributo per questo input deve essere di tipo <code>boolean<\/code>.<\/p>\n<p>Per quanto riguarda la <code>CheckboxControl<\/code>gestione di una casella di controllo singolare funziona esattamente come <code>ToggleControl<\/code>: restituisce un booleano indipendentemente dal fatto che sia selezionato o meno.<\/p>\n<p>Il <code>SelectControl<\/code>genera un menu a tendina select e si aspetta le possibili scelte come un array nel prop <code>options<\/code>. Ogni elemento deve essere un oggetto con le propriet\u00e0 <code>label<\/code>e <code>value<\/code>. Lo stesso vale per le caselle di controllo e i pulsanti di opzione (<code>RadioControl<\/code>). In circostanze normali probabilmente genereresti le scelte come variabile al di fuori dell&#8217;output HTML.<\/p>\n<p>Potresti notare che <code>ColorPicker<\/code>funziona in modo leggermente diverso dagli altri poich\u00e9 si tratta di un componente pi\u00f9 complesso e non di un input HTML standard. Fornisci il supporto <code>color<\/code>per il colore salvato e invece di <code>onChange<\/code>(si attiva una volta quando si fa clic ma anche ogni volta che il valore viene modificato durante il trascinamento, il che pu\u00f2 causare molti incendi) utilizzare <code>onChangeComplete<\/code>. Il prop restituito in questo evento \u00e8 anche un oggetto in cui dobbiamo decidere quale parte vogliamo salvare nel nostro attributo. In questo esempio vogliamo salvare il valore esadecimale (senza alfa\/opacit\u00e0), quindi all&#8217;interno <code>setAttributes()<\/code>estraiamo la <code>hex<\/code>propriet\u00e0 <code>color<\/code>dell&#8217;oggetto restituito. Anche per questo aggiungiamo la propriet\u00e0<code>disableAlpha<\/code>come rimuovere l&#8217;interfaccia utente del canale alfa (per controllare l&#8217;opacit\u00e0) poich\u00e9 non ha senso offrire all&#8217;utente questo quando non salviamo mai il valore di opacit\u00e0.<\/p>\n<p>Ciascuno dei componenti ha un <code>label<\/code>supporto disponibile tranne il colorpicker. Se vuoi produrre un&#8217;etichetta o un testo prima di esso, dovrai giocherellare con HTML o stile per assicurarti che abbia un bell&#8217;aspetto.<\/p>\n<p>Ovviamente puoi aggiungere tutti i pannelli che vuoi, basta aggiungere un altro <code>PanelBody<\/code>componente dopo il precedente.<\/p>\n<p>Se sei interessato a saperne di pi\u00f9 sull&#8217;aggiunta di impostazioni di blocco, ho tutorial separati per impostazioni e componenti pi\u00f9 complessi per Inspector; <a href=\"https:\/\/wordpress.mediadoma.com\/it\/come-aggiungere-unimmagine-seleziona-nel-blocco-gutenberg-di-wordpress-personalizzato\/\" title=\"Come aggiungere una selezione di immagini\">Come aggiungere una selezione di immagini<\/a> e <a href=\"https:\/\/wordpress.mediadoma.com\/it\/come-aggiungere-le-impostazioni-del-colore-al-tuo-blocco-gutenberg-personalizzato\/\" title=\"come aggiungere un pannello delle impostazioni del colore\">come aggiungere un pannello delle impostazioni del colore<\/a>.<\/p>\n<h3>Gestione<code>save<\/code><\/h3>\n<p>Ho lasciato la <code>save<\/code>funzione come era prima. Dipende da te e tutto dipende da ci\u00f2 che le impostazioni controllano nell&#8217;output. Sai gi\u00e0 come ottenere i valori di ogni impostazione. Ad esempio, supponiamo che l&#8217;attributo booleano <code>activateLasers<\/code>controlli se un elemento HTML personalizzato viene visualizzato o meno. Se l&#8217;attributo \u00e8 <code>true<\/code>un div dovrebbe essere emesso, altrimenti no. Potresti farlo con il tradizionale se-check o utilizzare l&#8217;inline <code>if<\/code>e l&#8217; <code>&amp;&amp;<\/code>operatore di JSX. Maggiori informazioni su questo nella <a href=\"https:\/\/reactjs.org\/docs\/conditional-rendering.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">guida di React per il rendering condizionale<\/a>.<\/p>\n<pre><code>save: (props) =&gt; { \n    const { attributes } = props;\n    return (&lt;div&gt;\n            &lt;RichText.Content \n                tagName=\"h2\"\n                value={attributes.myRichHeading}\n            \/&gt;\n            &lt;RichText.Content \n                tagName=\"p\"\n                value={attributes.myRichText}\n            \/&gt;\n            {attributes.activateLasers &amp;&amp; \n                &lt;div className=\"lasers\"&gt;Lasers activated&lt;\/div&gt;\n            }\n        &lt;\/div&gt;\n    );\n}<\/code><\/pre>\n<p>Poich\u00e9 utilizziamo <code>RichText<\/code>questo output non sarebbe visibile nell&#8217;editor, ma apparir\u00e0 nel frontend.<\/p>\n<p>Troverai pi\u00f9 componenti nel <code>wp.components<\/code> <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/tree\/master\/packages\/components\/src\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">repository Github<\/a>. La maggior parte di queste cartelle dovrebbe fornire un file readme con della documentazione su come utilizzarlo. Ho imparato la maggior parte di questo guardando in questo repository e anche sui componenti principali di WordPress come hanno fatto.<\/p>\n<p>Nella <a href=\"https:\/\/awhitepixel.com\/blog\/how-to-create-custom-wordpress-gutenberg-blocks-part-6-adding-toolbars\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">fase successiva della serie<\/a> ci concentreremo su come controllare la barra degli strumenti del blocco. Impareremo come gestire, ad esempio, l&#8217;allineamento di un blocco e aggiungere pulsanti personalizzati alla barra degli strumenti.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte di registrazione:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In questa lezione del tutorial di Gutenberg ci concentreremo su come aggiungere diversi componenti all&#8217;Inspector: la barra laterale sul lato destro nell&#8217;editor.<\/p>\n","protected":false},"author":1,"featured_media":153128,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[896,835,939,1110,804,720,844,865],"tags":[1168],"class_list":["post-233529","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codice","category-guida-per-principianti","category-gutenberg-6","category-n-a","category-php-6","category-sviluppatore","category-tutorial","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233529","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/comments?post=233529"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233529\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/153128"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=233529"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=233529"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=233529"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}