{"id":234221,"date":"2023-02-15T17:07:00","date_gmt":"2023-02-15T14:07:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=234221"},"modified":"2023-02-26T12:20:51","modified_gmt":"2023-02-26T09:20:51","slug":"creer-un-bloc-gutenberg-personnalise-partie-5-parametres-de-linspecteur","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/creer-un-bloc-gutenberg-personnalise-partie-5-parametres-de-linspecteur\/","title":{"rendered":"Cr\u00e9er un bloc Gutenberg personnalis\u00e9 &#8211; Partie 5\u00a0: Param\u00e8tres de l&rsquo;inspecteur"},"content":{"rendered":"\n<p>Dans les \u00e9tapes pr\u00e9c\u00e9dentes, nous avons appris les bases du rendu des composants et des attributs dans un bloc. Dans cette \u00e9tape, nous allons nous concentrer sur ce que WordPress (au moins dans le code) appelle Inspector: la barre lat\u00e9rale sur le c\u00f4t\u00e9 droit de l&rsquo;\u00e9diteur. Nous aborderons quelques nouveaux composants qu&rsquo;il est logique de placer dans la barre lat\u00e9rale et comment les g\u00e9rer.<\/p>\n<h2>Composant inspecteur\/barre lat\u00e9rale<\/h2>\n<p>Pour ins\u00e9rer vos param\u00e8tres personnalis\u00e9s et HTML dans la barre lat\u00e9rale de l&rsquo;inspecteur, vous encapsulez tout dans un composant appel\u00e9 <code>InspectorControls<\/code>. Tout ce que vous mettez \u00e0 l&rsquo;int\u00e9rieur de ce composant sera affich\u00e9 dans la barre lat\u00e9rale et non \u00e0 l&rsquo;int\u00e9rieur du bloc\/\u00e9diteur lui-m\u00eame. Vous pouvez essentiellement mettre le composant et son contenu partout dans le retour de la <code>edit<\/code>fonction.<\/p>\n<p>En dehors de cela, vous g\u00e9reriez les param\u00e8tres \u00e0 l&rsquo;int\u00e9rieur de la barre lat\u00e9rale comme ils l&rsquo;\u00e9taient \u00e0 l&rsquo;int\u00e9rieur du bloc. Chaque param\u00e8tre n\u00e9cessite un attribut, et vous chargez et mettez \u00e0 jour les attributs de la m\u00eame mani\u00e8re.<\/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=\"Cr\u00e9er un bloc Gutenberg personnalis\u00e9 - Partie 5\u00a0: Param\u00e8tres de l&#039;inspecteur\"><\/a><\/p>\n<p>Voyons d&rsquo;abord \u00e0 quoi ressemble la barre lat\u00e9rale de notre bloc (lorsque notre bloc est actif dans l&rsquo;\u00e9diteur), en nous basant sur le code que nous avons trouv\u00e9 \u00e0 l&rsquo;\u00e9tape pr\u00e9c\u00e9dente.<\/p>\n<p>Tous les blocs afficheront par d\u00e9faut l&rsquo;ic\u00f4ne, le nom et la description du bloc, ainsi que la section Avanc\u00e9 \u2013 r\u00e9duite. Dans Advanced, vous trouverez une entr\u00e9e de texte pour fournir une classe CSS pour le bloc.<\/p>\n<h2>Ajout d&rsquo;une section de barre lat\u00e9rale et de certains param\u00e8tres<\/h2>\n<p>La barre lat\u00e9rale est divis\u00e9e en sections (appel\u00e9es panneaux dans le code), et pour une conception et une fonctionnalit\u00e9 optimales (y compris la fonctionnalit\u00e9 de r\u00e9duction ouverte), nous devons utiliser les composants de WordPress pour g\u00e9n\u00e9rer correctement les panneaux.<\/p>\n<p>Utilisez le composant <code>PanelBody<\/code>pour ajouter une section (celles que vous pouvez ouvrir ou r\u00e9duire), trouv\u00e9 dans le <code>wp.components<\/code>package. Le composant accepte quelques accessoires, par exemple pour le titre et si le panneau doit \u00eatre ouvert ou ferm\u00e9 par d\u00e9faut. Vous pouvez \u00e9galement fournir une classe personnalis\u00e9e, une ic\u00f4ne et attacher une fonction d&rsquo;\u00e9v\u00e9nement au d\u00e9clencheur d&rsquo;ouverture-fermeture.<\/p>\n<p>Dans <code>PanelBody<\/code>WordPress recommande ensuite d&rsquo;utiliser le <code>PanelRow<\/code>composant qui agit comme des conteneurs g\u00e9n\u00e9riques dans le panneau &#8211; pour assurer la rationalisation de la conception. Ce composant applique automatiquement un style de marge et de ligne flexible pour votre contenu. En raison du <code>flex-direction: row<\/code>style &quot; &quot;, vous devez envelopper chaque param\u00e8tre dans un seul <code>PanelRow<\/code>. Ou vous pouvez l&rsquo;ignorer compl\u00e8tement et prendre la responsabilit\u00e9 de le styler vous-m\u00eame avec des divs et autres.<\/p>\n<h3>Ajout d&rsquo;un panneau et de param\u00e8tres<\/h3>\n<p>Ajoutons un panneau de barre lat\u00e9rale pour notre bloc avec quelques param\u00e8tres \u00e0 l&rsquo;int\u00e9rieur, juste pour le voir en pratique. Nous allons ajouter un contr\u00f4le \u00e0 bascule, une entr\u00e9e de s\u00e9lection, un s\u00e9lecteur de couleurs et une case \u00e0 cocher &#8211; juste pour acqu\u00e9rir une certaine exp\u00e9rience avec diff\u00e9rents types de composants d&rsquo;entr\u00e9e. J&rsquo;ai laiss\u00e9 le contenu du bloc (avec les deux <code>RichText<\/code>s) et la <code>save<\/code>fonction comme avant.<\/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>Comme toujours, nous commen\u00e7ons par d\u00e9structurer les composants et la fonction que nous voulons utiliser. \u00c0 <code>attributes<\/code>l&rsquo;int\u00e9rieur <code>registerBlockType()<\/code>, nous d\u00e9finissons un attribut par entr\u00e9e et correspondons au type &#8211; par exemple, le contr\u00f4le bascule attend un bool\u00e9en et parce que les valeurs de la liste d\u00e9roulante sont des cha\u00eenes, cet attribut doit \u00e9galement \u00eatre une cha\u00eene de type.<\/p>\n<p>\u00c0 la ligne, <code>#41<\/code>nous d\u00e9marrons le <code>InspectorControls<\/code>composant, et tout, depuis ce point jusqu&rsquo;\u00e0 la ligne <code>#80<\/code>, appara\u00eetra dans la barre lat\u00e9rale. Le reste appara\u00eetra dans l&rsquo;\u00e9diteur lui-m\u00eame, et je n&rsquo;y ai apport\u00e9 aucune modification.<\/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=\"Cr\u00e9er un bloc Gutenberg personnalis\u00e9 - Partie 5\u00a0: Param\u00e8tres de l&#039;inspecteur\"><\/a><\/p>\n<p>\u00c0 l&rsquo; int\u00e9rieur, nous cr\u00e9ons d&rsquo;abord un panneau avec <code>PanelBody<\/code>et avec la prop <code>initialOpen<\/code>d\u00e9finie sur true, nous disons \u00e0 Gutenberg que ce panneau doit \u00eatre ouvert par d\u00e9faut. Et ensuite, c&rsquo;est \u00e0 nous de d\u00e9cider quoi ajouter \u00e0 l&rsquo;int\u00e9rieur de chacun <code>PanelRow<\/code>.<\/p>\n<p>Pour le composant, <code>ToggleControl<\/code>nous utilisons les m\u00eames props que nous avons fait auparavant avec les entr\u00e9es de texte, sauf qu&rsquo;au lieu de la prop, <code>value<\/code>nous fournissons la valeur de l&rsquo;attribut \u00e0 l&rsquo;int\u00e9rieur de la prop <code>checked<\/code>. Cela s&rsquo;applique \u00e0 toutes les entr\u00e9es qui attendent un attribut coch\u00e9 en HTML brut, par exemple les cases \u00e0 cocher. Pour les boutons radio, vous utiliserez le prop <code>selected<\/code>, car c&rsquo;est \u00e9galement ce que vous utiliserez en HTML brut. N&rsquo;oubliez pas que l&rsquo;attribut de cette entr\u00e9e doit \u00eatre de type <code>boolean<\/code>.<\/p>\n<p>Quant \u00e0 la <code>CheckboxControl<\/code>case \u00e0 cocher lors de la gestion d&rsquo;un singulier, elle fonctionne exactement de la m\u00eame mani\u00e8re que <code>ToggleControl<\/code>&#8211; elle renvoie un bool\u00e9en, qu&rsquo;elle soit coch\u00e9e ou non.<\/p>\n<p>Le <code>SelectControl<\/code>g\u00e9n\u00e8re une liste d\u00e9roulante de s\u00e9lection et attend les choix possibles sous forme de tableau dans le prop <code>options<\/code>. Chaque \u00e9l\u00e9ment doit \u00eatre un objet avec les propri\u00e9t\u00e9s <code>label<\/code>et <code>value<\/code>. Il en va de m\u00eame pour les cases \u00e0 cocher et les boutons radio (<code>RadioControl<\/code>). Dans des circonstances normales, vous g\u00e9n\u00e9reriez probablement les choix en tant que variable en dehors de la sortie HTML.<\/p>\n<p>Vous remarquerez peut-\u00eatre que le <code>ColorPicker<\/code>fonctionne un peu diff\u00e9remment des autres car il s&rsquo;agit d&rsquo;un composant plus complexe et non d&rsquo;une entr\u00e9e HTML standard. Fournissez l&rsquo;accessoire <code>color<\/code>pour la couleur enregistr\u00e9e, et au lieu de <code>onChange<\/code>(se d\u00e9clenche une fois en cliquant mais aussi \u00e0 chaque fois que la valeur est modifi\u00e9e pendant le glissement &#8211; ce qui peut entra\u00eener de nombreux incendies), utilisez <code>onChangeComplete<\/code>. Le prop renvoy\u00e9 dans cet \u00e9v\u00e9nement est \u00e9galement un objet dans lequel nous devons d\u00e9cider quelle partie nous voulons enregistrer dans notre attribut. Dans cet exemple, nous voulons enregistrer la valeur hexad\u00e9cimale (sans alpha\/opacit\u00e9), donc \u00e0 l&rsquo;int\u00e9rieur, <code>setAttributes()<\/code>nous extrayons la <code>hex<\/code>propri\u00e9t\u00e9 de l&rsquo; <code>color<\/code>objet renvoy\u00e9. C&rsquo;est aussi pourquoi nous ajoutons la propri\u00e9t\u00e9<code>disableAlpha<\/code>quant \u00e0 supprimer l&rsquo;interface utilisateur du canal alpha (pour contr\u00f4ler l&rsquo;opacit\u00e9) car cela n&rsquo;a aucun sens de l&rsquo;offrir \u00e0 l&rsquo;utilisateur lorsque nous n&rsquo;enregistrons jamais la valeur d&rsquo;opacit\u00e9.<\/p>\n<p>Chacun des composants a un <code>label<\/code>accessoire disponible \u00e0 l&rsquo;exception du s\u00e9lecteur de couleurs. Si vous souhaitez afficher une \u00e9tiquette ou du texte avant, vous devrez modifier le code HTML ou le style pour vous assurer qu&rsquo;il est beau.<\/p>\n<p>Vous pouvez \u00e9videmment ajouter autant de panneaux que vous le souhaitez, il vous suffit d&rsquo;ajouter un autre <code>PanelBody<\/code>composant apr\u00e8s le pr\u00e9c\u00e9dent.<\/p>\n<p>Si vous souhaitez en savoir plus sur l&rsquo;ajout de param\u00e8tres de bloc, j&rsquo;ai des didacticiels s\u00e9par\u00e9s pour des param\u00e8tres et des composants plus complexes pour Inspector. <a href=\"https:\/\/wordpress.mediadoma.com\/fr\/comment-ajouter-une-selection-dimage-dans-votre-bloc-wordpress-gutenberg-personnalise\/\" title=\"Comment ajouter une s\u00e9lection d'image\">Comment ajouter une s\u00e9lection d&rsquo;image<\/a> et <a href=\"https:\/\/wordpress.mediadoma.com\/fr\/comment-ajouter-des-parametres-de-couleur-a-votre-bloc-gutenberg-personnalise\/\" title=\"comment ajouter un panneau de param\u00e8tres de couleur\">comment ajouter un panneau de param\u00e8tres de couleur<\/a>.<\/p>\n<h3>Manutention<code>save<\/code><\/h3>\n<p>J&rsquo;ai laiss\u00e9 la <code>save<\/code>fonction telle qu&rsquo;elle \u00e9tait avant. C&rsquo;est \u00e0 vous de d\u00e9cider et tout d\u00e9pend de ce que les param\u00e8tres contr\u00f4lent dans la sortie. Vous savez d\u00e9j\u00e0 comment obtenir les valeurs de chaque param\u00e8tre. Par exemple, supposons que l&rsquo;attribut bool\u00e9en <code>activateLasers<\/code>contr\u00f4le le rendu ou non d&rsquo;un \u00e9l\u00e9ment HTML personnalis\u00e9. Si l&rsquo;attribut est <code>true<\/code>une div doit \u00eatre sortie, sinon non. <code>if<\/code>Vous pouvez le faire avec la v\u00e9rification if-check traditionnelle ou utiliser la ligne et l&rsquo; <code>&amp;&amp;<\/code>op\u00e9rateur de JSX. En savoir plus \u00e0 ce sujet dans <a href=\"https:\/\/reactjs.org\/docs\/conditional-rendering.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">le guide de React pour le rendu conditionnel<\/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>Parce que nous utilisons <code>RichText<\/code>cette sortie ne serait pas visible dans l&rsquo;\u00e9diteur, mais elle appara\u00eetra dans le frontend.<\/p>\n<p>Vous trouverez plus de composants dans le <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\">repo Github<\/a>. La plupart de ces dossiers devraient vous fournir un fichier Lisez-moi avec de la documentation sur la fa\u00e7on de l&rsquo;utiliser. J&rsquo;ai appris la plupart de cela en regardant dans ce d\u00e9p\u00f4t et aussi sur les composants de base de WordPress comment ils l&rsquo;ont fait.<\/p>\n<p>Dans la <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\">prochaine \u00e9tape de la s\u00e9rie,<\/a> nous nous concentrerons sur la fa\u00e7on de contr\u00f4ler la barre d&rsquo;outils du bloc. Nous allons apprendre \u00e0 g\u00e9rer par exemple l&rsquo;alignement d&rsquo;un bloc et \u00e0 ajouter des boutons personnalis\u00e9s \u00e0 la barre d&rsquo;outils.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dans cette le\u00e7on du didacticiel Gutenberg, nous nous concentrerons sur la fa\u00e7on d&rsquo;ajouter diff\u00e9rents composants \u00e0 l&rsquo;inspecteur &#8211; la barre lat\u00e9rale sur le c\u00f4t\u00e9 droit de l&rsquo;\u00e9diteur.<\/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":[893,893,717,717,832,936,936,1110,801,801,832,841,841,862,862],"tags":[1167],"class_list":{"0":"post-234221","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-code-2","9":"category-developpeur","11":"category-guide-pour-les-debutants","12":"category-gutenberg-3","14":"category-n-a","15":"category-php-3","18":"category-tutoriels","20":"category-wordpress-3","22":"tag-affiai-fr"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234221","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=234221"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234221\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/153128"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=234221"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=234221"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=234221"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}