{"id":233496,"date":"2023-02-15T16:40:00","date_gmt":"2023-02-15T13:40:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233496"},"modified":"2023-02-26T12:42:34","modified_gmt":"2023-02-26T09:42:34","slug":"utworz-niestandardowy-blok-gutenberga-czesc-5-ustawienia-inspektora","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/utworz-niestandardowy-blok-gutenberga-czesc-5-ustawienia-inspektora\/","title":{"rendered":"Utw\u00f3rz niestandardowy blok Gutenberga \u2014 cz\u0119\u015b\u0107 5: Ustawienia inspektora"},"content":{"rendered":"\n<p>W poprzednich krokach nauczyli\u015bmy si\u0119 podstaw renderowania komponent\u00f3w i atrybut\u00f3w w bloku. W tym kroku skupimy si\u0119 na tym, co WordPress (przynajmniej w kodzie) nazywa Inspektorem: na pasku bocznym po prawej stronie w edytorze. Om\u00f3wimy kilka nowych komponent\u00f3w, kt\u00f3re warto umie\u015bci\u0107 na pasku bocznym i jak sobie z nimi radzi\u0107.<\/p>\n<h2>Komponent inspektora\/paska bocznego<\/h2>\n<p>Aby wstawi\u0107 ustawienia niestandardowe i kod HTML do paska bocznego Inspektora, umie\u015bcisz wszystko w komponencie o nazwie <code>InspectorControls<\/code>. Cokolwiek umie\u015bcisz w tym komponencie, zostanie wy\u015bwietlone na pasku bocznym, a nie w samym bloku\/edytorze. Mo\u017cesz w zasadzie umie\u015bci\u0107 sk\u0142adnik i jego zawarto\u015b\u0107 wsz\u0119dzie w zwrocie <code>edit<\/code>funkcji.<\/p>\n<p>Poza tym b\u0119dziesz obs\u0142ugiwa\u0142 ustawienia na pasku bocznym tak, jak by\u0142y w bloku. Ka\u017cde ustawienie wymaga atrybutu, a \u0142adujesz i aktualizujesz atrybuty w ten sam spos\u00f3b.<\/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=\"Utw\u00f3rz niestandardowy blok Gutenberga \u2014 cz\u0119\u015b\u0107 5: Ustawienia inspektora\"><\/a><\/p>\n<p>Przyjrzyjmy si\u0119 najpierw, jak wygl\u0105da pasek boczny naszego bloku (kiedy nasz blok jest aktywny w edytorze), na podstawie kodu, kt\u00f3ry otrzymali\u015bmy w poprzednim kroku.<\/p>\n<p>Wszystkie bloki b\u0119d\u0105 domy\u015blnie wy\u015bwietla\u0142y ikon\u0119, nazw\u0119 i opis bloku oraz sekcj\u0119 Zaawansowane \u2013 zwini\u0119te. Wewn\u0105trz Zaawansowane znajdziesz tekst do wprowadzania klasy CSS dla bloku.<\/p>\n<h2>Dodawanie sekcji paska bocznego i niekt\u00f3rych ustawie\u0144<\/h2>\n<p>Pasek boczny jest podzielony na sekcje (nazywane w kodzie panelami), a dla optymalnego projektu i funkcjonalno\u015bci (w tym funkcji open-collapse) powinni\u015bmy u\u017cywa\u0107 komponent\u00f3w WordPressa do prawid\u0142owego wy\u015bwietlania paneli.<\/p>\n<p>U\u017cyj komponentu <code>PanelBody<\/code>do dodania sekcji (tych, kt\u00f3re mo\u017cesz otworzy\u0107 lub zwin\u0105\u0107), znajduj\u0105cego si\u0119 w <code>wp.components<\/code>pakiecie. Komponent akceptuje kilka w\u0142a\u015bciwo\u015bci, na przyk\u0142ad tytu\u0142 i czy panel powinien by\u0107 domy\u015blnie otwarty lub zamkni\u0119ty. Mo\u017cesz r\u00f3wnie\u017c poda\u0107 niestandardow\u0105 klas\u0119, ikon\u0119 i do\u0142\u0105czy\u0107 funkcj\u0119 zdarzenia do wyzwalacza otw\u00f3rz-zamknij.<\/p>\n<p>W <code>PanelBody<\/code>WordPress zaleca u\u017cycie <code>PanelRow<\/code>komponentu, kt\u00f3ry dzia\u0142a jak og\u00f3lne kontenery w panelu &#8211; aby zapewni\u0107 uproszczenie projektu. Ten sk\u0142adnik automatycznie stosuje pewne style margines\u00f3w i wierszy elastycznych do tre\u015bci. Ze wzgl\u0119du na <code>flex-direction: row<\/code>stylizacj\u0119 \u201e &quot; powiniene\u015b owin\u0105\u0107 ka\u017cde ustawienie wewn\u0105trz jednego <code>PanelRow<\/code>. Mo\u017cesz te\u017c ca\u0142kowicie pomin\u0105\u0107 je i wzi\u0105\u0107 odpowiedzialno\u015b\u0107 za stylizacj\u0119 za pomoc\u0105 div\u00f3w i tym podobnych.<\/p>\n<h3>Dodawanie panelu i ustawie\u0144<\/h3>\n<p>Dodajmy panel paska bocznego do naszego bloku z kilkoma ustawieniami w \u015brodku, aby zobaczy\u0107 to w praktyce. Dodamy kontrolk\u0119 prze\u0142\u0105czania, wej\u015bcie wyboru, selektor kolor\u00f3w i pole wyboru \u2013 tylko po to, aby uzyska\u0107 troch\u0119 do\u015bwiadczenia z r\u00f3\u017cnymi typami komponent\u00f3w wej\u015bciowych. Zostawi\u0142em zawarto\u015b\u0107 bloku (z dwoma <code>RichText<\/code>s) i <code>save<\/code>funkcj\u0119 tak jak poprzednio.<\/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>Jak zwykle zaczynamy od destrukturyzacji komponent\u00f3w i funkcji, kt\u00f3rych chcemy u\u017cy\u0107. Wewn\u0105trz definiujemy jeden atrybut <code>attributes<\/code>na <code>registerBlockType()<\/code>dane wej\u015bciowe i dopasowujemy typ \u2013 na przyk\u0142ad kontrolka prze\u0142\u0105czania oczekuje warto\u015bci logicznej, a poniewa\u017c warto\u015bci listy rozwijanej s\u0105 ci\u0105gami, atrybut powinien by\u0107 r\u00f3wnie\u017c ci\u0105giem typu.<\/p>\n<p>Na linii <code>#41<\/code>zaczynamy <code>InspectorControls<\/code>komponent i wszystko od tego punktu do linii <code>#80<\/code>pojawi si\u0119 na pasku bocznym. Reszta pojawi si\u0119 w samym edytorze i nie wprowadzi\u0142em tam \u017cadnych zmian.<\/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=\"Utw\u00f3rz niestandardowy blok Gutenberga \u2014 cz\u0119\u015b\u0107 5: Ustawienia inspektora\"><\/a><\/p>\n<p>Wewn\u0105trz najpierw tworzymy panel z <code>PanelBody<\/code>w\u0142a\u015bciwo\u015bciami <code>initialOpen<\/code>ustawionymi na true i m\u00f3wimy Gutenbergowi, \u017ce ten panel powinien by\u0107 domy\u015blnie otwarty. A potem od nas zale\u017cy, co doda\u0107 do ka\u017cdego z nich <code>PanelRow<\/code>.<\/p>\n<p>W przypadku komponentu <code>ToggleControl<\/code>u\u017cywamy tych samych w\u0142a\u015bciwo\u015bci, co poprzednio z danymi wej\u015bciowymi tekstowymi, z tym wyj\u0105tkiem, \u017ce zamiast w\u0142a\u015bciwo\u015bci <code>value<\/code>podajemy warto\u015b\u0107 atrybutu wewn\u0105trz w\u0142a\u015bciwo\u015bci <code>checked<\/code>. Dotyczy to wszelkich danych wej\u015bciowych, kt\u00f3re oczekuj\u0105 atrybutu check w zwyk\u0142ym HTML, na przyk\u0142ad p\u00f3l wyboru. W przypadku przycisk\u00f3w radiowych u\u017cyjesz prop <code>selected<\/code>, poniewa\u017c tego u\u017cyjesz r\u00f3wnie\u017c w zwyk\u0142ym HTML. Pami\u0119taj, \u017ce atrybut dla tego wej\u015bcia musi by\u0107 typu <code>boolean<\/code>.<\/p>\n<p>Je\u015bli chodzi o <code>CheckboxControl<\/code>obs\u0142ug\u0119 pojedynczego pola wyboru, dzia\u0142a dok\u0142adnie tak samo, jak <code>ToggleControl<\/code>\u2013 zwraca warto\u015b\u0107 logiczn\u0105, niezale\u017cnie od tego, czy jest zaznaczone, czy nie.<\/p>\n<p>Generuje list\u0119 rozwijan\u0105 wyboru i <code>SelectControl<\/code>oczekuje mo\u017cliwych wybor\u00f3w jako tablicy we w\u0142a\u015bciwo\u015bci <code>options<\/code>. Ka\u017cdy element musi by\u0107 obiektem o w\u0142a\u015bciwo\u015bciach <code>label<\/code>i <code>value<\/code>. To samo dotyczy p\u00f3l wyboru i przycisk\u00f3w opcji (<code>RadioControl<\/code>). W normalnych okoliczno\u015bciach prawdopodobnie wygenerujesz wybory jako zmienn\u0105 poza danymi wyj\u015bciowymi HTML.<\/p>\n<p>Mo\u017cesz zauwa\u017cy\u0107, \u017ce <code>ColorPicker<\/code>dzia\u0142a troch\u0119 inaczej ni\u017c inne, poniewa\u017c jest to bardziej z\u0142o\u017cony komponent, a nie standardowe wej\u015bcie HTML. Podaj rekwizyt <code>color<\/code>dla zapisanego koloru, a zamiast <code>onChange<\/code>(odpala raz po klikni\u0119ciu, ale tak\u017ce za ka\u017cdym razem, gdy zmienia si\u0119 warto\u015b\u0107 podczas przeci\u0105gania \u2013 co mo\u017ce skutkowa\u0107 wieloma po\u017carami) u\u017cyj <code>onChangeComplete<\/code>. Rekwizyt zwracany w tym zdarzeniu to r\u00f3wnie\u017c obiekt, w kt\u00f3rym musimy zdecydowa\u0107, kt\u00f3r\u0105 cz\u0119\u015b\u0107 chcemy zapisa\u0107 w naszym atrybucie. W tym przyk\u0142adzie chcemy zapisa\u0107 warto\u015b\u0107 szesnastkow\u0105 (bez alpha\/opacity), wi\u0119c wewn\u0105trz <code>setAttributes()<\/code>wyodr\u0119bniamy <code>hex<\/code>w\u0142a\u015bciwo\u015b\u0107 <code>color<\/code>zwracanego obiektu. Dlatego te\u017c dodajemy w\u0142a\u015bciwo\u015b\u0107<code>disableAlpha<\/code>aby usun\u0105\u0107 interfejs u\u017cytkownika kana\u0142u alfa (do kontrolowania przezroczysto\u015bci), poniewa\u017c nie ma sensu oferowa\u0107 tego u\u017cytkownikowi, gdy nigdy nie zapisujemy warto\u015bci przezroczysto\u015bci.<\/p>\n<p>Ka\u017cdy z komponent\u00f3w ma <code>label<\/code>dost\u0119pn\u0105 rekwizyt, z wyj\u0105tkiem pr\u00f3bnika kolor\u00f3w. Je\u015bli chcesz wypisa\u0107 etykiet\u0119 lub tekst przed ni\u0105, musisz pobawi\u0107 si\u0119 kodem HTML lub stylami, aby upewni\u0107 si\u0119, \u017ce wygl\u0105da dobrze.<\/p>\n<p>Mo\u017cesz oczywi\u015bcie doda\u0107 tyle paneli, ile chcesz, po prostu dodaj kolejny <code>PanelBody<\/code>komponent po poprzednim.<\/p>\n<p>Je\u015bli chcesz dowiedzie\u0107 si\u0119 wi\u0119cej o dodawaniu ustawie\u0144 blok\u00f3w, mam oddzielne samouczki dotycz\u0105ce bardziej z\u0142o\u017conych ustawie\u0144 i komponent\u00f3w dla Inspektora; <a href=\"https:\/\/wordpress.mediadoma.com\/pl\/jak-dodac-obraz-wybierz-w-niestandardowym-bloku-wordpress-gutenberg\/\" title=\"Jak doda\u0107 wyb\u00f3r obrazu\">Jak doda\u0107 wyb\u00f3r obrazu<\/a> i <a href=\"https:\/\/wordpress.mediadoma.com\/pl\/jak-dodac-ustawienia-kolorow-do-niestandardowego-bloku-gutenberga\/\" title=\"jak doda\u0107 panel ustawie\u0144 kolor\u00f3w\">jak doda\u0107 panel ustawie\u0144 kolor\u00f3w<\/a>.<\/p>\n<h3>Obs\u0142ugiwanie<code>save<\/code><\/h3>\n<p>Zostawi\u0142em <code>save<\/code>funkcj\u0119 tak, jak by\u0142o wcze\u015bniej. To zale\u017cy od Ciebie i wszystko zale\u017cy od tego, czym steruj\u0105 ustawienia na wyj\u015bciu. Wiesz ju\u017c, jak uzyska\u0107 warto\u015bci ka\u017cdego ustawienia. Jako przyk\u0142ad za\u0142\u00f3\u017cmy, \u017ce atrybut logiczny <code>activateLasers<\/code>kontroluje, czy niestandardowy element HTML jest renderowany. Je\u015bli atrybut jest <code>true<\/code>div powinien zosta\u0107 wypisany, w przeciwnym razie nie. Mo\u017cesz to zrobi\u0107 za pomoc\u0105 tradycyjnej opcji if-check lub u\u017cy\u0107 funkcji inline <code>if<\/code>i <code>&amp;&amp;<\/code>operatora JSX. Przeczytaj wi\u0119cej na ten temat w <a href=\"https:\/\/reactjs.org\/docs\/conditional-rendering.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">przewodniku React dotycz\u0105cym renderowania warunkowego<\/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>Poniewa\u017c u\u017cyjemy <code>RichText<\/code>tego wyj\u015bcia, nie b\u0119dzie on widoczny w edytorze, ale pojawi si\u0119 w interfejsie u\u017cytkownika.<\/p>\n<p>Wi\u0119cej komponent\u00f3w znajdziesz w <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\">repozytorium Github<\/a>. Wi\u0119kszo\u015b\u0107 z tych folder\u00f3w powinna zawiera\u0107 plik readme z dokumentacj\u0105, jak z niego korzysta\u0107. Wi\u0119kszo\u015b\u0107 tego nauczy\u0142em si\u0119, zagl\u0105daj\u0105c do tego repozytorium, a tak\u017ce do podstawowych komponent\u00f3w WordPressa, jak to zrobili.<\/p>\n<p>W <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\">nast\u0119pnym kroku serii<\/a> skupimy si\u0119 na kontrolowaniu paska narz\u0119dzi bloku. Dowiemy si\u0119, jak obs\u0142ugiwa\u0107 na przyk\u0142ad wyr\u00f3wnanie bloku i dodawa\u0107 niestandardowe przyciski do paska narz\u0119dzi.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>W tej lekcji samouczka Gutenberga skupimy si\u0119 na dodawaniu r\u00f3\u017cnych komponent\u00f3w do Inspektora &#8211; paska bocznego po prawej stronie w edytorze.<\/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":[897,721,721,940,940,897,1110,805,805,836,836,845,845,866,866],"tags":[1169],"class_list":{"0":"post-233496","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-kod","8":"category-deweloper","10":"category-gutenberg-7","13":"category-n-a","14":"category-php-7","16":"category-przewodnik-dla-poczatkujacych","18":"category-samouczki","20":"category-wordpress-7","22":"tag-affiai-pl"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/233496","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/comments?post=233496"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/233496\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/153128"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=233496"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=233496"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=233496"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}