Gå til innhold

Hvordan lage modul/plugin system?


Anbefalte innlegg

Videoannonse
Annonse

Kan hvertfall si en ting; template engine er ikke direkte relatert til hvordan designet på module-systemet ditt ser ut.

 

For å lage et module-basert system(hvertfall slik jeg gjore det) så må du først ha en liste over hvilke moduler som er "aktive". Når en side lastes, f.eks 'frontpage' så er dette en hook. Denne hooken går gjennom listen av aktive moduler hvor hver module har en funksjon som heter "handlehook($hookname)".

 

La oss si at hooken er 'frontpage' og modulene som er aktivert er nyhet,login og hjelp

 

foreach( $moduler as $module )
{
$module -> handlehook('frontpage');
}

 

husk at arrayen $moduler består av instanser av modulene.

 

slik ser f.eks nyheter modulen ut da

 

function handlehook($name)
{
  switch($name)
  {
   case "frontpage":
	   // kode eller kall til en annen funksjon for ryddighets skyld
	   break;
  }
}

 

 

 

ble mye slurv kommer tilbake senere ;)

Lenke til kommentar

Vel, nå går ikke dette direkte inn på template-systemet du har valgt å bruke, men mer på systemet generelt.

Cluet med et pluginsystem ala WordPress er at det eksisterer en del "hooks" i systemet, som kan bli tilegnet callbacks som blir kjørt på bestemte plasser. Koden som følger er et eksempel på en enkel implementasjon av observer-patternet, som vil kunne gi deg mulighet for hooks.

 

For å få et fullverdig pluginsystem trenger du selvsagt også et system for å håndtere plugins som eksiterer og hvilke som er aktive, men det får du ikke her.

 

/*
*	(shame at kommentarer ikke eksisterer, men skrev dette i all hast. skulle likevel ikke være alt for vanskelig *	å forstå.)
*/
class EventDispatcher {

protected $eventListeners = array();

public function addEventListener($event, $callback) {
	$this->eventListeners[$event][$callback] = $callback;
}

public function removeEventListener($event, $callback) {
	if (isset($this->eventListeners[$event][$callback])) {
		unset($this->eventListeners[$event][$callback]);
	}
}

public function getEventListeners($event) {
	return (array) $this->eventListeners[$event];
}

public function clearEventListeners($event) {
	$this->eventListeners[$event] = array();
}

public function dispatch($event, array $arguments = array()) {
	foreach ($this->getEventListeners($event) as $callback) {
		call_user_func_array($callback, $arguments);
	}
}
}

 

I en plugin kan du da for eksempel ha noe lignende:

function my_bootstrap_function() {
echo 'Hello World';
}

$eventManager->addEventListener('system.bootstrap', 'my_bootstrap_function');

 

og i selve systemet/kjernen utføre callbacks som er hektet på denne hooken:

$eventManager->dispatch('system.bootstrap');

 

Det hele er temmelig vanskelig å forklare, så du bør nok ta en titt på eksisterende systemer som FrogCMS eller WordPress.

Lenke til kommentar

Tusen takk, Jeg har sett på wordpress, men sliter å finne filen som gjør akkuratt det du har funnet her. Skal prøve og feile! :)

 

 

Edit: Nå begynner jeg faktisk å skjønne noe. Skal endre på koden, og se hva som gjør hva o.l -

 

To spørsmål:

  • Hvordan gjør jeg det om den skal plasseres dynamisk mon tro f.eks via css?
  • Om jeg vil ha plugin's i en mappe ( Se eksempel 1 ) . Hvordan får jeg gjort det?

Eksempel 1:

modules

- plugin 1

- - index.php

- - style.css

- - bilder/

- - - etbilde.jpeg

- - - etannet.jpeg

- plugin 2

- - index.php

- - style.css

- - bilder/

- - - etbilde.jpeg

- - - etannet.jpeg

osv..

i forhold til

eksempel 2:

Modules

- plugin1.php

- plugin2.php

- plugin3.php

- plugin4.php

osv

Endret av LaCrouX
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...