Utvide ProcessWire-administrasjonen ved hjelp av egendefinerte moduler

I denne opplæringen skal vi se nærmere på å utvide ProcessWires admin ved hjelp av egendefinerte moduler. Med tre eksempelmoduler vil jeg gi deg en liten smak av Power ProcessWire-modulene har for å legge til ny funksjonalitet til administrasjonen.

Opprett egendefinerte administratorsider

Å lage sider for nettstedet ditt i ProcessWire (PW) kunne ikke vært enklere, men hva med å lage egendefinerte sider i CMS? Si at du vil lage en egendefinert innstillingsside, ofte stillede spørsmål eller videoside?

Les videre, vi har ryggen din.

Modulen ProcessSimpleAdminPage viser bare for å lage en modul som utvider prosessen klassen for å legge til en ny admin prosess, og deretter lage en side for den nye prosessen. Prosess er grunnklassen for PWs admin, så bruker vi det vi kan lage en side som viser innholdet vårt.

Tips: Den nye prosessutvidelsesmodulen kan også vise skjemaer og annen funksjonalitet, samt returnere innhold.

Vi skal lage en ny prosess som gir noe innhold, og deretter opprette en ny side i administrasjonsnavigasjonen for å nå det innholdet (i dette eksemplet har jeg kalt siden "CMS FAQ"). For å bygge modulen starter vi ved å lage en fil som heter "ProcessSimpleAdminPage.module" og lagrer modulens detaljer til den.

klassen ProcessSimpleAdminPage utvider prosess offentlig statisk funksjon getModuleInfo () return array ('title' => 'Prosess Simple Admin Page', 'summary' => 'Enkel prosessmodul som legger til ny admin side med', 'versjon' => 001 ,);  Offentlig funksjon utføre () return ' 

Rediger teksten her i modulen

Kjæresten er dum og sitter, og er en avgjørende forfatter. Nullam mattis eros vitae medus sodales egen suscipit purus rhoncus. Proin ultrices gravida dolor, ikke porttitor enim interdum vitae. Integer feugiat lacinia tincidunt. Nulla laoreet tristique tristique. Slike elementer er bare et viktig element i tiden. Nulla quis eros et masse dignissim imperdiet et vitae purus.

';

På dette tidspunktet, hvis vi installerte modulen vår, ville vi ha alt vi trenger for å lage vår nye prosess ProcessSimpleAdminPage og returnere innholdet. Det finnes imidlertid ingen side for å utføre koden vår. Vi har flere muligheter til å gjøre dette:

  1. Lag manuelt en ny side i PW pagetree under admin, gi den malen admin og i feltet Prosess: ProcessSimpleAdminPage. Flytter den nye siden i pagetree listen under innstillinger, for eksempel vil siden bli lagt til i toppnavigasjonen under innstillinger.
  2. Legg til en sideattributt til modulens getModuleInfo () array. Hvis modulen utvider prosess (som vår gjør), legger du til en sideTilordne array med minst a Navn og forelder På installasjonen vil du automatisk opprette en ny admin side underspesifisert forelder med modulen som sin prosess. Her er et eksempel fra hei-modulen.
  3. Skape installere() og avinstallere () Fungerer og legg til den nye siden. Dette er detaljert nedenfor for å vise deg hvordan du kan legge til en side:
offentlig funksjon installasjon () // opprett ny side for å legge til CMS $ page = new Page (); // legge sideattributter, jeg har kalt denne siden CMS FAQ '$ page-> template = "admin"; $ side-> navn = "cms-faq"; $ side-> title = "CMS FAQ"; $ Side-> Lagre (); // sett denne modulen som sideprosess, dette gjør at vi kan vise ovenstående $ side-> prosess = 'ProcessSimpleAdminPage'; // få admin siden og sett som sideforelder $ admin = $ this-> pages-> get ("id = 2"); $ side-> foreldre = $ admin; // lagre side $ side-> lagre ();  offentlig funksjon avinstallere () // slette opprettet side $ page = $ this-> pages-> get ("name = cms-faq"); hvis (telle ($ side)) $ this-> pages-> delete ($ side, true);  

Gå videre og opprett administrasjons sider for nettstedet ditt!

Legg til tilpasset tekstformater

Ved å bruke Textformatters kan du manipulere innspillet av tekstfelt med PW admin. For eksempel, si at du vil lage kodestykker som legges til i stedet for noen å skrive sine egne utdrag, det er helt mulig (på samme måte som her koden plugin for Wordpress).

Denne gangen har jeg opprettet en modul som utvider en annen baseklasse Tekstformatter for å lage vår nye modul TextformatterFindReplace og opprettet en separat config-fil:

klasse TextformatterFindReplace utvider Textformatter implementer Modul offentlig statisk funksjon getModuleInfo () return array ('title' => 'TextformatterFindReplace', 'version' => 0,1, 'summary' => "Finnes og erstatter ethvert forekomst av config input til config output ", 'singular' => true,);  / ** * Finn og Erstatt inntastingsstreng * * @paramstreng $ str Blokk av tekst som skal analyseres * * Den innkommende strengen erstattes med den formaterte versjonen av seg selv. ** / offentlig funksjon format (& $ str) $ find = $ this-> findStr; $ str = preg_replace_callback ($ find, array ($ this, "replace"), $ str);  // legge til tre understreker til en funksjon tillater andre moduler å koble den til offentlig funksjon ___ erstatte ($ match) return $ this-> replaceStr;  
klasse TextformatterFindReplaceConfig utvider ModuleConfig offentlig funksjon getDefaults () return array ('findStr' => '----', 'replaceStr' => 'BYTTE TEKST',);  / * * getInputfields () * return: $ inputfields * / // lage skjema i PW admin for å aktivere konfigurasjon av modulen offentlig funksjon getInputfields () // få modulen fåInputfields sett config class $ inputfields = foreldre :: getInputfields (); // få InputfieldText modul $ f = $ this-> modules-> get ('InputfieldText'); $ f-> attr ('navn', 'findStr'); $ f-> label = 'Finn i tekst'; $ f-> description = 'Legg til et ord eller mønster for å finne og erstatte i teksten.'; // Legg til brukerrollinngang for å danne config $ inputfields-> add ($ f); // få ny InputfieldText-modul $ f = $ this-> modules-> get ('InputfieldText'); $ f-> attr ('navn', 'replaceStr'); $ f-> label = 'Erstatt tekst'; $ f-> description = 'tekst som skal vises på forsiden.'; // legg til Side omdirigere inngang for å danne config $ inputfields-> add ($ f); // returmodulets konfigurasjonsinnganger returnerer $ inputfields;  

Nå i modulinnstillingene kan jeg spesifisere en streng som skal matche, og en streng for å erstatte den med (i vårt eksempel over er standard funnet: ---- og erstatt med BYTTE TEKST).

Alt jeg trenger å gjøre er å legge til vår nye TextFormatter til et tekstfelt i feltets detaljeringsfane. Nå hver gang jeg skriver ---- Jeg vil få erstattet tekststrengen.

Legg til ny funksjonalitet i administrasjonssider

Siden PW-administratoren selv er opprettet ved hjelp av PWs API-lignende bibliotek, har PW-moduler ganske mye tilgang til å koble til hvor som helst du trenger.

For mitt siste eksempel på å utvide PWs admin, har jeg opprettet en modul som legger til knapper på redigeringssiden og pagetree, lager to nye felt og legger dem globalt til hver side. Det krever en annen modul, LazyCron, for å fungere.

Modulen PageDeferredPublish, ved å klikke på en av Publiser senere knapper, setter LazyCron for å sjekke at siden nedtelling hvert minutt og publiserer siden når nedtellingen når 0. Dette betyr at jeg kan publisere en side omtrent 24 timer i forveien (åpenbart kan kontrollintervallet og forsinkelsestiden endres etter dine krav).

Jeg gjorde dette ved:

  • Oppretter to felt i min installere() funksjon: Et avkrysningsfelt som skal settes til sant når en knapp er merket for å indikere at siden skal nedtelling og et nedtellingsfelt for å lagre tellingen i sekunder for den spesifikke siden.
  • Legge til kroker til både ProcessPageEdit :: buildForm og ProcessPageListActions :: getExtraActions slik at jeg kan legge til de to knappene.
  • Sjekker for å se om en av knappene ble klikket med min klare () -funksjon, og merk av for den aktuelle sidens boks.
  • Bruke en LazyCron-krokfunksjon for å sjekke alle sider som ikke er publisert for ekte avmerkingsbokser, og deretter sammenligne sekunderfeltet for å se om siden må publiseres. Hvis ikke, trekk deretter den forløpte tiden i sekunder.

Resultatet er en modul som har innstillinger (tidsintervallet for å sjekke og publisere på et senere tidspunkt), kroker inn i administrasjonen ved hjelp av knapper og felt, og lar oss bruke andre moduler installert i PW (dvs. LazyCron).

Innpakning

Ofte er en modul du trenger allerede opprettet og kan lastes ned fra PWs modulside. Men hvis du finner deg selv i nød, er det fint å vite at det er relativt enkelt å hoppe inn, utvide en kjerneklasse og skape ny funksjonalitet som løser problemet eller endrer PWs standardløsning.

Jeg håper du har funnet denne lille smaken av kraften til å utvide PW nyttig, og sjekk ut de andre ProcessWire-veiledningene på Envato Tuts + for flere tips og triks.

Nyttige ressurser

  • En nybegynners introduksjon til skrivemoduler i ProcessWire
  • Modul docs
  • Modul tilpasset konfigurasjon
  • Modulavhengigheter
  • Gjennomførbare kroker