Wego: Wtyczki

Wczoraj pisałem o dodaniu do Wego CMS wtyczek dla systemów płatności online. Cypherq poprosił o szczegóły dotyczące implementacji. Noszę się z zamiarem przygotowania kilkuetapowego howto, kiedy tylko pojawi się darmowa wersja Wego (tak, to bardzo możliwe, po szczegóły odsyłam do nbw). Póki co, o samym sposobie ładowania wtyczek.

Moduły — wtyczki z automatyczną rejestracją

Wego ma dwa rodzaje pluginów. Pierwszy rodzaj — wtyczki z automatyczną rejestracją — używany jest przez moduły. Moduł to zamknięta część systemu, widoczna jako osobna pozycja w panelu. Przykładem niech będą Artykuły lub Kosz.

Automatyczna rejestracja oznacza tyle, że plik z wtyczką zawiera klasę o nazwie takiej samej, jak plik i nie musi właściwie robić nic więcej:

<?

/* $Id: foo.module.php 1 2007-04-27 12:00:00Z patrys $ */

require_once(THE_ROOT . '/class/genericModule.class.php');

/**
 * Foo module
 */

class fooModule extends genericModule
{
	public function __construct(& $modSys)
	{
		parent::__construct($modSys);
		$this->module = 'foo';
	}

	/**
	 * Check if module is usable (dependencies, etc.)
	 */
	protected function __public_init($data)
	{
		return array('success' => true);
	}

	/**
	 * Get module info
	 */
	public function getInfo()
	{
		return array
		(
			'title' => _('Foo'),
			'author' => 'patrys [ patrys at icenter pl ]',
			'version' => '1.0',
			'description' => _('Hello world example'),
			'modified' => filemtime(__FILE__)
		);
	}
}

?>

Do tego dochodzi klasa dla panelu administracyjnego (dla oszczędzenia pamięci, ładowana tylko w przypadku, gdy jest to aktywny moduł w panelu):

<?

/* $Id: foo.panel.module.php 1 2007-04-27 12:00:00Z patrys $ */

class fooPanelModule extends fooModule
{
	protected function __internal_list()
	{
		return 'Hello world!';
	}
}

?>

Jest tu kilka magicznych metod — wszystkie __public_* dostępne są automatycznie z poziomu inych modułów i z poziomu szablonów Smarty; __internal_* za to służą za obsługę ekranów panelu administracyjnego, wymagana jest przynajmniej obsługa metody list, która jest domyślnym widokiem.

Inne wtyczki — ręczna rejestracja

W przypadku wtyczek pól dodatkowych i systemów płatności okazało się, że automatyczna rejestracja nie jest najlepszym wyjściem — jedna klasa może realizować kilka funkcji, a sztuczne po niej dziedziczenie wprowadza tylko chaos w plikach. Zdecydowaliśmy się, że moduły te same muszą zgłosić obsługiwane przez siebie funkcje:

<?

/* $Id: platnosciPayment.class.php 7234 2007-04-25 10:55:39Z patrys $ */

class platnosciPaymentType extends genericPaymentType
{
	public static $paymentList = array
	(
		'platnosci_test' => array
		(
			'code' => 't',
			'name' => 'Platnosci.pl (płatność testowa)',
		),
		'platnosci_mtransfer' => array
		(
			'code' => 'm',
			'name' => 'Platnosci.pl - mBank mTransfer',
		),
		// [...]
		'platnosci_credit' => array
		(
			'code' => 'c',
			'name' => 'Platnosci.pl - Karta kredytowa',
		),
	);

	public function getConfigData()
	{
		// [...]
	}

	public function process()
	{
		// [...]
	}
}

$parent = paymentSystem::getInstance();
foreach (platnosciPaymentType::$paymentList as $key => $val)
	$parent->register($key, 'platnosciPaymentType', $val['name']);
$parent->registerSettings('platnosci', 'platnosciPaymentType', _('Platnosci.pl'));

?>

Dzięki temu możliwa jest obsługa wszystkich sposobów zapłaty za pomocą jednej klasy (konstruktor klasy genericPaymentType otrzymuje i zapisuje wybraną formę zapłaty).

Ładowanie wtyczek

Tutaj poszliśmy na łatwiznę:

public function loadPlugins()
{
	$modDir = dir(THE_ROOT . '/payment/');

	while (($file = $modDir->read()) !== false)
	{
		$fullPath = THE_ROOT . '/payment/' . $file;

		if (!is_dir($fullPath))
		{
			include($fullPath);
		}
	}
}

Ładowanie wtyczek z automatyczną rejestracją wymaga nieco więcej zachodu (po załadowaniu pliku, trzeba jeszcze sprawdzić, czy istnieje klasa o odpowiedniej nazwie i czy dziedziczy po odpowiedniej klasie bazowej), ale samodzielna implementacja nie powinna zająć więcej niż 5 minut.

Na koniec

Po notce o zmianie firmy pojawiły się niejasne spekulacje, jakobyśmy mieli zastąpić nbw butelką wody mineralnej. Spieszę z dowodem, że młodzieniec ów żyje i ma się dobrze (a jeśli już mielibyśmy kogoś zamienić na butelkę wody, to byłby to prędzej sit0).

The Crew
Ekipa, od lewej:
patrys, sit0, nbw, emes
jarv

18 » odpowiedzi dla wpisu “Wego: Wtyczki”


  1. 1 nbw

    Sugeruję do logo ITS dodać brodę.

  2. 2 jarv

    oj tam. w koncu sie ktorys ogoli i potem bedzie, ze mamy logo ‘z brodą’… ;]

  3. 3 sit0

    e tam, ja jestem bardziej kaloryczny :)

  4. 4 piotrek

    Aż miło popatrzeć
    nasza brygada er-er…

  5. 5 anghan

    Elektryzuje info o wydaniu darmowej wersji ;)

  6. 6 Luken

    No widzę, że te Wego to naprawdę zaawansowany system. Jak najszybciej zrobić Wego darmowe. :)

    BTW. Kubki były razem z wyposażeniem biura? :P

  7. 7 http-szabat.com-

    I jeszcze czekamy na wersje pythonową :)

  8. 8 Cypherq

    O, miła niespodzianka. Tak właśnie myślałem, że jeśli zarys tego systemu wtyczek jednak się tutaj pojawi, to zapytam o jeszcze jedno, mianowicie kiedyś, dawno temu w notce jakiejś tam (Pinky blablabla chyba) stwierdziłeś, że:

    “(panel — ze względu na szybkość rozwoju — nie operuje na kodzie HTML, zamiast tego budując interfejs za pomocą mechanizmu zagnieżdżanych kontrolek i kontenerów, wzorowanego na GTK+),”

    Chodzi o kolejną warstwę abstrakcji? Tak jak w ASP.NET? Bo nie wiem czy dobrze zrozumiałem. Oczywiście zdaję sobie sprawę, że masz na głowie ciekawsze sprawy, ale gdyby gdzieś kiedyś znalazł czas i mógł chociażby podać materiały na ten temat, byłoby smerfnie :]

  9. 9 nbw

    Luken: całe WEGO nie będzie darmowe. To system komercyjny od początku i takim pozostanie. Wersja darmowa do pobrania będzie oferować okrojoną funkcjonalność.

    Szabat: wersja pythonowa WEGO? Może jeśli python będzie serwerowo tak popularny jak PHP…

  10. 10 Jakub

    Mi by starczył system newsów i artykułów :P I tyle mogłaby mieć wersja darmowa.

    Ale zapaleńcy będą szukać full ver na torrentach i innych p2p :P

  11. 11 Patrys

    Jakub:

    Niech szukają. Samo Wego pobrać można za darmo, ale do uruchomienia potrzebny jest klucz, który obsługuje konkretną domenę ;)

  12. 12 ehh

    A jakby im się udało pobrać za darmo źródło to ktoś by miał przechlapane:)

  13. 13 medyk

    W faktycznym kodzie wego też korzystacie z krótkich tagów?

  14. 14 Patrys

    medyk:

    Też, od czasów PHP3 nie widziałem serwera z wyłączonymi krótkimi tagami.

  15. 15 rozbit

    Hmm, wyczytałem, że short_tags ma być wyłączone w php6 już, i że ogólnie zaleca się do nie używania tychże.
    To jak to w końcu jest?

  16. 16 medyk

    ja mam wyłączone na każdym serwerze.. a najgorsze w krótkich tagach jest to, że jak masz je wyłączone to żadne błędy Ci się nie pojawią tylko kod php wyskoczy po stronie klienta - więc możecie powoli się nastawiać na różne dziwne historie.. :)
    Twórcy php zalecają by z nich nie korzystać (w php6 ma już zdaje się ma już ich w ogóle nie być) i domyślna zalecana konfiguracja ostatnich 5-ek ma je wyłączone.

  17. 17 medyk

    aa nawet ostatnio miałem historię z klientem, który się do mnie zwrócił z pytaniem czemu u niego się wszystko wychrzania.. miał nową instalację php i krótkie tagi wyłączone.. nawet nie znał na tyle php by wiedzieć co to te krótkie tagi :)

  18. 18 Patrys

    U nas to nie ma wielkiego znaczenia, bo kod jest mielony przez ionCube do postaci bajtkodu. Dla nas ważne jest tylko wsparcie short_tags w ionCube ;)

Skomentuj wpis