{"id":228509,"date":"2022-10-12T11:08:00","date_gmt":"2022-10-12T08:08:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228509"},"modified":"2022-11-09T02:46:53","modified_gmt":"2022-11-08T23:46:53","slug":"ajouter-select2-comme-inspectorcontrol-dans-wordpress-gutenberg","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/ajouter-select2-comme-inspectorcontrol-dans-wordpress-gutenberg\/","title":{"rendered":"Ajouter Select2 comme InspectorControl dans WordPress Gutenberg"},"content":{"rendered":"\n<p>Pour un projet sur lequel je travaillais, je voulais utiliser Select2 comme Gutenberg <code>InpectorControl<\/code>pour me permettre d&rsquo;appliquer des param\u00e8tres \u00e0 un bloc. Ce didacticiel vous donnera \u00e9galement les bases dont vous avez besoin pour int\u00e9grer tout composant React tiers dans l&rsquo;\u00e9diteur WordPress Gutenberg.<\/p>\n<p>Select2 est un remplacement super pratique pour les cases s\u00e9lectionn\u00e9es sur votre site Web. En particulier, il propose d&rsquo;excellentes options pour s\u00e9lectionner plusieurs \u00e9l\u00e9ments.<\/p>\n<p>Le produit fini, Select2 dans WordPress Gutenberg InspectorControls<\/p>\n<p>La bonne nouvelle est que je n&rsquo;ai pas eu besoin de cr\u00e9er un composant React pour obtenir Select2 dans Gutenberg, le <a href=\"https:\/\/github.com\/JedWatson\/react-select\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\"><code>react-select<\/code>composant de Jed Watson<\/a>, fait d\u00e9j\u00e0 un excellent travail, mais le faire jouer bien avec Gutenberg n&rsquo;\u00e9tait pas aussi simple que de suivre les instructions.<\/p>\n<p>Tout d&rsquo;abord, nous devions installer le composant dans notre build. Comme c&rsquo;\u00e9tait sur npm, c&rsquo;\u00e9tait aussi simple que d&rsquo;entrer ce qui suit dans notre terminal :<\/p>\n<h2>Obtenir Select2 dans un bloc Gutenberg<\/h2>\n<p>En utilisant <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> (qui fait partie du <a href=\"https:\/\/javascriptforwp.com\/courses\/gutenburg-development\/ref\/648\/?campaign=GutenbergDevelopment\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">fantastique cours de d\u00e9veloppement Zac Gordons Gutenberg<\/a>) comme base pour mon plugin (en particulier l&rsquo; <code>InspectorControls<\/code>exemple), <code>react-select<\/code>j&rsquo;avais besoin d&rsquo;ajouter les \u00e9l\u00e9ments suivants en haut de mon fichier\u00a0:<\/p>\n<pre><code>import React from 'react';\nimport Select from 'react-select';\n<\/code><\/pre>\n<p>Oh non! Compiler cela nous donne une erreur:<\/p>\n<blockquote>\n<p>Module introuvable\u00a0: erreur\u00a0: impossible de r\u00e9soudre \u00ab\u00a0r\u00e9agir\u00a0\u00bb<\/p>\n<\/blockquote>\n<p>N&rsquo;ayez crainte, ce super article sur <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\">&quot;Comment utiliser des composants React externes dans vos blocs Gutenberg&quot; par CSS Igniter<\/a> est venu \u00e0 la rescousse, il suffit de s&rsquo;inscrire <code>externals<\/code>dans notre <code>webpack.config.js<\/code>fichier :<\/p>\n<pre><code>externals: {\n    'react': 'React',\n    'react-dom': 'ReactDOM',\n}\n<\/code><\/pre>\n<p>Ainsi:<\/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>Enregistrement des InspectorControls<\/h2>\n<p>\u00c0 l&rsquo;int\u00e9rieur du rouleau de panneaux de votre <code>&lt;InspectorControls&gt;<\/code>composant, vous devrez ajouter les \u00e9l\u00e9ments suivants\u00a0:<\/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>Nous n&rsquo;avons pas tout \u00e0 fait termin\u00e9, car nous devrons \u00e9galement enregistrer l&rsquo; <code>selectedOption<\/code>attribut et la <code>handleSelectChange<\/code>fonction. Nous pouvons faire ceci comme ceci :<\/p>\n<pre><code>attributes: {\n    selectedOption: {\n        type: 'string',\n        default: null,\n    }\n},\n<\/code><\/pre>\n<p>\u2026et maintenant pour la fonction\u2026<\/p>\n<pre><code>const handleSelectChange = (selectedOption) =&gt; setAttributes( { selectedOption: JSON.stringify( selectedOption) } );\n<\/code><\/pre>\n<p>Attendez, pourquoi avons-nous besoin <code>JSON.stringify()<\/code>et <code>JSON.parse()<\/code>les valeurs\u00a0? Eh bien, parce que la valeur que le <code>react-select<\/code>composant accepte est un tableau, et comme Gutenberg ne nous laissera pas enregistrer cette valeur sous forme de tableau, c&rsquo;est une solution de contournement que nous pouvons utiliser.<\/p>\n<h2>Mettre ensemble<\/h2>\n<p>Notre <code>InspectorControls<\/code>zone compl\u00e8te devrait maintenant ressembler \u00e0 ceci\u00a0:<\/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>Bien para\u00eetre \u00e0 Gutenberg<\/h2>\n<p>Comme vous pouvez le voir sur la capture d&rsquo;\u00e9cran, cela fonctionne plut\u00f4t bien :<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169504-61e816febb7e8.png\" alt=\"Ajouter Select2 comme InspectorControl dans WordPress Gutenberg\" \/>Select2 en tant que Gutenberg InspectorControl<\/p>\n<h2>Aller plus loin<\/h2>\n<p>J&rsquo;ai utilis\u00e9 ce contr\u00f4le Inspector dans mon plugin Secure Blocks for Gutenberg, d\u00e9couvrez comment j&rsquo;ai rempli le contr\u00f4le Select2 avec <a href=\"https:\/\/wholesomecode.ltd\/articles\/working-with-gutenberg-and-the-wordpress-rest-api\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">des donn\u00e9es dynamiques de l&rsquo;API WordPress REST<\/a>.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/wholesomecode.ltd\" class=\"external external_icon\">wholesomecode.ltd<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pour un projet sur lequel je travaillais, je voulais utiliser Select2 comme Gutenberg InpectorControl pour me permettre d&rsquo;appliquer des param\u00e8tres \u00e0 un bloc. Ce tutoriel vous donnera \u00e9galement les bases dont vous avez besoin&#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":[893,717,841],"tags":[1167],"class_list":["post-228509","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-developpeur","category-tutoriels","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/228509","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=228509"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/228509\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/224196"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=228509"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=228509"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=228509"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}