{"id":233523,"date":"2023-02-15T17:07:00","date_gmt":"2023-02-15T14:07:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233523"},"modified":"2023-02-26T12:09:25","modified_gmt":"2023-02-26T09:09:25","slug":"criar-bloco-gutenberg-personalizado-parte-5-configuracoes-do-inspetor","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/criar-bloco-gutenberg-personalizado-parte-5-configuracoes-do-inspetor\/","title":{"rendered":"Criar Bloco Gutenberg Personalizado &#8211; Parte 5: Configura\u00e7\u00f5es do Inspetor"},"content":{"rendered":"\n<p>Nas etapas anteriores, aprendemos o b\u00e1sico de como renderizar componentes e atributos em um bloco. Nesta etapa, vamos nos concentrar no que o WordPress (pelo menos em c\u00f3digo) chama de Inspetor: a barra lateral do lado direito do editor. Abordaremos alguns novos componentes que fazem sentido colocar na barra lateral e como lidar com eles.<\/p>\n<h2>Inspetor\/componente da barra lateral<\/h2>\n<p>Para inserir suas configura\u00e7\u00f5es personalizadas e HTML na barra lateral do Inspetor, voc\u00ea envolver\u00e1 tudo dentro de um componente chamado <code>InspectorControls<\/code>. Tudo o que voc\u00ea colocar dentro deste componente ser\u00e1 exibido na barra lateral e n\u00e3o dentro do pr\u00f3prio bloco\/editor. Voc\u00ea basicamente pode colocar o componente e seu conte\u00fado em todos os lugares no retorno da <code>edit<\/code>fun\u00e7\u00e3o.<\/p>\n<p>Al\u00e9m disso, voc\u00ea lidaria com as configura\u00e7\u00f5es dentro da barra lateral como elas estavam dentro do bloco. Cada configura\u00e7\u00e3o requer um atributo e voc\u00ea carrega e atualiza os atributos da mesma maneira.<\/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=\"Criar Bloco Gutenberg Personalizado - Parte 5: Configura\u00e7\u00f5es do Inspetor\"><\/a><\/p>\n<p>Vamos primeiro dar uma olhada r\u00e1pida em como a barra lateral do nosso bloco se parece (quando nosso bloco est\u00e1 ativo no editor), com base no c\u00f3digo que acabamos na etapa anterior.<\/p>\n<p>Todos os blocos ir\u00e3o, por padr\u00e3o, mostrar o \u00edcone, nome e descri\u00e7\u00e3o do bloco, e a se\u00e7\u00e3o Avan\u00e7ado \u2013 recolhida. Dentro do Advanced voc\u00ea encontrar\u00e1 uma entrada de texto para fornecer a classe CSS para o bloco.<\/p>\n<h2>Adicionando uma se\u00e7\u00e3o da barra lateral e algumas configura\u00e7\u00f5es<\/h2>\n<p>A barra lateral \u00e9 dividida em se\u00e7\u00f5es (referidas como pain\u00e9is no c\u00f3digo) e para um design e funcionalidade ideais (incluindo a funcionalidade de recolhimento aberto), devemos usar os componentes do WordPress para gerar pain\u00e9is corretamente.<\/p>\n<p>Use o componente <code>PanelBody<\/code>para adicionar uma se\u00e7\u00e3o (aquelas que voc\u00ea pode abrir ou recolher), encontrada no <code>wp.components<\/code>pacote. O componente aceita alguns adere\u00e7os, por exemplo, para o t\u00edtulo e se o painel deve ou n\u00e3o ser aberto ou fechado como padr\u00e3o. Voc\u00ea tamb\u00e9m pode fornecer classe personalizada, \u00edcone e anexar uma fun\u00e7\u00e3o de evento ao gatilho abrir-fechar.<\/p>\n<p>Dentro <code>PanelBody<\/code>do WordPress, recomenda-se usar o <code>PanelRow<\/code>componente que atua como cont\u00eaineres gen\u00e9ricos dentro do painel \u2013 para garantir a racionaliza\u00e7\u00e3o do design. Este componente aplica automaticamente alguns estilos de margem e linha flex\u00edvel para o seu conte\u00fado. Por causa do <code>flex-direction: row<\/code>estilo &quot; &quot; voc\u00ea deve envolver cada configura\u00e7\u00e3o dentro de um <code>PanelRow<\/code>. Ou voc\u00ea pode ignor\u00e1-lo completamente e assumir a responsabilidade de estiliz\u00e1-lo voc\u00ea mesmo com divs e tal.<\/p>\n<h3>Adicionando um painel e configura\u00e7\u00f5es<\/h3>\n<p>Vamos adicionar um painel de barra lateral para o nosso bloco com algumas configura\u00e7\u00f5es dentro, s\u00f3 para ver na pr\u00e1tica. Adicionaremos um controle de altern\u00e2ncia, uma entrada de sele\u00e7\u00e3o, um seletor de cores e uma caixa de sele\u00e7\u00e3o \u2013 apenas para obter alguma experi\u00eancia com diferentes tipos de componentes de entrada. Deixei o conte\u00fado do bloco (com os dois <code>RichText<\/code>s) e a <code>save<\/code>fun\u00e7\u00e3o como antes.<\/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>Como sempre, come\u00e7amos desestruturando os componentes e fun\u00e7\u00f5es que queremos usar. No <code>attributes<\/code>interior <code>registerBlockType()<\/code>, definimos um atributo por entrada e correspondemos ao tipo &#8211; por exemplo, o controle de altern\u00e2ncia espera um booleano e, como os valores do menu suspenso s\u00e3o strings, esse atributo tamb\u00e9m deve ser um tipo string.<\/p>\n<p>Na linha <code>#41<\/code>iniciamos o <code>InspectorControls<\/code>componente, e tudo a partir desse ponto at\u00e9 a linha <code>#80<\/code>aparecer\u00e1 na barra lateral. O resto aparecer\u00e1 dentro do pr\u00f3prio editor, e n\u00e3o fiz nenhuma altera\u00e7\u00e3o l\u00e1.<\/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=\"Criar Bloco Gutenberg Personalizado - Parte 5: Configura\u00e7\u00f5es do Inspetor\"><\/a><\/p>\n<p>Dentro, primeiro criamos um painel com <code>PanelBody<\/code>e com o prop <code>initialOpen<\/code>definido como true, dizemos ao Gutenberg que este painel deve ser aberto por padr\u00e3o. E ent\u00e3o cabe a n\u00f3s o que adicionar dentro de cada arquivo <code>PanelRow<\/code>.<\/p>\n<p>Para o componente <code>ToggleControl<\/code>, usamos as mesmas props que fizemos antes com entradas de texto, exceto que, em vez da prop <code>value<\/code>, fornecemos o valor do atributo dentro da prop <code>checked<\/code>. Isso se aplica a qualquer entrada que espere um atributo marcado em HTML simples, por exemplo, caixas de sele\u00e7\u00e3o. Para bot\u00f5es de op\u00e7\u00e3o, voc\u00ea usaria o prop <code>selected<\/code>, pois isso \u00e9 o que voc\u00ea usaria em HTML simples tamb\u00e9m. Tenha em mente que o atributo para esta entrada deve ser do tipo <code>boolean<\/code>.<\/p>\n<p>Quanto <code>CheckboxControl<\/code>ao manuseio de uma caixa de sele\u00e7\u00e3o singular, funciona exatamente da mesma forma que <code>ToggleControl<\/code>&#8211; retorna um booleano, esteja ou n\u00e3o marcado.<\/p>\n<p>O <code>SelectControl<\/code>gera uma lista suspensa de sele\u00e7\u00e3o e espera as op\u00e7\u00f5es poss\u00edveis como uma matriz no prop <code>options<\/code>. Cada elemento deve ser um objeto com as propriedades <code>label<\/code>e <code>value<\/code>. O mesmo se aplica a caixas de sele\u00e7\u00e3o e bot\u00f5es de op\u00e7\u00e3o (<code>RadioControl<\/code>). Em circunst\u00e2ncias normais, voc\u00ea provavelmente geraria as op\u00e7\u00f5es como uma vari\u00e1vel fora da sa\u00edda HTML.<\/p>\n<p>Voc\u00ea pode notar que <code>ColorPicker<\/code>funciona um pouco diferente dos outros, pois este \u00e9 um componente mais complexo e n\u00e3o uma entrada HTML padr\u00e3o. Forne\u00e7a o prop <code>color<\/code>para a cor salva e, em vez de <code>onChange<\/code>(dispara uma vez ao clicar, mas tamb\u00e9m toda vez que o valor \u00e9 alterado ao arrastar &#8211; o que pode resultar em muitos inc\u00eandios) use <code>onChangeComplete<\/code>. A prop retornada neste evento tamb\u00e9m \u00e9 um objeto onde precisamos decidir qual parte queremos salvar em nosso atributo. Neste exemplo queremos salvar o valor hexadecimal (sem alfa\/opacidade), ent\u00e3o dentro <code>setAttributes()<\/code>extra\u00edmos a <code>hex<\/code>propriedade do <code>color<\/code>objeto retornado. \u00c9 tamb\u00e9m por isso que adicionamos a propriedade<code>disableAlpha<\/code>como remover a interface do usu\u00e1rio do canal alfa (para controlar a opacidade), pois n\u00e3o faz sentido oferecer isso ao usu\u00e1rio quando nunca salvamos o valor da opacidade.<\/p>\n<p>Cada um dos componentes tem um <code>label<\/code>prop dispon\u00edvel, exceto o colorpicker. Se voc\u00ea quiser produzir um r\u00f3tulo ou texto antes dele, precisar\u00e1 mexer no HTML ou no estilo para garantir que fique bom.<\/p>\n<p>Obviamente, voc\u00ea pode adicionar quantos pain\u00e9is quiser, basta adicionar outro <code>PanelBody<\/code>componente ap\u00f3s o anterior.<\/p>\n<p>Se voc\u00ea estiver interessado em aprender mais sobre como adicionar configura\u00e7\u00f5es de bloco, tenho tutoriais separados para configura\u00e7\u00f5es e componentes mais complexos para o Inspector; <a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/como-adicionar-uma-selecao-de-imagem-em-seu-bloco-personalizado-wordpress-gutenberg\/\" title=\"Como adicionar uma sele\u00e7\u00e3o\">Como adicionar uma sele\u00e7\u00e3o<\/a> de imagem e <a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/como-adicionar-configuracoes-de-cores-ao-seu-bloco-gutenberg-personalizado\/\" title=\"como adicionar um painel de configura\u00e7\u00f5es de cores\">como adicionar um painel de configura\u00e7\u00f5es de cores<\/a>.<\/p>\n<h3>Manipula\u00e7\u00e3o<code>save<\/code><\/h3>\n<p>Deixei a <code>save<\/code>fun\u00e7\u00e3o como estava antes. Depende de voc\u00ea e tudo depende do que as configura\u00e7\u00f5es controlam na sa\u00edda. Voc\u00ea j\u00e1 sabe como obter os valores de cada configura\u00e7\u00e3o. Como exemplo, vamos supor que o atributo booleano <code>activateLasers<\/code>controle se um elemento HTML personalizado \u00e9 renderizado ou n\u00e3o. Se o atributo for <code>true<\/code>um div deve ser gerado, caso contr\u00e1rio n\u00e3o. Voc\u00ea pode fazer isso com o if-check tradicional ou usar o inline <code>if<\/code>e o <code>&amp;&amp;<\/code>operador do JSX. Leia mais sobre isso no <a href=\"https:\/\/reactjs.org\/docs\/conditional-rendering.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">guia do React para renderiza\u00e7\u00e3o condicional<\/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>Como usamos <code>RichText<\/code>essa sa\u00edda n\u00e3o seria vis\u00edvel no editor, mas aparecer\u00e1 no frontend.<\/p>\n<p>Voc\u00ea encontrar\u00e1 mais componentes no reposit\u00f3rio do <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\">Github<\/a>. A maioria dessas pastas deve fornecer um leia-me com alguma documenta\u00e7\u00e3o sobre como us\u00e1-lo. Eu aprendi a maior parte disso olhando neste reposit\u00f3rio e tamb\u00e9m nos principais componentes do WordPress como eles fizeram isso.<\/p>\n<p>Na <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\">pr\u00f3xima etapa da s\u00e9rie<\/a>, vamos nos concentrar em como controlar a barra de ferramentas do bloco. Aprenderemos como lidar, por exemplo, com o alinhamento de um bloco e adicionar bot\u00f5es personalizados \u00e0 barra de ferramentas.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nesta li\u00e7\u00e3o do tutorial do Gutenberg, vamos nos concentrar em como adicionar diferentes componentes ao Inspetor &#8211; a barra lateral do lado direito do 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":[898,898,722,722,837,941,941,1110,806,806,837,846,846,867,867],"tags":[1170],"class_list":["post-233523","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-guia-para-iniciantes","category-gutenberg-8","category-n-a","category-php-8","category-tutoriais","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/233523","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=233523"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/233523\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/153128"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=233523"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=233523"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=233523"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}