{"id":228498,"date":"2022-10-12T11:05:00","date_gmt":"2022-10-12T08:05:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228498"},"modified":"2022-11-09T02:43:52","modified_gmt":"2022-11-08T23:43:52","slug":"adicionar-select2-como-um-inspectorcontrol-no-wordpress-gutenberg","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/adicionar-select2-como-um-inspectorcontrol-no-wordpress-gutenberg\/","title":{"rendered":"Adicionar Select2 como um InspectorControl no WordPress Gutenberg"},"content":{"rendered":"\n<p>Para um projeto em que eu estava trabalhando, eu queria usar Select2 como um Gutenberg <code>InpectorControl<\/code>para me permitir aplicar configura\u00e7\u00f5es a um bloco. Este tutorial tamb\u00e9m fornecer\u00e1 a base necess\u00e1ria para obter qualquer componente React de terceiros no WordPress Gutenberg Editor.<\/p>\n<p>Select2 \u00e9 um substituto super pr\u00e1tico para caixas de sele\u00e7\u00e3o em seu site. Em particular, tem \u00f3timas op\u00e7\u00f5es para selecionar v\u00e1rios itens.<\/p>\n<p>O produto final, Select2 no WordPress Gutenberg InspectorControls<\/p>\n<p>A boa not\u00edcia \u00e9 que eu n\u00e3o precisei construir um componente React para colocar Select2 em Gutenberg, o <a href=\"https:\/\/github.com\/JedWatson\/react-select\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\"><code>react-select<\/code>componente de Jed Watson<\/a>, j\u00e1 faz um \u00f3timo trabalho nisso, por\u00e9m fazer com que ele funcione bem com Gutenberg n\u00e3o foi t\u00e3o f\u00e1cil quanto apenas seguir As instru\u00e7\u00f5es.<\/p>\n<p>Antes de mais nada, precis\u00e1vamos instalar o componente em nossa compila\u00e7\u00e3o. Como isso estava no npm, era t\u00e3o simples quanto inserir o seguinte em nosso terminal:<\/p>\n<h2>Obtendo Select2 em um bloco Gutenberg<\/h2>\n<p>Usando <a href=\"https:\/\/github.com\/zgordon\/gutenberg-course\/blob\/master\/blocks\/06-inspector-controls\/index.js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Zac Gordons Gutenberg Course Git repo<\/a> (parte do <a href=\"https:\/\/javascriptforwp.com\/courses\/gutenburg-development\/ref\/648\/?campaign=GutenbergDevelopment\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">fant\u00e1stico curso de desenvolvimento Gutenberg de Zac Gordons<\/a>) como base para o meu plugin (em particular o <code>InspectorControls<\/code>exemplo), para usar <code>react-select<\/code>eu precisava adicionar os seguintes includes no topo do meu arquivo:<\/p>\n<pre><code>import React from 'react';\nimport Select from 'react-select';\n<\/code><\/pre>\n<p>Oh n\u00e3o! Compilar isso nos d\u00e1 um erro:<\/p>\n<blockquote>\n<p>M\u00f3dulo n\u00e3o encontrado: Erro: N\u00e3o \u00e9 poss\u00edvel resolver &#8216;reagir&#8217;<\/p>\n<\/blockquote>\n<p>N\u00e3o tenha medo, este \u00f3timo artigo sobre <a href=\"https:\/\/www.cssigniter.com\/how-to-use-external-react-components-in-your-gutenberg-blocks\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">&#8220;Como usar componentes externos do React em seus blocos Gutenberg&quot; do CSS Igniter<\/a> veio em socorro, tudo o que precisamos fazer \u00e9 registrar <code>externals<\/code>em nosso <code>webpack.config.js<\/code>arquivo:<\/p>\n<pre><code>externals: {\n    'react': 'React',\n    'react-dom': 'ReactDOM',\n}\n<\/code><\/pre>\n<p>Igual a:<\/p>\n<pre><code>module.exports = {\n    entry: {\n        '.\/assets\/js\/editor': '.\/blocks\/index.js',\n        '.\/assets\/js\/script': '.\/blocks\/script.js',\n    },\n    output: {\n        path: path.resolve( __dirname ),\n        filename: '[name].js',\n    },\n    externals: {\n        'react': 'React',\n        'react-dom': 'ReactDOM',\n    }\n...\n<\/code><\/pre>\n<h2>Registrando o InspectorControls<\/h2>\n<p>Dentro do rolo do painel do seu <code>&lt;InspectorControls&gt;<\/code>componente, voc\u00ea precisar\u00e1 adicionar o seguinte:<\/p>\n<pre><code>&lt;Select\n    name='select-two'\n    value={ JSON.parse( selectedOption) }\n    onChange={ handleSelectChange }\n    options={[\n        { value: 'health', label: 'Health' },\n        { value: 'wealth', label: 'Wealth' },\n        { value: 'code', label: 'Code' },\n    ]}\n    isMulti='true'\n    \/&gt;\n<\/code><\/pre>\n<p>Ainda n\u00e3o terminamos, pois tamb\u00e9m precisaremos registrar o <code>selectedOption<\/code>atributo e a <code>handleSelectChange<\/code>fun\u00e7\u00e3o. Podemos fazer assim:<\/p>\n<pre><code>attributes: {\n    selectedOption: {\n        type: 'string',\n        default: null,\n    }\n},\n<\/code><\/pre>\n<p>\u2026e agora para a fun\u00e7\u00e3o\u2026<\/p>\n<pre><code>const handleSelectChange = (selectedOption) =&gt; setAttributes( { selectedOption: JSON.stringify( selectedOption) } );\n<\/code><\/pre>\n<p>Espere, por que precisamos <code>JSON.stringify()<\/code>e <code>JSON.parse()<\/code>os valores? Bem, porque o valor que o <code>react-select<\/code>componente aceita \u00e9 um array, e como o Gutenberg n\u00e3o nos deixa salvar esse valor como um array, essa \u00e9 uma solu\u00e7\u00e3o que podemos usar.<\/p>\n<h2>Juntar as pe\u00e7as<\/h2>\n<p>Nossa <code>InspectorControls<\/code>\u00e1rea completa agora deve ficar assim:<\/p>\n<pre><code>...\nattributes: {\n    selectedOption: {\n        type: 'string',\n        default: null,\n    }\n},\nedit: props =&gt; {\n    const { attributes: { selectedOption }, className, setAttributes } = props;\n    const handleSelectChange = (selectedOption) =&gt; setAttributes( { selectedOption: JSON.stringify( selectedOption) } );\n    return [\n        &lt;InspectorControls&gt;\n            &lt;PanelBody\n                title={ __( 'Select2', 'text-domain') }\n            &gt;\n                &lt;PanelRow&gt;\n                    &lt;Select\n                        name='select-two'\n                        value={ JSON.parse( selectedOption) }\n                        onChange={ handleSelectChange }\n                        options={[\n                            { value: 'health', label: 'Health' },\n                            { value: 'wealth', label: 'Wealth' },\n                            { value: 'code', label: 'Code' },\n                        ]}\n            isMulti='true'\n                        \/&gt;\n                 &lt;\/PanelRow&gt;\n             &lt;\/PanelBody&gt;\n         &lt;\/InspectorControls&gt;,\n...\n<\/code><\/pre>\n<h2>Olhando bem em Gutenberg<\/h2>\n<p>Como voc\u00ea pode ver pela captura de tela, funciona muito bem:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169504-61e816febb7e8.png\" alt=\"Adicionar Select2 como um InspectorControl no WordPress Gutenberg\" \/>Select2 como um Gutenberg InspectorControl<\/p>\n<h2>Levando mais longe<\/h2>\n<p>Usei este Inspector Control no meu plugin Secure Blocks for Gutenberg, descubra como preenchi o controle Select2 com <a href=\"https:\/\/wholesomecode.ltd\/articles\/working-with-gutenberg-and-the-wordpress-rest-api\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dados din\u00e2micos da API REST do WordPress<\/a>.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/wholesomecode.ltd\" class=\"external external_icon\">wholesomecode.ltd<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Para um projeto em que eu estava trabalhando, eu queria usar Select2 como um Gutenberg InpectorControl para me permitir aplicar configura\u00e7\u00f5es a um bloco. Este tutorial tamb\u00e9m lhe dar\u00e1 a base que voc\u00ea precisa &#8230;<\/p>\n","protected":false},"author":1,"featured_media":224196,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,722,846],"tags":[1170],"class_list":["post-228498","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-tutoriais","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/228498","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=228498"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/228498\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/224196"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=228498"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=228498"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=228498"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}