{"id":233474,"date":"2023-02-15T17:13:00","date_gmt":"2023-02-15T14:13:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233474"},"modified":"2023-02-26T12:25:53","modified_gmt":"2023-02-26T09:25:53","slug":"skapa-anpassat-gutenberg-block-del-5-inspektoersinstaellningar","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/skapa-anpassat-gutenberg-block-del-5-inspektoersinstaellningar\/","title":{"rendered":"Skapa anpassat Gutenberg-block &#8211; Del 5: Inspekt\u00f6rsinst\u00e4llningar"},"content":{"rendered":"\n<p>I de f\u00f6reg\u00e5ende stegen l\u00e4rde vi oss grunderna i hur man renderar komponenter och attribut i ett block. I det h\u00e4r steget kommer vi att fokusera p\u00e5 vad WordPress (\u00e5tminstone i kod) kallar Inspector: sidof\u00e4ltet till h\u00f6ger i editorn. Vi kommer att ber\u00f6ra n\u00e5gra nya komponenter som \u00e4r vettiga att placera i sidof\u00e4ltet och hur man hanterar dessa.<\/p>\n<h2>Inspekt\u00f6r\/sidof\u00e4ltskomponent<\/h2>\n<p>F\u00f6r att infoga dina anpassade inst\u00e4llningar och HTML i Inspector sidof\u00e4ltet kommer du att linda in allt i en komponent som heter <code>InspectorControls<\/code>. Vad du \u00e4n l\u00e4gger in i den h\u00e4r komponenten kommer att matas ut i sidof\u00e4ltet och inte i sj\u00e4lva blocket\/redigeraren. Du kan i princip l\u00e4gga komponenten och dess inneh\u00e5ll \u00f6verallt i returen av <code>edit<\/code>funktionen.<\/p>\n<p>F\u00f6rutom det skulle du hantera inst\u00e4llningar i sidof\u00e4ltet som de var inne i blocket. Varje inst\u00e4llning kr\u00e4ver ett attribut, och du laddar och uppdaterar attributen p\u00e5 samma s\u00e4tt.<\/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=\"Skapa anpassat Gutenberg-block - Del 5: Inspekt\u00f6rsinst\u00e4llningar\"><\/a><\/p>\n<p>L\u00e5t oss f\u00f6rst ta en snabb titt p\u00e5 hur v\u00e5rt blocks sidof\u00e4lt ser ut (n\u00e4r v\u00e5rt block \u00e4r aktivt i editorn), baserat p\u00e5 koden vi hamnade i f\u00f6reg\u00e5ende steg.<\/p>\n<p>Alla block kommer som standard att visa blockets ikon, namn och beskrivning, och avsnittet Avancerat \u2013 komprimerat. Inuti Advanced hittar du en textinmatning f\u00f6r att tillhandah\u00e5lla CSS-klass f\u00f6r blocket.<\/p>\n<h2>L\u00e4gger till en sidof\u00e4ltssektion och n\u00e5gra inst\u00e4llningar<\/h2>\n<p>Sidof\u00e4ltet \u00e4r uppdelat i sektioner (kallas paneler i kod), och f\u00f6r optimal design och funktionalitet (inklusive \u00f6ppen kollaps funktionalitet) b\u00f6r vi anv\u00e4nda WordPress komponenter f\u00f6r att mata ut paneler p\u00e5 r\u00e4tt s\u00e4tt.<\/p>\n<p>Anv\u00e4nd komponenten <code>PanelBody<\/code>f\u00f6r att l\u00e4gga till en sektion (de som du kan \u00f6ppna eller komprimera), som finns i <code>wp.components<\/code>paketet. Komponenten accepterar n\u00e5gra rekvisita, till exempel f\u00f6r titeln och om panelen ska vara \u00f6ppen eller st\u00e4ngd som standard. Du kan ocks\u00e5 tillhandah\u00e5lla anpassad klass, ikon och bifoga en h\u00e4ndelsefunktion till \u00f6ppna-st\u00e4ng-utl\u00f6saren.<\/p>\n<p>Inom <code>PanelBody<\/code>WordPress rekommenderar sedan att du anv\u00e4nder <code>PanelRow<\/code>komponenten som fungerar som generiska beh\u00e5llare i panelen &#8211; f\u00f6r att s\u00e4kerst\u00e4lla att designen effektiviseras. Den h\u00e4r komponenten till\u00e4mpar automatiskt viss marginal och flex radstil f\u00f6r ditt inneh\u00e5ll. P\u00e5 grund av &quot; <code>flex-direction: row<\/code>&quot; stylingen b\u00f6r du linda in varje inst\u00e4llning i en <code>PanelRow<\/code>eller s\u00e5 kan du hoppa \u00f6ver den helt och ta ansvar f\u00f6r att styla den sj\u00e4lv med divs och s\u00e5.<\/p>\n<h3>L\u00e4gga till en panel och inst\u00e4llningar<\/h3>\n<p>L\u00e5t oss l\u00e4gga till en sidof\u00e4ltspanel f\u00f6r v\u00e5rt block med n\u00e5gra inst\u00e4llningar inuti, bara f\u00f6r att se det i praktiken. Vi l\u00e4gger till en v\u00e4xlingskontroll, en vald ing\u00e5ng, en f\u00e4rgv\u00e4ljare och en kryssruta \u2013 bara f\u00f6r att f\u00e5 lite erfarenhet av olika typer av ing\u00e5ngskomponenter. Jag har l\u00e4mnat blockinneh\u00e5llet (med de tv\u00e5 <code>RichText<\/code>s) och <code>save<\/code>funktionen precis som tidigare.<\/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>Som alltid b\u00f6rjar vi med att f\u00f6rst\u00f6ra de komponenter och funktioner vi vill anv\u00e4nda. Inuti <code>attributes<\/code>definierar <code>registerBlockType()<\/code>vi ett attribut per ing\u00e5ng och matchar typen \u2013 till exempel f\u00f6rv\u00e4ntar v\u00e4xlingskontrollen ett booleskt v\u00e4rde och eftersom v\u00e4rdena i rullgardinsmenyn \u00e4r str\u00e4ngar b\u00f6r det attributet ocks\u00e5 vara en typstr\u00e4ng.<\/p>\n<p>Vid raden <code>#41<\/code>startar vi <code>InspectorControls<\/code>komponenten, och allt fr\u00e5n den punkten till raden <code>#80<\/code>kommer att visas i sidof\u00e4ltet. Resten kommer att dyka upp i sj\u00e4lva redigeraren, och jag har inte gjort n\u00e5gra \u00e4ndringar d\u00e4r.<\/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=\"Skapa anpassat Gutenberg-block - Del 5: Inspekt\u00f6rsinst\u00e4llningar\"><\/a><\/p>\n<p>Inuti skapar vi f\u00f6rst en panel med <code>PanelBody<\/code>och med propen <code>initialOpen<\/code>inst\u00e4lld p\u00e5 sant s\u00e4ger vi till Gutenberg att den h\u00e4r panelen ska \u00f6ppnas som standard. Och sedan \u00e4r det upp till oss vad vi ska l\u00e4gga till i varje <code>PanelRow<\/code>.<\/p>\n<p>F\u00f6r komponenten <code>ToggleControl<\/code>anv\u00e4nder vi samma rekvisita som vi har gjort tidigare med textinmatning, f\u00f6rutom att <code>value<\/code>vi ist\u00e4llet f\u00f6r props tillhandah\u00e5ller attributv\u00e4rdet inuti prop <code>checked<\/code>. Detta g\u00e4ller alla indata som f\u00f6rv\u00e4ntar sig ett markerat attribut i vanlig HTML, till exempel kryssrutor. F\u00f6r radioknappar skulle du anv\u00e4nda rekvisitan <code>selected<\/code>eftersom detta \u00e4r vad du ocks\u00e5 skulle anv\u00e4nda i vanlig HTML. T\u00e4nk p\u00e5 att attributet f\u00f6r denna ing\u00e5ng m\u00e5ste vara av typen <code>boolean<\/code>.<\/p>\n<p>N\u00e4r det g\u00e4ller <code>CheckboxControl<\/code>hanteringen av en singular kryssruta fungerar exakt samma sak som <code>ToggleControl<\/code>\u2013 den returnerar ett boolesk v\u00e4rde oavsett om det \u00e4r markerat eller inte.<\/p>\n<p>Den <code>SelectControl<\/code>genererar en rullgardinsmeny f\u00f6r val och f\u00f6rv\u00e4ntar sig de m\u00f6jliga valen som en array i rekvisiten <code>options<\/code>. Varje element m\u00e5ste vara ett objekt med egenskaperna <code>label<\/code>och <code>value<\/code>. Detsamma g\u00e4ller f\u00f6r kryssrutor och alternativknappar (<code>RadioControl<\/code>). Under normala omst\u00e4ndigheter skulle du f\u00f6rmodligen generera valen som en variabel utanf\u00f6r HTML-utdata.<\/p>\n<p>Du kanske m\u00e4rker att de <code>ColorPicker<\/code>fungerar lite annorlunda \u00e4n de andra eftersom detta \u00e4r en mer komplex komponent och inte en vanlig HTML-inmatning. Ange rekvisiten <code>color<\/code>f\u00f6r den sparade f\u00e4rgen och anv\u00e4nd ist\u00e4llet f\u00f6r <code>onChange<\/code>(avfyras en g\u00e5ng n\u00e4r du klickar men ocks\u00e5 varje g\u00e5ng v\u00e4rdet \u00e4ndras medan du drar \u2013 vilket kan resultera i m\u00e5nga br\u00e4nder) <code>onChangeComplete<\/code>. Den rekvisita som returneras i denna h\u00e4ndelse \u00e4r ocks\u00e5 ett objekt d\u00e4r vi m\u00e5ste best\u00e4mma vilken del vi vill spara i v\u00e5rt attribut. I det h\u00e4r exemplet vill vi spara hex-v\u00e4rdet (utan alfa\/opacitet), s\u00e5 inuti <code>setAttributes()<\/code>extraherar vi <code>hex<\/code>egenskapen f\u00f6r det <code>color<\/code>returnerade objektet. Det \u00e4r ocks\u00e5 d\u00e4rf\u00f6r vi l\u00e4gger till fastigheten<code>disableAlpha<\/code>att ta bort alfakanalens anv\u00e4ndargr\u00e4nssnitt (f\u00f6r att kontrollera opaciteten) eftersom det inte \u00e4r meningsfullt att erbjuda anv\u00e4ndaren detta n\u00e4r vi aldrig sparar opacitetsv\u00e4rdet.<\/p>\n<p>Var och en av komponenterna har en <code>label<\/code>rekvisita tillg\u00e4nglig f\u00f6rutom colorpicker. Om du vill skriva ut en etikett eller text innan den m\u00e5ste du pilla runt med HTML eller styling f\u00f6r att s\u00e4kerst\u00e4lla att det ser bra ut.<\/p>\n<p>Du kan sj\u00e4lvklart l\u00e4gga till hur m\u00e5nga paneler du vill, l\u00e4gg bara till ytterligare en <code>PanelBody<\/code>komponent efter den f\u00f6reg\u00e5ende.<\/p>\n<p>Om du \u00e4r intresserad av att l\u00e4ra dig mer om att l\u00e4gga till blockinst\u00e4llningar har jag separata handledningar f\u00f6r mer komplexa inst\u00e4llningar och komponenter f\u00f6r Inspector; <a href=\"https:\/\/wordpress.mediadoma.com\/sv\/hur-man-laegger-till-en-bildval-i-ditt-anpassade-wordpress-gutenberg-block\/\" title=\"Hur man l\u00e4gger till ett bildval\">Hur man l\u00e4gger till ett bildval<\/a> och <a href=\"https:\/\/wordpress.mediadoma.com\/sv\/hur-man-laegger-till-faerginstaellningar-i-ditt-anpassade-gutenberg-block\/\" title=\"hur man l\u00e4gger till en f\u00e4rginst\u00e4llningspanel\">hur man l\u00e4gger till en f\u00e4rginst\u00e4llningspanel<\/a>.<\/p>\n<h3>Hantering<code>save<\/code><\/h3>\n<p>Jag har l\u00e4mnat <code>save<\/code>funktionen som den var tidigare. Det \u00e4r upp till dig och allt beror p\u00e5 vad inst\u00e4llningarna styr i utg\u00e5ngen. Du vet redan hur du f\u00e5r fram v\u00e4rdena f\u00f6r varje inst\u00e4llning. L\u00e5t oss som ett exempel anta att det booleska attributet <code>activateLasers<\/code>styr om ett anpassat HTML-element renderas eller inte. Om attributet \u00e4r <code>true<\/code>en div ska matas ut, annars inte. Du kan g\u00f6ra det med traditionell if-check eller anv\u00e4nda JSX:s inline <code>if<\/code>och <code>&amp;&amp;<\/code>operator. L\u00e4s mer om detta i <a href=\"https:\/\/reactjs.org\/docs\/conditional-rendering.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Reacts guide f\u00f6r villkorlig rendering<\/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>Eftersom vi anv\u00e4nder <code>RichText<\/code>denna utdata skulle den inte vara synlig i editorn, men den kommer att visas i frontend.<\/p>\n<p>Du hittar fler komponenter i <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-repo<\/a>. De flesta av dessa mappar b\u00f6r ge dig ett readme med viss dokumentation om hur du anv\u00e4nder det. Jag l\u00e4rde mig det mesta av detta genom att titta i denna repo och \u00e4ven p\u00e5 de viktigaste WordPress-komponenterna hur de gjorde det.<\/p>\n<p>I <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\">n\u00e4sta steg i serien<\/a> kommer vi att fokusera p\u00e5 hur man styr blockets verktygsf\u00e4lt. Vi l\u00e4r oss hur man hanterar till exempel ett blocks justering och l\u00e4gger till anpassade knappar i verktygsf\u00e4ltet.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I den h\u00e4r Gutenbergs handledningslektion kommer vi att fokusera p\u00e5 hur man l\u00e4gger till olika komponenter i Inspector &#8211; sidof\u00e4ltet till h\u00f6ger i redigeraren.<\/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":[901,724,838,942,942,848,901,1110,807,807,838,848,724,868,868],"tags":[1173],"class_list":["post-233474","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-koda","category-utvecklaren","category-guide-foer-nyboerjare","category-gutenberg-9","category-handledningar","category-n-a","category-php-9","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/233474","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=233474"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/233474\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/153128"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=233474"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=233474"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=233474"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}