{"id":233959,"date":"2023-02-26T12:26:00","date_gmt":"2023-02-26T09:26:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233959"},"modified":"2023-02-26T12:42:25","modified_gmt":"2023-02-26T09:42:25","slug":"jak-dodac-ustawienia-kolorow-do-niestandardowego-bloku-gutenberga","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/jak-dodac-ustawienia-kolorow-do-niestandardowego-bloku-gutenberga\/","title":{"rendered":"Jak doda\u0107 ustawienia kolor\u00f3w do niestandardowego bloku Gutenberga?"},"content":{"rendered":"\n<p>W tym po\u015bcie dowiesz si\u0119, jak doda\u0107 ustawienia kolor\u00f3w do niestandardowego bloku WordPress Gutenberg. Dowiemy si\u0119, jak doda\u0107 ten sam sk\u0142adnik ustawie\u0144 kolor\u00f3w, kt\u00f3ry umo\u017cliwia wyb\u00f3r kolor\u00f3w z palety i kolor\u00f3w niestandardowych, z kt\u00f3rych korzysta wiele domy\u015blnych blok\u00f3w WordPressa.<\/p>\n<p>Oto, co dodamy do naszego niestandardowego bloku:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151572-61e4cc69ead10.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-151572-61e4cc69ead10.png\" alt=\"Jak doda\u0107 ustawienia kolor\u00f3w do niestandardowego bloku Gutenberga?\"><\/a><\/p>\n<p>Korzystaj\u0105c z komponent\u00f3w Gutenberga, mo\u017cemy bardzo \u0142atwo zaimplementowa\u0107 t\u0119 palet\u0119\/sekcj\u0119 kolor\u00f3w do naszego w\u0142asnego niestandardowego bloku. Mo\u017cesz zdefiniowa\u0107 ustawienia kolor\u00f3w, aby wp\u0142yn\u0105\u0107 na dowolny kolor; t\u0142o, kolor tekstu, kolor obramowania lub cokolwiek innego. Mo\u017cesz tak\u017ce doda\u0107 tyle ustawie\u0144 kolor\u00f3w, ile chcesz, do tego panelu.<\/p>\n<p>Zanim zag\u0142\u0119bimy si\u0119 w kod, musisz wiedzie\u0107 o kilku rzeczach. Nie przechod\u017a dalej do kodu, poniewa\u017c nast\u0119pna sekcja wyja\u015bni wiele, dlaczego kod musi robi\u0107 to tak, jak robi.<\/p>\n<h2>Co musisz najpierw wiedzie\u0107<\/h2>\n<p>Komponenty do implementacji ustawie\u0144 palety\/koloru to iz <code>PanelColorSettings<\/code>pakietu. Komponent jest tak zwanym komponentem wy\u017cszego rz\u0119du i musi by\u0107 zaimplementowany nieco inaczej ni\u017c zwyk\u0142e wyprowadzanie normalnego komponentu. P\u00f3\u017aniej om\u00f3wi\u0119 troch\u0119 wi\u0119cej szczeg\u00f3\u0142\u00f3w. Ale najpierw musimy zda\u0107 sobie spraw\u0119 z podstaw, w jaki spos\u00f3b Gutenberg obs\u0142uguje ustawienia kolor\u00f3w blok\u00f3w.<code>withColors``wp.blockEditor``withColors<\/code><\/p>\n<h3>Jak klocki Gutenberga obs\u0142uguj\u0105 ustawienia kolor\u00f3w<\/h3>\n<p>Istniej\u0105 pewne zasady dotycz\u0105ce sposobu, w jaki Gutenberg obs\u0142uguje ustawienia kolor\u00f3w w blokach. Je\u015bli kiedykolwiek stylowa\u0142e\u015b motyw obs\u0142ugiwany przez Gutenberga, prawdopodobnie znasz ju\u017c te zasady. Mimo to szybko je przejrzymy, poniewa\u017c musimy sobie z tym poradzi\u0107 w naszym kodzie blokowym.<\/p>\n<ul>\n<li>Po wybraniu koloru z palety element bloku w\u0119z\u0142a otrzyma klas\u0119 okre\u015blonego wzoru. Zaj\u0119cia rozpoczynaj\u0105 si\u0119 od \u201e <code>has-<\/code>&quot;, a nast\u0119pnie pojawia si\u0119 \u015blimak z palety. Zako\u0144czenie zale\u017cy od tego, na jaki element ma wp\u0142ywa\u0107 kolor. Dla koloru tekstu ko\u0144czy si\u0119 na \u201e <code>-color<\/code>&#8222;. Dla koloru t\u0142a ko\u0144czy si\u0119 na \u201e <code>-background-color<\/code>&#8222;. Jako przyk\u0142ad, blok z kolorem palety \u201ered&#8221; wybranym jako kolor t\u0142a otrzyma klas\u0119 \u201e <code>has-red-background-color<\/code>&#8222;.<\/li>\n<li>Po wybraniu niestandardowego koloru (z selektora kolor\u00f3w), element bloku w\u0119z\u0142a otrzyma styl wbudowany z kodem szesnastkowym. Na przyk\u0142ad niestandardowy kolor #DD0000 wybrany jako kolor t\u0142a otrzyma atrybut \u201e <code>style=\"background-color: #DD0000;<\/code>&#8222;.<\/li>\n<\/ul>\n<p>Kiedy zaimplementujemy ustawienia kolor\u00f3w dla naszego bloku, b\u0119dziemy musieli zaimplementowa\u0107 poprawn\u0105 klas\u0119 i styl inline. Zrobimy to na ko\u0144cu tego samouczka.<\/p>\n<h3>Jak pracowa\u0107 z<code>withColors<\/code><\/h3>\n<p>Jak wspomniano wcze\u015bniej <code>withColors<\/code>, jest to <a href=\"https:\/\/reactjs.org\/docs\/higher-order-components.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sk\u0142adnik wy\u017cszego rz\u0119du<\/a>. Zasadniczo oznacza to, \u017ce jest to komponent, kt\u00f3ry pobiera komponent i zwraca nowy komponent. W zwr\u00f3conym komponencie otrzymujemy przydatne rekwizyty z komponentu wy\u017cszego rz\u0119du. M\u00f3wi\u0105c pro\u015bciej, u\u017cyjemy <code>withColors<\/code>do zwr\u00f3cenia w\u0142asnego komponentu dla naszego niestandardowego bloku. Nasz komponent blokowy otrzymuje niezb\u0119dne rekwizyty do pracy z kolorami z <code>withColors<\/code>.<\/p>\n<p>Komponent <code>withColors<\/code>obs\u0142uguje stan i wiele funkcji do pracy z kolorami. W tym procesie uzyskujemy du\u017c\u0105 automatyzacj\u0119. Jest to bardzo przydatne do ustalenia, czy wybrany kolor jest kolorem z palety (musimy doda\u0107 klas\u0119) czy kolorem niestandardowym (musimy doda\u0107 styl liniowy). <code>withColors<\/code>znacznie upro\u015bci\u0107 proces przechowywania wybranego koloru, niezale\u017cnie od tego, jaki jest, w atrybutach naszego bloku. A skoro mowa o atrybutach&#8230;<\/p>\n<h3>Atrybuty i<code>withColors<\/code><\/h3>\n<p>Oczywi\u015bcie tw\u00f3j blok potrzebuje atrybut\u00f3w do przechowywania wybranego koloru. Aby skorzysta\u0107 z automatyzacji withColor do przechowywania prawid\u0142owego koloru, musisz zdefiniowa\u0107 dwa atrybuty dla ka\u017cdego ustawienia koloru. Jeden do przechowywania informacji o kolorze palety, a drugi do przechowywania kodu szesnastkowego. S\u0105 jednak pewne zasady.<\/p>\n<p>Za\u0142\u00f3\u017cmy, \u017ce chcesz doda\u0107 ustawienie koloru dla koloru tekstu bloku \u2013 wi\u0119c decydujesz si\u0119 zdefiniowa\u0107 atrybut o trafnej nazwie \u201e <code>textColor<\/code>&#8222;. B\u0119dziesz wtedy musia\u0142 zdefiniowa\u0107 kolejny atrybut we wzorcu \u201e <code>customYourOriginalAttribute<\/code>&#8222;. W tym przyk\u0142adzie drugi atrybut b\u0119dzie musia\u0142 mie\u0107 nazw\u0119 \u201e <code>customTextColor<\/code>&#8222;. Zwr\u00f3\u0107 uwag\u0119 na camelCase (wielko\u015b\u0107 liter) tutaj. Pod\u0105\u017canie za tym wzorem <code>withColors<\/code>automatycznie:<\/p>\n<ul>\n<li>Je\u015bli zosta\u0142 wybrany kolor palety, atrybut \u201e <code>textColor<\/code>&#8221; b\u0119dzie zawiera\u0142 informacje o palecie.<\/li>\n<li>Je\u015bli zosta\u0142 wybrany kolor niestandardowy, \u201e <code>customTextColor<\/code>&#8221; zostanie uzupe\u0142niony kodem szesnastkowym.<\/li>\n<\/ul>\n<p>Te dwie rzeczy dzia\u0142aj\u0105 w tandemie. W przypadku wybrania koloru niestandardowego <code>textColor<\/code>automatycznie zostanie wy\u015bwietlony <code>undefined<\/code>, i na odwr\u00f3t.<\/p>\n<p>I na koniec, ostatnia rzecz do zapami\u0119tania: <strong>nie musisz u\u017cywa\u0107 <code>setAttributes()<\/code>do aktualizowania atrybut\u00f3w kolor\u00f3w<\/strong>! Dostarczone rekwizyty z <code>withColors<\/code>zawieraj\u0105 funkcj\u0119, kt\u00f3ra automatycznie aktualizuje Twoje atrybuty. Wystarczy, \u017ce przeka\u017cesz t\u0119 funkcj\u0119 do <code>onChange<\/code>zdarzenia do <code>PanelColorSettings<\/code>komponentu, a Twoje atrybuty zostan\u0105 automatycznie zaktualizowane.<\/p>\n<p>Ok, czas zobaczy\u0107 to wszystko w praktyce!<\/p>\n<h2>Wdra\u017canie ustawie\u0144 kolor\u00f3w w bloku niestandardowym<\/h2>\n<p>Na pocz\u0105tek mam do\u015b\u0107 bezu\u017cyteczny niestandardowy blok, kt\u00f3ry nie robi nic innego ni\u017c wy\u015bwietlanie zakodowanego tekstu. To po prostu u\u0142atwia oddzielenie tego, co potrzebujemy do kodu, aby doda\u0107 ustawienia kolor\u00f3w. Mam <a href=\"https:\/\/wordpress.mediadoma.com\/pl\/jak-stworzyc-niestandardowy-blok-wordpress-gutenberg-seria-samouczkow\/\" title=\"seri\u0119 samouczk\u00f3w na temat tworzenia w\u0142asnych niestandardowych blok\u00f3w\">seri\u0119 samouczk\u00f3w na temat tworzenia w\u0142asnych niestandardowych blok\u00f3w<\/a>, je\u015bli chcesz dowiedzie\u0107 si\u0119 wi\u0119cej.<\/p>\n<p>Uwaga: pisz\u0119 ca\u0142y kod w ES6\/ESNext. Obejmuje to funkcje strza\u0142ek, kt\u00f3re wymagaj\u0105 szczeg\u00f3lnej uwagi podczas konfiguracji Babel\/webpack. Je\u015bli otrzymujesz b\u0142\u0119dy w kt\u00f3rym\u015b z poni\u017cszych kod\u00f3w, post\u0119puj zgodnie z moim <a href=\"https:\/\/wordpress.mediadoma.com\/pl\/kompletny-przewodnik-po-tworzeniu-srodowiska-programistycznego-dla-gutenberg\/\" title=\"przewodnikiem, jak skonfigurowa\u0107 Webpack i Babel dla ES6\/ESNext\">przewodnikiem, jak skonfigurowa\u0107 Webpack i Babel dla ES6\/ESNext<\/a> lub dostosuj kod, aby nie u\u017cywa\u0142 \u201eeksperymentalnych sk\u0142adni&#8221;.<\/p>\n<p>To jest m\u00f3j podstawowy niestandardowy blok przed zrobieniem czegokolwiek z ustawieniami kolor\u00f3w:<\/p>\n<pre><code>const { registerBlockType } = wp.blocks;\nconst { __ } = wp.i18n;\n\u00a0\nconst BlockWithColorSettings = (props) =&gt; {\n    return(\n        &lt;div&gt;\n            PanelColorSettings Demo\n        &lt;\/div&gt;\n    );\n}\n\u00a0\nregisterBlockType('awp\/colorsettings', {\n    title: __('Color Settings Demo'),\n    icon: 'carrot',\n    category: 'common',\n    edit: BlockWithColorSettings,\n    save: (props) =&gt; { \n        return(\n            &lt;div&gt;\n                PanelColorSettings Demo\n            &lt;\/div&gt;\n        );\n    }\n});<\/code><\/pre>\n<p>To do\u015b\u0107 podstawowe. Zauwa\u017c, \u017ce <code>edit<\/code>funkcja po prostu odwo\u0142uje si\u0119 do oddzielnego komponentu <code>BlockWithColorSettings<\/code>, zamiast pisa\u0107 go w linii. U\u0142atwia to <code>withColors<\/code>p\u00f3\u017aniejsz\u0105 implementacj\u0119.<\/p>\n<p>Dobra, czas na wprowadzenie ustawie\u0144 kolorystycznych do naszego bloku! Jako przyk\u0142ad chc\u0119 ustawi\u0107 kolor tekstu.<\/p>\n<h3>Dodawanie atrybut\u00f3w<\/h3>\n<p>Jak wspomniano wcze\u015bniej, musimy zdefiniowa\u0107 dwa atrybuty dla ka\u017cdego ustawienia koloru. I musimy zachowa\u0107 szczeg\u00f3ln\u0105 ostro\u017cno\u015b\u0107 w ich nazewnictwie. Chc\u0119 doda\u0107 atrybut koloru tekstu, wi\u0119c nazywam ten atrybut <code>textColor<\/code>. Co oznacza, \u017ce \u200b\u200bdodam r\u00f3wnie\u017c atrybut <code>customTextColor<\/code>. Oba powinny by\u0107 typu string.<\/p>\n<pre><code>...\nregisterBlockType('awp\/colorsettings', {\n    title: __('Color Settings Demo'),\n    icon: 'carrot',\n    category: 'common',\n    attributes: {\n        textColor: {\n            type: 'string'\n        },\n        customTextColor: {\n            type: 'string'\n        },\n    },\n    edit: BlockWithColorSettings,\n    save: (props) =&gt; { \n    ...<\/code><\/pre>\n<p>Nasze atrybuty s\u0105 gotowe do przechowywania ustawie\u0144 koloru tekstu bloku. Teraz nadszed\u0142 czas na wdro\u017cenie <code>withColors<\/code>i <code>PanelColorSettings<\/code>.<\/p>\n<h3>Realizowanie<code>withColors<\/code><\/h3>\n<p>Jak wspomniano wcze\u015bniej <code>withColors<\/code>, jest to sk\u0142adnik wy\u017cszego rz\u0119du, kt\u00f3ry powinien zwr\u00f3ci\u0107 sk\u0142adnik. Oczywi\u015bcie chcemy, aby zwraca\u0142 nasz komponent edycji, <code>BlockWithColorSettings<\/code>. Ale jako parametr <code>withColors<\/code>podajemy obiekt.<\/p>\n<p>W przekazanym obiekcie <code>withColors<\/code>musimy powiedzie\u0107, <code>withColors<\/code>jakiego atrybutu chcemy u\u017cy\u0107 do przechowywania koloru i jakiego rodzaju elementu b\u0119dzie on kolorowa\u0142 (w naszym przypadku text color, co oznacza regu\u0142\u0119 CSS \u201ecolor&#8221;). Informowanie o regule CSS daje pewno\u015b\u0107, \u017ce zwracane nazwy klas s\u0105 poprawne. Poniewa\u017c jest to kolor tekstu, chcemy mie\u0107 nazwy klas, takie jak \u201ema kolor&#8221;.<\/p>\n<p>Najpierw troch\u0119 destrukturyzacji na g\u00f3rze. <code>withColors<\/code>znajduje si\u0119 w <code>wp.blockEditor<\/code>pakiecie.<\/p>\n<pre><code>const { withColors } = wp.blockEditor;<\/code><\/pre>\n<p>Zmienimy <code>edit<\/code>funkcj\u0119 na:<\/p>\n<pre><code>    ...\n    attributes: {\n        ...\n    },\n    edit: withColors({textColor: 'color'})(BlockWithColorSettings),\n    save: (props) =&gt; { \n        ...<\/code><\/pre>\n<p>Dzi\u0119ki temu kodowi nasz komponent <code>BlockWithColorSettings<\/code>otrzyma dodatkowe rekwizyty:<\/p>\n<ul>\n<li><code>props.textColor<\/code>: Jest obiektem, kt\u00f3ry zawiera wszystkie informacje o wybranym kolorze. Je\u015bli zosta\u0142 wybrany kolor palety, b\u0119dzie on przechowywa\u0107 w\u0142a\u015bciwo\u015bci kodu szesnastkowego, informacji o pracy palety, nazwy klasy i nie tylko. Je\u015bli wybrano kolor niestandardowy, obiekt b\u0119dzie zawiera\u0142 kod szesnastkowy. Kod szesnastkowy zawsze znajduje si\u0119 we w\u0142a\u015bciwo\u015bci <code>color<\/code>. A nazwa klasy (tylko je\u015bli zosta\u0142 wybrany kolor palety) zostanie ustawiona we w\u0142a\u015bciwo\u015bci <code>class<\/code>.<\/li>\n<li><code>props.setTextColor<\/code>: Funkcja, kt\u00f3ra zaktualizuje dla nas nasze atrybuty. Zapewniamy to dla <code>onChange<\/code>zdarzenia ustawie\u0144 kolor\u00f3w, jak zobaczymy p\u00f3\u017aniej. Funkcja zaktualizuje zar\u00f3wno atrybuty, jak <code>textColor<\/code>i. <code>customTextColor<\/code>Poniewa\u017c przestrzegali\u015bmy zasad nazewnictwa, zostanie on automatycznie zaktualizowany <code>customTextColor<\/code>, mimo \u017ce nigdy nie podali\u015bmy tej nazwy atrybutu.<\/li>\n<\/ul>\n<p>Zauwa\u017c, \u017ce funkcja \u201eset&#8221; dostarczona jako prop b\u0119dzie zgodna z regu\u0142\u0105: \u201e <code>setYourAttributeName<\/code>&#8222;. Poniewa\u017c podali\u015bmy <code>textColor<\/code>, funkcja ma nazw\u0119 <code>setTextColor<\/code>. Gdyby\u015bmy zamiast tego nazwali nasz atrybut <code>awesomeColor<\/code>i dostarczyli to w <code>withColors<\/code>obiekcie, funkcja set-by\u0142a nazwana <code>setAwesomeColor()<\/code>.<\/p>\n<h3>Realizowanie<code>PanelColorSettings<\/code><\/h3>\n<p>Kolejnym krokiem jest wdro\u017cenie w\u0142a\u015bciwej sekcji Inspektora. W tym celu dodajemy <code>PanelColorSettings<\/code>wewn\u0105trz <code>InspectorControls<\/code>komponentu. Poniewa\u017c React wymaga, aby wszystko znajdowa\u0142o si\u0119 w jednym w\u0119\u017ale g\u0142\u00f3wnym, u\u017cywamy r\u00f3wnie\u017c <code>Fragment<\/code>(from <code>wp.elements<\/code>) do owini\u0119cia wszystkiego wewn\u0105trz.<\/p>\n<p>Najpierw troch\u0119 destrukturyzacji na g\u00f3rze pliku:<\/p>\n<pre><code>const { Fragment } = wp.element;\nconst { InspectorControls, PanelColorSettings, withColors } = wp.blockEditor;<\/code><\/pre>\n<p>I aktualizujemy nasz <code>BlockWithColorSettings<\/code>komponent do czego\u015b takiego:<\/p>\n<pre><code>const BlockWithColorSettings = (props) =&gt; {\n    const { textColor, setTextColor } = props;  \/\/ Props received from withColors\n    return(\n        &lt;Fragment&gt;\n            &lt;InspectorControls&gt;\n                &lt;PanelColorSettings \n                    title={__('Color settings')}\n                    colorSettings={[\n                        {\n                            value: textColor.color,\n                            onChange: setTextColor,\n                            label: __('Text color')\n                        },\n                    ]}\n                \/&gt;\n            &lt;\/InspectorControls&gt;\n            &lt;div&gt;\n                PanelColorSettings Demo\n            &lt;\/div&gt;\n        &lt;\/Fragment&gt;\n    );\n}<\/code><\/pre>\n<p>Jak wida\u0107 <code>#2<\/code>, destrukturyzujemy rekwizyty otrzymane z <code>withColors<\/code>, <code>textColor<\/code>oraz <code>setTextColor<\/code>. Pami\u0119taj, \u017ce <code>props.textColor<\/code>jest to obiekt otrzymany z <code>withColors<\/code>, i <code>props.attributes.textColor<\/code>jest atrybutem. Nie musimy jednak odwo\u0142ywa\u0107 si\u0119 do atrybutu.<\/p>\n<p>Jako rekwizyty do komponentu <code>PanelColorSettings<\/code>mo\u017cemy poda\u0107 tytu\u0142 sekcji (tytu\u0142 w zwijanym polu w Inspektorze). Wa\u017cn\u0105 rzecz\u0105 jest tutaj rekwizyt, w <code>colorSettings<\/code>kt\u00f3rym musimy zapewni\u0107 szereg obiekt\u00f3w ustawiaj\u0105cych kolory. Dla ka\u017cdego ustawienia koloru (obecnie mamy tylko jedno) musimy poda\u0107 pewne w\u0142a\u015bciwo\u015bci. W\u0142a\u015bciwo\u015b\u0107 <code>value<\/code>oczekuje aktualnie wybranego kodu szesnastkowego (mimo \u017ce wybrano kolor palety). Jest to dla nas przewidziane w <code>textColor<\/code>rekwizycie, we wn\u0119trzu posesji <code>color<\/code>. Dla <code>onChange<\/code>w\u0142a\u015bciwo\u015bci podajemy po prostu funkcj\u0119 \u201eustaw&#8221; dostarczon\u0105 przez <code>withColors<\/code>, <code>setTextColor<\/code>. I na koniec powinni\u015bmy poda\u0107 <code>label<\/code>, aby u\u017cytkownik wiedzia\u0142, na jaki element wp\u0142ynie ten kolor. Pojawi si\u0119 tu\u017c nad obszarem wyboru koloru.<\/p>\n<p>Oto jak nasz komponent pojawia si\u0119 teraz w edytorze Gutenberg:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151572-61e4cc6b47b23.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-151572-61e4cc6b47b23.png\" alt=\"Jak doda\u0107 ustawienia kolor\u00f3w do niestandardowego bloku Gutenberga?\"><\/a><\/p>\n<p>Teraz z powodzeniem aktualizuje nasze atrybuty przy wyborze kolor\u00f3w. Wida\u0107, \u017ce zapami\u0119tuje wybrany przez Ciebie kolor podczas zapisywania posta.<\/p>\n<p>Jednak nic nie dzieje si\u0119 wizualnie, gdy zmieniasz kolory. Wyb\u00f3r koloru jest przechowywany w atrybutach, ale zmiana koloru nie nast\u0119puje w edytorze ani podczas podgl\u0105du posta. Dzieje si\u0119 tak, poniewa\u017c musimy doda\u0107 kod dla klas i styl\u00f3w bloku. Musimy to zrobi\u0107 zar\u00f3wno dla <code>edit<\/code>funkcji (czyli dla edytora), jak i <code>save<\/code>funkcji (frontend). To kolejny krok.<\/p>\n<h3>Obs\u0142uga styl\u00f3w klasowych i wbudowanych w<code>edit<\/code><\/h3>\n<p>Musimy zbudowa\u0107 klas\u0119 w\u0119z\u0142a i atrybuty stylu bloku zgodnie z wybranym ustawieniem koloru. Na szcz\u0119\u015bcie <code>withColors<\/code>otrzymujemy w tym pewn\u0105 automatyzacj\u0119. Pami\u0119taj, \u017ce <code>props.textColor<\/code>jest to obiekt, kt\u00f3ry zawiera wszystkie potrzebne nam informacje, w tym nazw\u0119 klasy.<\/p>\n<p>Mogliby\u015bmy zrobi\u0107 co\u015b takiego:<\/p>\n<pre><code>...\nconst BlockWithColorSettings = (props) =&gt; {\n    const { textColor, setTextColor } = props;  \/\/ Props received from withColors\n    let divClass;\n    let divStyles = {};\n    if (textColor != undefined) {\n        if (textColor.class != undefined) {\n            divClass = textColor.class;\n        } else {\n            divStyles.color = textColor.color;\n        }\n    }\n    return(\n        &lt;Fragment&gt;\n            &lt;InspectorControls&gt;\n                ...\n            &lt;\/InspectorControls&gt;\n            &lt;div className={divClass} style={divStyles}&gt;\n                PanelColorSettings Demo\n            &lt;\/div&gt;\n            ...<\/code><\/pre>\n<p>W linii <code>#20<\/code>stosujemy klas\u0119 krytyczn\u0105 i styl inline do w\u0119z\u0142a g\u0142\u00f3wnego naszego bloku. Wcze\u015bniej budujemy atrybut class i inline style, sprawdzaj\u0105c <code>props.textColor<\/code>obiekt.<\/p>\n<p>Po tej zmianie Tw\u00f3j niestandardowy blok powinien by\u0107 teraz w pe\u0142ni funkcjonalny w edytorze. Za ka\u017cdym razem, gdy zmienisz kolor, blok zmieni kolor tekstu. Wspania\u0142y! Ostatnim krokiem jest zrobienie tego r\u00f3wnie\u017c dla <code>save<\/code>funkcji, tak aby te klasy i style r\u00f3wnie\u017c dosta\u0142y si\u0119 do interfejsu.<\/p>\n<h3>Obs\u0142uga styl\u00f3w klasowych i wbudowanych w<code>save<\/code><\/h3>\n<p>Koncepcja budowania klas i styl\u00f3w wbudowanych oraz stosowania ich do w\u0119z\u0142a g\u0142\u00f3wnego jest taka sama <code>save<\/code>jak w programie <code>edit<\/code>. Ale jest zasadnicza r\u00f3\u017cnica. W <code>save<\/code>nie mamy rekwizyt\u00f3w dostarczonych przez <code>withColors<\/code>. I nie mo\u017cemy doda\u0107 do <code>save<\/code>funkcji komponent\u00f3w wy\u017cszego rz\u0119du. Tak wi\u0119c w <code>save<\/code>funkcji wszystkie informacje jakie posiadamy s\u0105 atrybutami.<\/p>\n<p>To dobra praktyczna zasada, aby unikn\u0105\u0107 zakodowania \u201ema-&#8221; nazw klas. Co si\u0119 stanie, je\u015bli WordPress zdecyduje si\u0119 zmieni\u0107 t\u0119 zasad\u0119 w przysz\u0142o\u015bci? Na szcz\u0119\u015bcie mamy funkcj\u0119, kt\u00f3ra mo\u017ce nam pom\u00f3c wygenerowa\u0107 dla nas odpowiednie nazwy klas: <code>getColorClassName()<\/code>.<\/p>\n<p>Zanim zapomnimy, zniszczmy to. Jest r\u00f3wnie\u017c w <code>wp.blockEditor<\/code>opakowaniu.<\/p>\n<pre><code>const { InspectorControls, PanelColorSettings, withColors, getColorClassName } = wp.blockEditor;<\/code><\/pre>\n<p>U\u017cycie <code>getColorClassName()<\/code>funkcji wymaga dw\u00f3ch parametr\u00f3w. Najpierw ci\u0105g dla regu\u0142y CSS. Poniewa\u017c nasze ustawienie kolor\u00f3w dotyczy koloru tekstu, zapewniamy \u201e <code>color<\/code>&#8222;. To m\u00f3wi funkcji, \u017ce powinna zwr\u00f3ci\u0107 nazw\u0119 klasy \u201ema-co\u015b-kolor&#8221;, a nie \u201ema-co\u015b-kolor-t\u0142a&#8221;. Jako drugi parametr musimy poda\u0107 warto\u015b\u0107 atrybutu.<\/p>\n<p>Atrybut style jest po prostu budowany przez ustawienie \u201ecolor&#8221; na warto\u015b\u0107 atrybutu <code>customTextColor<\/code>, je\u015bli jest zdefiniowany.<\/p>\n<pre><code>save: (props) =&gt; { \n    const { textColor, customTextColor } = props.attributes;\n    let divClass;\n    let divStyles = {};\n    if (textColor != undefined) {\n        divClass = getColorClassName('color', textColor);\n    }\n    if (customTextColor != undefined) {\n        divStyles.color = customTextColor;\n    }\n    return(\n        &lt;div className={divClass} style={divStyles}&gt;\n            PanelColorSettings Demo\n        &lt;\/div&gt;\n    );\n}<\/code><\/pre>\n<p>I oczywi\u015bcie nie zapomnij zastosowa\u0107 klasy i stylu do w\u0119z\u0142a g\u0142\u00f3wnego swojego bloku; jak w kolejce <code>#12<\/code>.<\/p>\n<p>PS: Je\u015bli testujesz sw\u00f3j blok w edytorze podczas pisania tego kodu, otrzymasz teraz b\u0142\u0105d bloku. Dzieje si\u0119 tak, poniewa\u017c teraz zmienili\u015bmy dane wyj\u015bciowe <code>save<\/code>funkcji i cokolwiek zapisa\u0142e\u015b wcze\u015bniej, jest w konflikcie. B\u0119dziesz musia\u0142 usun\u0105\u0107 blok i ponownie go doda\u0107.<\/p>\n<p>Po tej zmianie tw\u00f3j blok powinien teraz poprawnie zastosowa\u0107 wybrany kolor tekstu r\u00f3wnie\u017c w interfejsie.<\/p>\n<p>I to wszystko! Pomy\u015blnie zaimplementowa\u0142e\u015b ustawienia kolor\u00f3w do swojego bloku. Je\u015bli chcesz doda\u0107 wiele ustawie\u0144 kolor\u00f3w (nie tylko kolor tekstu), czytaj dalej.<\/p>\n<h2>Uwaga na temat wielu ustawie\u0144 kolor\u00f3w<\/h2>\n<p>Do tej pory powiniene\u015b by\u0107 w stanie zaimplementowa\u0107 wiele ustawie\u0144 kolor\u00f3w. Mo\u017cesz doda\u0107 ustawienia koloru t\u0142a, koloru tekstu, koloru obramowania lub czegokolwiek innego do swojego bloku. W tej sekcji zrobi\u0119 szybki przegl\u0105d tego, co musimy zrobi\u0107, aby zaimplementowa\u0107 wiele ustawie\u0144 kolor\u00f3w.<\/p>\n<p>Za\u0142\u00f3\u017cmy, \u017ce chc\u0119 doda\u0107 kolor t\u0142a do mojego bloku.<\/p>\n<p>Najpierw musz\u0119 zdefiniowa\u0107 nowy atrybut o nazwie tw\u00f3rczo <code>backgroundColor<\/code>. Zdefiniuj\u0119 te\u017c inny atrybut <code>customBackgroundColor<\/code>.<\/p>\n<p>W <code>edit<\/code>funkcji zmieniam udost\u0119pniony obiekt na <code>withColors<\/code>taki:<\/p>\n<pre><code>withColors({textColor: 'color', backgroundColor: 'background-color'})<\/code><\/pre>\n<p>Oznacza to <code>withColors<\/code>, \u017ce m\u00f3j <code>textColor<\/code>atrybut jest dla regu\u0142y CSS \u201e <code>color<\/code>&#8221; (dla koloru tekstu), a atrybut <code>backgroundColor<\/code>jest dla regu\u0142y CSS \u201e <code>background-color<\/code>&#8222;. <code>withColors<\/code>automatycznie rozpozna i zaktualizuje r\u00f3wnie\u017c atrybuty i <code>customTextColor<\/code>.<code>customBackgroundColor<\/code><\/p>\n<p>W <code>PanelColorSettings<\/code>komponencie dostarczam kolejny obiekt do tablicy do prop <code>colorSettings<\/code>. Tak jak:<\/p>\n<pre><code>&lt;PanelColorSettings \n    title={__('Color settings')}\n    colorSettings={[\n        {\n            value: textColor.color,\n            onChange: setTextColor,\n            label: __('Text color')\n        },\n        {\n            value: backgroundColor.color,\n            onChange: setBackgroundColor,\n            label: __('Background color')\n        },\n    ]}\n\/&gt;<\/code><\/pre>\n<p>Dzi\u0119ki temu powiniene\u015b uzyska\u0107 dwa oddzielne ustawienia kolor\u00f3w w polu Inspektora dla ustawie\u0144 kolor\u00f3w.<\/p>\n<p>Ostatnim krokiem jest zbudowanie odpowiednich nazw klas i styl\u00f3w w obu <code>edit<\/code>i <code>save<\/code>. Jest to do\u015b\u0107 prosty krok, poniewa\u017c jest to po prostu poprawne budowanie ci\u0105gu lub obiektu stylu. Pami\u0119taj, \u017ce nazwa Twojej klasy musi obs\u0142ugiwa\u0107 wiele klas kolor\u00f3w (np. je\u015bli wybrano zar\u00f3wno kolor tekstu, jak i kolor t\u0142a). Po prostu dodaj spacj\u0119 mi\u0119dzy ka\u017cd\u0105 nazw\u0105 klasy.<\/p>\n<p>PS: Je\u015bli potrzebujesz obs\u0142u\u017cy\u0107 wiele nazw klas dla swojego bloku, mo\u017cesz skorzysta\u0107 z zainstalowania <code>classnames<\/code>pakietu. Prawie wszystkie komponenty w Gutenbergu u\u017cywaj\u0105 tej biblioteki do \u0142atwiejszego \u0142\u0105czenia nazw klas.<\/p>\n<h2>Wniosek i pe\u0142ny kod<\/h2>\n<p>Powiniene\u015b si\u0119 teraz nauczy\u0107, jak zaimplementowa\u0107 ustawienia kolor\u00f3w w swoim bloku niestandardowym. Mam nadziej\u0119, \u017ce to ci si\u0119 przyda! Musia\u0142em doda\u0107 t\u0119 funkcj\u0119 do mojego projektu i naprawd\u0119 nie mog\u0142em znale\u017a\u0107 \u017cadnych informacji ani dobrej dokumentacji. Jest to wi\u0119c efekt utrwalenia wszystkiego, czego si\u0119 dowiedzia\u0142em na ten temat, po wielu pr\u00f3bach i b\u0142\u0119dach.<\/p>\n<p>Oto ko\u0144cowy kod, \u0142\u0105cznie, dla przyk\u0142adowego bloku niestandardowego z ustawieniem koloru tekstu:<\/p>\n<pre><code>const { registerBlockType } = wp.blocks;\nconst { __ } = wp.i18n;\nconst { Fragment } = wp.element;\nconst { InspectorControls, PanelColorSettings, withColors, getColorClassName } = wp.blockEditor;\n\u00a0\nconst BlockWithColorSettings = (props) =&gt; {\n    const { textColor, setTextColor } = props;  \/\/ Props received from withColors\n\u00a0\n    let divClass;\n    let divStyles = {};\n    if (textColor != undefined) {\n        if (textColor.class != undefined) {\n            divClass = textColor.class;\n        } else {\n            divStyles.color = textColor.color;\n        }\n    }\n    return(\n        &lt;Fragment&gt;\n            &lt;InspectorControls&gt;\n                &lt;PanelColorSettings \n                    title={__('Color settings')}\n                    colorSettings={[\n                        {\n                            value: textColor.color,\n                            onChange: setTextColor,\n                            label: __('Text color')\n                        },\n                    ]}\n                \/&gt;\n            &lt;\/InspectorControls&gt;\n            &lt;div className={divClass} style={divStyles}&gt;\n                PanelColorSettings Demo\n            &lt;\/div&gt;\n        &lt;\/Fragment&gt;\n    );\n}\n\u00a0\nregisterBlockType('awp\/colorsettings', {\n    title: __('Color Settings Demo'),\n    icon: 'carrot',\n    category: 'common',\n    attributes: {\n        textColor: {\n            type: 'string'\n        },\n        customTextColor: {\n            type: 'string'\n        },\n    },\n    edit: withColors({textColor: 'color'})(BlockWithColorSettings),\n    save: (props) =&gt; { \n        const { textColor, customTextColor } = props.attributes;\n        let divClass;\n        let divStyles = {};\n        if (textColor != undefined) {\n            divClass = getColorClassName('color', textColor);\n        }\n        if (customTextColor != undefined) {\n            divStyles.color = customTextColor;\n        }\n        return(\n            &lt;div className={divClass} style={divStyles}&gt;\n                PanelColorSettings Demo\n            &lt;\/div&gt;\n        );\n    }\n});<\/code><\/pre>\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>Ten post szczeg\u00f3\u0142owo opisuje, jak doda\u0107 ustawienia kolor\u00f3w do niestandardowego bloku WordPress Gutenberg, we w\u0142a\u015bciwy spos\u00f3b &#8211; tak jak robi\u0105 to bloki WordPress.<\/p>\n","protected":false},"author":1,"featured_media":151573,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[940,940,1110,805,805,815,845,845,866,866,815],"tags":[1169],"class_list":["post-233959","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-gutenberg-7","category-n-a","category-php-7","category-wtyczki","category-samouczki","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/233959","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=233959"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/233959\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/151573"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=233959"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=233959"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=233959"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}