{"id":233481,"date":"2023-02-15T17:29:00","date_gmt":"2023-02-15T14:29:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233481"},"modified":"2023-02-26T12:28:17","modified_gmt":"2023-02-26T09:28:17","slug":"crear-bloque-de-gutenberg-personalizado-parte-5-configuracion-del-inspector","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/crear-bloque-de-gutenberg-personalizado-parte-5-configuracion-del-inspector\/","title":{"rendered":"Crear bloque de Gutenberg personalizado &#8211; Parte 5: Configuraci\u00f3n del inspector"},"content":{"rendered":"\n<p>En los pasos anteriores, aprendimos los conceptos b\u00e1sicos de c\u00f3mo representar componentes y atributos en un bloque. En este paso nos centraremos en lo que WordPress (al menos en el c\u00f3digo) llama Inspector: la barra lateral en el lado derecho del editor. Hablaremos sobre algunos componentes nuevos que tiene sentido colocar en la barra lateral y c\u00f3mo manejarlos.<\/p>\n<h2>Inspector\/componente de barra lateral<\/h2>\n<p>Para insertar su configuraci\u00f3n personalizada y HTML en la barra lateral del Inspector, envolver\u00e1 todo dentro de un componente llamado <code>InspectorControls<\/code>. Lo que ponga dentro de este componente se mostrar\u00e1 en la barra lateral y no dentro del bloque\/editor en s\u00ed. B\u00e1sicamente, puede colocar el componente y su contenido en todas partes en el retorno de la <code>edit<\/code>funci\u00f3n.<\/p>\n<p>Aparte de eso, manejar\u00edas la configuraci\u00f3n dentro de la barra lateral como si estuviera dentro del bloque. Cada configuraci\u00f3n requiere un atributo, y carga y actualiza los atributos de la misma manera.<\/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=\"Crear bloque de Gutenberg personalizado - Parte 5: Configuraci\u00f3n del inspector\"><\/a><\/p>\n<p>Primero echemos un vistazo r\u00e1pido a c\u00f3mo se ve la barra lateral de nuestro bloque (cuando nuestro bloque est\u00e1 activo en el editor), seg\u00fan el c\u00f3digo que terminamos en el paso anterior.<\/p>\n<p>Todos los bloques mostrar\u00e1n de forma predeterminada el icono, el nombre y la descripci\u00f3n del bloque, y la secci\u00f3n Avanzado: colapsado. Dentro de Avanzado encontrar\u00e1 una entrada de texto para proporcionar la clase CSS para el bloque.<\/p>\n<h2>Agregar una secci\u00f3n de barra lateral y algunas configuraciones<\/h2>\n<p>La barra lateral est\u00e1 dividida en secciones (denominadas paneles en el c\u00f3digo), y para un dise\u00f1o y una funcionalidad \u00f3ptimos (incluida la funcionalidad de apertura y contracci\u00f3n) debemos usar los componentes de WordPress para generar paneles correctamente.<\/p>\n<p>Use el componente <code>PanelBody<\/code>para agregar una secci\u00f3n (las que puede abrir o contraer), que se encuentra en el <code>wp.components<\/code>paquete. El componente acepta algunos accesorios, por ejemplo, para el t\u00edtulo y si el panel debe estar abierto o cerrado de forma predeterminada. Tambi\u00e9n puede proporcionar una clase personalizada, un icono y adjuntar una funci\u00f3n de evento al activador de apertura y cierre.<\/p>\n<p>Dentro <code>PanelBody<\/code>de WordPress se recomienda usar el <code>PanelRow<\/code>componente que act\u00faa como contenedores gen\u00e9ricos dentro del panel, para garantizar la optimizaci\u00f3n del dise\u00f1o. Este componente aplica autom\u00e1ticamente un margen y un estilo de fila flexible para su contenido. Debido al <code>flex-direction: row<\/code>estilo &quot; &quot;, debe envolver cada configuraci\u00f3n dentro de una <code>PanelRow<\/code>. O puede omitirlo por completo y asumir la responsabilidad de dise\u00f1arlo usted mismo con divs y dem\u00e1s.<\/p>\n<h3>Agregar un panel y configuraciones<\/h3>\n<p>Agreguemos un panel de barra lateral para nuestro bloque con algunas configuraciones adentro, solo para verlo en la pr\u00e1ctica. Agregaremos un control de alternar, una entrada de selecci\u00f3n, un selector de color y una casilla de verificaci\u00f3n, solo para obtener algo de experiencia con diferentes tipos de componentes de entrada. He dejado el contenido del bloque (con las dos <code>RichText<\/code>s) y la <code>save<\/code>funci\u00f3n 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 siempre, empezamos por desestructurar los componentes y la funci\u00f3n que queremos usar. En el <code>attributes<\/code>interior <code>registerBlockType()<\/code>, definimos un atributo por entrada y hacemos coincidir el tipo; por ejemplo, el control de alternar espera un booleano y, debido a que los valores del men\u00fa desplegable son cadenas, ese atributo tambi\u00e9n debe ser una cadena de tipo.<\/p>\n<p>En l\u00ednea <code>#41<\/code>comenzamos el <code>InspectorControls<\/code>componente, y todo desde ese punto hasta l\u00ednea <code>#80<\/code>aparecer\u00e1 en la barra lateral. El resto aparecer\u00e1 dentro del propio editor, y no he realizado ning\u00fan cambio all\u00ed.<\/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=\"Crear bloque de Gutenberg personalizado - Parte 5: Configuraci\u00f3n del inspector\"><\/a><\/p>\n<p>En el interior, primero creamos un panel con <code>PanelBody<\/code>y con el accesorio <code>initialOpen<\/code>establecido en verdadero, le decimos a Gutenberg que este panel debe abrirse de forma predeterminada. Y luego depende de nosotros qu\u00e9 agregar dentro de cada uno <code>PanelRow<\/code>.<\/p>\n<p>Para el componente <code>ToggleControl<\/code>, usamos los mismos accesorios que hemos hecho antes con las entradas de texto, excepto que en lugar del accesorio <code>value<\/code>, proporcionamos el valor del atributo dentro del accesorio <code>checked<\/code>. Esto se aplica a cualquier entrada que espera un atributo marcado en HTML sin formato, por ejemplo, casillas de verificaci\u00f3n. Para los botones de radio, usar\u00eda el accesorio, <code>selected<\/code>ya que esto es lo que usar\u00eda tambi\u00e9n en HTML sin formato. Tenga en cuenta que el atributo de esta entrada debe ser de tipo <code>boolean<\/code>.<\/p>\n<p>En cuanto <code>CheckboxControl<\/code>al manejo de una casilla de verificaci\u00f3n singular, funciona exactamente igual que <code>ToggleControl<\/code>: devuelve un valor booleano, ya sea que est\u00e9 marcada o no.<\/p>\n<p>Genera un men\u00fa desplegable de selecci\u00f3n y espera las <code>SelectControl<\/code>posibles opciones como una matriz en el prop <code>options<\/code>. Cada elemento debe ser un objeto con las propiedades <code>label<\/code>y <code>value<\/code>. Lo mismo se aplica a las casillas de verificaci\u00f3n y los botones de opci\u00f3n (<code>RadioControl<\/code>). En circunstancias normales, probablemente generar\u00eda las opciones como una variable fuera de la salida HTML.<\/p>\n<p>Puede notar que <code>ColorPicker<\/code>funciona un poco diferente a los dem\u00e1s, ya que este es un componente m\u00e1s complejo y no una entrada HTML est\u00e1ndar. Proporcione el accesorio <code>color<\/code>para el color guardado, y en lugar de <code>onChange<\/code>(se dispara una vez al hacer clic, pero tambi\u00e9n cada vez que se cambia el valor mientras se arrastra, lo que puede resultar en muchos incendios) use <code>onChangeComplete<\/code>. El accesorio devuelto en este evento tambi\u00e9n es un objeto en el que debemos decidir qu\u00e9 parte queremos guardar en nuestro atributo. En este ejemplo, queremos guardar el valor hexadecimal (sin alfa\/opacidad), por lo que dentro <code>setAttributes()<\/code>extraemos la <code>hex<\/code>propiedad del <code>color<\/code>objeto devuelto. Esta es tambi\u00e9n la raz\u00f3n por la que agregamos la propiedad<code>disableAlpha<\/code>como para eliminar la interfaz de usuario del canal alfa (para controlar la opacidad), ya que no tiene sentido ofrecer esto al usuario cuando nunca guardamos el valor de opacidad.<\/p>\n<p>Cada uno de los componentes tiene un <code>label<\/code>accesorio disponible, excepto el selector de color. Si desea generar una etiqueta o texto antes, deber\u00e1 jugar con HTML o estilo para asegurarse de que se vea bien.<\/p>\n<p>Obviamente, puede agregar tantos paneles como desee, simplemente agregue otro <code>PanelBody<\/code>componente despu\u00e9s del anterior.<\/p>\n<p>Si est\u00e1 interesado en obtener m\u00e1s informaci\u00f3n sobre c\u00f3mo agregar configuraciones de bloque, tengo tutoriales separados para configuraciones y componentes m\u00e1s complejos para Inspector; <a href=\"https:\/\/wordpress.mediadoma.com\/es\/como-agregar-una-seleccion-de-imagen-en-su-bloque-gutenberg-personalizado-de-wordpress\/\" title=\"C\u00f3mo agregar una selecci\u00f3n\">C\u00f3mo agregar una selecci\u00f3n<\/a> de imagen y <a href=\"https:\/\/wordpress.mediadoma.com\/es\/como-agregar-configuraciones-de-color-a-su-bloque-de-gutenberg-personalizado\/\" title=\"c\u00f3mo agregar un panel de configuraci\u00f3n de color\">c\u00f3mo agregar un panel de configuraci\u00f3n de color<\/a>.<\/p>\n<h3>Manejo<code>save<\/code><\/h3>\n<p>He dejado la <code>save<\/code>funci\u00f3n como estaba antes. Depende de usted y todo depende de lo que controle la configuraci\u00f3n en la salida. Ya sabes c\u00f3mo obtener los valores de cada ajuste. Como ejemplo, supongamos que el atributo booleano <code>activateLasers<\/code>controla si se representa o no un elemento HTML personalizado. Si el atributo es <code>true<\/code>un div, debe generarse, de lo contrario, no. Puede hacerlo con el tradicional if-check o usar el operador <code>if<\/code>y en l\u00ednea de JSX. <code>&amp;&amp;<\/code>Lea m\u00e1s sobre esto en <a href=\"https:\/\/reactjs.org\/docs\/conditional-rendering.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la gu\u00eda de React para renderizado 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>Debido a que usamos <code>RichText<\/code>esta salida, no ser\u00eda visible en el editor, pero aparecer\u00e1 en la interfaz.<\/p>\n<p>Encontrar\u00e1 m\u00e1s componentes en el repositorio de <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>. La mayor\u00eda de estas carpetas deber\u00edan proporcionarle un archivo L\u00e9ame con alguna documentaci\u00f3n sobre c\u00f3mo usarlo. Aprend\u00ed la mayor parte de esto mirando en este repositorio y tambi\u00e9n en los componentes principales de WordPress c\u00f3mo lo hicieron.<\/p>\n<p>En el <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\">siguiente paso de la serie<\/a>, nos centraremos en c\u00f3mo controlar la barra de herramientas del bloque. Aprenderemos c\u00f3mo manejar, por ejemplo, la alineaci\u00f3n de un bloque y agregar botones personalizados a la barra de herramientas.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En esta lecci\u00f3n del tutorial de Gutenberg, nos centraremos en c\u00f3mo agregar diferentes componentes al Inspector: la barra lateral en el lado derecho del 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":[892,892,716,716,831,935,935,1110,800,800,831,840,840,861,861],"tags":[1172],"class_list":["post-233481","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-desarrollador","category-guia-para-principiantes","category-gutenberg-2","category-n-a","category-php-2","category-tutoriales","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233481","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=233481"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233481\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/153128"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=233481"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=233481"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=233481"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}