Ustvarjanje uporabniškega vmesnika z nastavitvami za blok WordPress po meri PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Ustvarjanje uporabniškega vmesnika z nastavitvami za blok WordPress po meri

Doslej smo obravnavali, kako delati s podatki iz zunanjega API-ja v prilagojenem bloku WordPress. Sprehodili smo se skozi proces pridobivanje teh podatkov za uporabo na sprednji strani spletnega mesta WordPress in kako upodobite neposredno v urejevalniku blokov WordPress pri umestitvi bloka v vsebino. Tokrat bomo ta dva članka premostili tako, da se vključimo v nadzorno ploščo urejevalnika blokov in ustvarimo uporabniški vmesnik z nastavitvami za blok, ki smo ga naredili.

Delo z zunanjimi API-ji v blokih WordPress

Saj poznate nadzorno ploščo, o kateri govorim, kajne? Tista plošča na desni vsebuje nastavitve objave in blokiranja v urejevalniku blokov.

Ustvarjanje uporabniškega vmesnika z nastavitvami za blok WordPress po meri

Vidite tisto rdeče poudarjeno območje? To je nadzorna plošča. Blok odstavka je trenutno izbran in nastavitve zanj so prikazane na plošči. Spreminjamo lahko sloge, barve, tipografijo ... številne stvari!

No, točno to počnemo tokrat. Ustvarili bomo kontrolnike za nastavitve bloka Football Rankings, na katerem smo delali v zadnjih dveh člankih. Zadnjič smo v našem bloku naredili gumb, ki pridobiva zunanje podatke za nogometno lestvico. Poznali smo že URL in končne točke, ki jih potrebujemo. Kaj pa, če želimo pridobiti uvrstitev za drugo državo? Ali morda druga liga? Kaj pa podatki iz druge sezone?

Za to potrebujemo nadzor obrazca. Lahko bi uporabili interaktivne komponente React - kot je React-Select — za brskanje po različnih možnostih API-ja, ki so na voljo za razčlenjevanje teh podatkov. Toda za to ni potrebe, saj je WordPress opremljen s kupom osnovnih komponent, na katere se neposredno priključimo!

O Dokumentacija za te komponente — imenovan InspectorControls — se izboljšuje v Priročnik za urejevalnik blokov WordPress. To bo sčasoma še boljše, medtem pa imamo tudi WordPress Gutenberg Storybook in Komponente WordPress Gutenberg strani za dodatno pomoč.

Arhitektura API-ja

Preden se zataknemo v karkoli, je dobro, da si začrtamo, kaj sploh potrebujemo. Začrtal sem strukturo podatkov RapidAPI, ki jih pridobivamo, da vemo, kaj nam je na voljo:

Diagram poteka, ki povezuje končne točke API-ja za podatke o blokih WordPress po meri, ki so pridobljeni.
Zasluge: API-Nogomet

Sezone in države sta dve končni točki najvišje ravni, ki se preslikata v končno točko lige. Od tam imamo preostale podatke, ki jih že uporabljamo za zapolnjevanje razvrstitvene tabele. Torej želimo ustvariti nastavitve v urejevalniku blokov WordPress, ki filtrirajo podatke glede na sezono, državo in ligo, nato pa te filtrirane podatke posredovati v razvrstitveno tabelo. To nam daje možnost, da opustimo blok na kateri koli strani ali objavi v WordPressu in prikažemo različice podatkov v bloku.

Da bi dosegli lestvico, moramo najprej pridobiti lige. In da bi dobili lige, moramo najprej pridobiti države in/ali sezone. Različne končne točke si lahko ogledate na nadzorni plošči RapidAPI.

Cel zaslon za nadzorno ploščo Rapid API, ki vizualizira podatke API.
Ustvarjanje uporabniškega vmesnika z nastavitvami za blok WordPress po meri

Obstajajo različne kombinacije podatkov, ki jih lahko uporabimo za zapolnitev uvrstitev, in morda boste imeli prednost, katere podatke želite. Zaradi tega članka bomo na plošči z nastavitvami blokov ustvarili naslednje možnosti:

  • Izberite državo
  • Izberite ligo
  • Izberite Sezona

Nato bomo imeli gumb za predložitev teh izbir in pridobitev ustreznih podatkov ter jih posredovali v razvrstitveno tabelo.

Naložite in shranite seznam držav

Ne moremo izbrati, za katero državo želimo podatke, če nimamo seznama držav, med katerimi lahko izbiramo. Torej, naša prva naloga je pridobiti seznam držav iz RapidAPI.

Idealno je pridobiti seznam držav, ko je blok dejansko uporabljen v vsebini strani ali objave. Če blok ni v uporabi, vam ni treba ničesar pridobiti. Pristop je zelo podoben temu, kar smo naredili v prvi članek, razlika je v tem, da uporabljamo drugo končno točko API-ja in druge atribute za shranjevanje seznama vrnjenih držav. Obstajajo tudi drugi načini WordPressa za pridobivanje podatkov, npr api-fetch, vendar je to zunaj obsega tega, kar počnemo tukaj.

Seznam držav lahko vključimo ročno, potem ko ga kopiramo iz podatkov API-ja, ali pa uporabimo ločen API ali knjižnico za zapolnitev držav. Toda API, ki ga uporabljamo, že ima seznam držav, zato bi uporabil samo eno od njegovih končnih točk. Poskrbimo, da se začetni seznam držav naloži, ko je blok vstavljen na stran ali objavi vsebino v urejevalniku blokov:

// edit.js
const [countriesList, setCountriesList] = useState(null);

useEffect(() => {
  let countryOptions = {
    method: "GET",
    headers: {
      "X-RapidAPI-Key": "Your Rapid API key",
      "X-RapidAPI-Host": "api-football-v1.p.rapidapi.com",
    },
  };
  fetch("https://api-football-v1.p.rapidapi.com/v3/countries", countryOptions)
    .then( (response) => response.json() )
    .then( (response) => {
      let countriesArray = { ...response };
      console.log("Countries list", countriesArray.response);
      setCountriesList(countriesArray.response);
    })
  .catch((err) => console.error(err));
}, []);

Za shranjevanje seznama držav imamo spremenljivko stanja. Nato bomo uvozili komponento iz @wordpress/urejevalnik blokov paket poklican InspectorControls kjer se nahajajo vse komponente, ki jih potrebujemo za ustvarjanje kontrolnikov nastavitev.

import { InspectorControls } from "@wordpress/block-editor";

Paket je GitHub repo dobro razlaga InspectorControls. V našem primeru ga lahko uporabimo za nadzor nastavitev podatkov API-ja, kot so država, liga in sezona. Tukaj je predogled, da boste dobili predstavo o uporabniškem vmesniku, ki ga ustvarjamo:

Uporabniški vmesnik z nastavitvami po meri za blok WordPress, ki prikazuje tri možnosti nastavitev za blok po meri in modri gumb za pridobivanje podatkov.
Ustvarjanje uporabniškega vmesnika z nastavitvami za blok WordPress po meri

In ko so te izbire narejene v nastavitvah bloka, jih uporabimo blokov Edit funkcija:


  { countriesList && (
    
  )}

Tukaj se prepričam, da uporabljamo pogojno upodabljanje, tako da funkcija naloži samo komponento po naloži se seznam držav. Če se sprašujete o tem LeagueSettings komponento, je komponenta po meri, ki sem jo ustvaril v ločenem components podmapo v bloku, da smo lahko bolj čisti in organizirani Edit namesto na stotine vrstic podatkov o državah, ki jih je treba obravnavati v eni sami datoteki.

Struktura datoteke za imenik blokov, ki prikazuje trenutno datoteko.
Ustvarjanje uporabniškega vmesnika z nastavitvami za blok WordPress po meri

Lahko ga uvozimo v edit.js datoteka, kot je ta:

import { LeagueSettings } from "./components/LeagueSettings";

Nato posredujemo zahtevane rekvizite na LeagueSettings komponenta od starša Edit tako da lahko dostopamo do spremenljivk stanja in atributov iz LeagueSettings otroška komponenta. To lahko storimo tudi z drugimi metodami, kot je Kontekst API da bi se izognili opornemu vrtanju, vendar je to, kar imamo zdaj, popolnoma primerno za to, kar počnemo.

Ostali deli Edit funkcijo je mogoče pretvoriti tudi v komponente. Na primer, kodo lestvice lige lahko vstavite v ločeno komponento - kot morda LeagueTable.js — in nato uvoženo, tako kot smo uvažali LeagueSettings v Edit Funkcija.

Znotraj LeagueSettings.js datoteka

LeagueSettings je kot drugi React komponenta iz katerega lahko destrukturiramo rekvizite iz nadrejene komponente. Uporabil bom tri spremenljivke stanja in dodatno leagueID državo, ker bomo ID pridobili iz league predmet:

const [country, setCountry] = useState(null);
const [league, setLeague] = useState(null);
const [season, setSeason] = useState(null);
const [leagueID, setLeagueID] = useState(null);

Prva stvar, ki jo bomo naredili, je uvoz PanelBody komponenta iz paketa @wordpress/block-editor:

import { PanelBody } from "@wordpress/block-editor";

... in ga vključite v naše return funkcija:

obstajajo druge oznake in atributi plošče — to je le moja osebna prednost, da uporabljam te. Nobeden od drugih ni potreben ... ampak poglejte vse komponente imamo na voljo za izdelavo nastavitvene plošče! Všeč mi je preprostost PanelBody za naš primer uporabe. Razširi se in strne, da razkrije spustne nastavitve za blok in to je to.

Ko smo že pri tem, imamo izbiro za te izbire. Lahko bi uporabili SelectControl komponento ali a ComboBoxControl, ki ga dokumenti opisujejo kot »izboljšano različico a SelectControl, z dodatkom možnosti iskanja možnosti z uporabo iskalnega vnosa.« To je lepo za nas, ker bi lahko bil seznam držav precej dolg in uporabniki bodo lahko izvedli iskalno poizvedbo ali izbrali s seznama.

Tukaj je primer, kako a ComboboxControl lahko deluje za naš seznam držav:

 handleCountryChange(value) }
  onInputChange={ (inputValue) => {
    setFilteredCountryOptions(
      setupCountrySelect.filter((option) =>
        option.label
          .toLowerCase()
          .startsWith(inputValue.toLowerCase())
      )
    );
  }}
/>

O ComboboxControl je nastavljiv v smislu, da lahko uporabimo različne velikosti za oznako in vrednosti kontrolnika:

{
  value: 'small',
  label: 'Small',
},

Toda naši podatki API-ja niso v tej sintaksi, zato lahko pretvorimo countriesList matrika, ki prihaja iz nadrejene komponente, ko je blok vključen:

let setupCountrySelect;

setupCountrySelect = countriesList.map((country) => {
  return {
    label: country.name,
    value: country.name,
  };
});

Ko je država izbrana med ComboboxControl, se vrednost države spremeni in podatke ustrezno filtriramo:

function handleCountryChange(value) {
  // Set state of the country 
  setCountry(value); 

  // League code from RapidAPI
  const options = {
    method: "GET",
    headers: {
      "X-RapidAPI-Key": "Your RapidAPI key",
      "X-RapidAPI-Host": "api-football-v1.p.rapidapi.com",
    },
  };

  fetch(`https://api-football-v1.p.rapidapi.com/v3/leagues?country=${value}`, options)
    .then((response) => response.json())
    .then((response) => {
      return response.response;
    })
    .then((leagueOptions) => {
      // Set state of the league variable
      setLeague(leagueOptions);

      // Convert it as we did for Country options
      setupLeagueSelect = leagueOptions.map((league) => {
        return {
          label: league.league.name,
          value: league.league.name,
        };
      });
      setFilteredLeagueOptions(setupLeagueSelect);
    })
  .catch((err) => console.error(err));
}

Upoštevajte, da uporabljam še tri spremenljivke stanja za obdelavo sprememb, ko se spremeni izbira države:

const [filteredCountryOptions, setFilteredCountryOptions] = useState(setupCountrySelect);
const [filteredLeagueOptions, setFilteredLeagueOptions] = useState(null);
const [filteredSeasonOptions, setFilteredSeasonOptions] = useState(null);

Kaj pa druge možnosti nastavitev?

Pokazal bom kodo, ki sem jo uporabil za druge nastavitve, vendar je vse, kar počne, to, da upošteva običajne primere, medtem ko definira napake za posebne primere. V nekaterih državah in ligah bodo na primer napake, ker:

  • za nekatere lige ni lestvic in
  • nekatere lige imajo lestvice, vendar niso v eni tabeli.

To ni vadnica za JavaScript ali React, zato vam bom dovolil, da obravnavate posebne primere za API, ki ga nameravate uporabiti:

function handleLeagueChange(value) {
  setLeague(value);
  if (league) {
    const selectedLeague = league.filter((el) => {
      if (el.league.name === value) {
        return el;
      }
    });

    if (selectedLeague) {
      setLeague(selectedLeague[0].league.name);
      setLeagueID(selectedLeague[0].league.id);
      setupSeasonSelect = selectedLeague[0].seasons.map((season) => {
        return {
          label: season.year,
          value: season.year,
        };
      });
      setFilteredSeasonOptions(setupSeasonSelect);
    }
  } else {
    return;
  }
}

function handleSeasonChange(value) {
  setSeason(value);
}

Pošiljanje izbire nastavitev

v zadnji članek, smo naredili gumb v urejevalniku blokov, ki pridobiva sveže podatke iz API-ja. Zdaj, ko imamo nastavitve, ga ne potrebujemo več. No, potrebujemo ga - samo ne tam, kjer je trenutno. Namesto da bi ga imeli neposredno v bloku, ki je upodobljen v urejevalniku blokov, ga bomo premaknili v naš PanelBody komponento za predložitev izbire nastavitev.

Torej, nazaj noter LeagueSettings.js:

// When countriesList is loaded, show the country combo box
{ countriesList && (
   handleCountryChange(value)}
    onInputChange={(inputValue) => {
      setFilteredCountryOptions(
        setupCountrySelect.filter((option) =>
          option.label
            .toLowerCase()
            .startsWith(inputValue.toLowerCase())
        )
      );
    }}
  />
)}

// When filteredLeagueOptions is set through handleCountryChange, show league combobox
{ filteredLeagueOptions && (
   handleLeagueChange(value)}
    onInputChange={(inputValue) => {
      setFilteredLeagueOptions(
        setupLeagueSelect.filter((option) =>
          option.label
            .toLowerCase()
            .startsWith(inputValue.toLowerCase())
        )
      );
    }}
  />
)}

// When filteredSeasonOptions is set through handleLeagueChange, show season combobox
{ filteredSeasonOptions && (
  
     handleSeasonChange(value)}
      onInputChange={
          (inputValue) => {
            setFilteredSeasonOptions(
              setupSeasonSelect.filter((option) =>
              option.label
              .toLowerCase()
              .startsWith(inputValue.toLowerCase()
            )
          );
        }
      }
    />

    // When season is set through handleSeasonChange, show the "Fetch data" button
    {
      season && (
        
      )
    }
    
  
)}

Tukaj je rezultat!

Z našim blokom smo na zelo dobrem mestu. Lahko ga upodabljamo v urejevalniku blokov in na sprednji strani spletnega mesta. Podatke lahko pridobimo iz zunanjega API-ja na podlagi izbranih nastavitev, ki smo jih ustvarili in ki filtrirajo podatke. Prekleto funkcionalen je!

Ampak obstaja še ena stvar, ki se je moramo lotiti. Trenutno, ko shranimo stran ali objavo, ki vsebuje blok, se nastavitve, ki smo jih izbrali za blok, ponastavijo. Z drugimi besedami, ti izbori niso nikjer shranjeni. Malo več je dela, da bodo te izbire obstojne. Tja nameravamo iti v naslednjem članku, zato ostanite z nami.

Časovni žig:

Več od Triki CSS