Mam moduły fizycznie w katalogu z pluginem - takie same jak są w modules. Korzystając z odpowiednich hooków dodaję ścieżki, żeby LMS wiedział gdzie szukać modułów i szablonów.
Wszystko jest ok, wszystko do tego momentu działa, zamysł jest taki, żeby dodać jakąś funkcjonalność do LMS i jednocześnie nie dotykać jego kodu. Chciałbym użyć jakichś swoich metod które zdefiniowane byłyby w jakiejś klasie z pluginem.
Problem w tym, że wywołując nowy moduł, który powołałem do zycia z pozimu pluginu - nie mam dostępu do samej klasy z pluginem :)
Przydałoby się mieć coś takiego:
$PLUGIN = $LMS->getPluginInstance('RedirectorsPlugin');
żeby w kodzie dodatkowego modułu zrobić już jak biały człowiek:
$PLUGIN->mojaMetoda(xyz);
Poniżej najważniejsze kawałki kodu w pluginie:
class RedirectorsPlugin extends LMSPlugin { public function registerHandlers() { $this->handlers = array( 'menu_initialized' => array( 'class' => 'PluginMenuHandler', 'method' => 'drawMenu' ), 'modules_dir_initialized' => array( 'class' => 'PluginDirHandler', 'method' => 'addModulesDir' ), 'smarty_initialized' => array( 'class' => 'PluginDirHandler', 'method' => 'addTemplatesDir' ), 'lms_initialized' => array( 'class' => 'PluginMethodsHandler', 'method' => 'addPluginMethods' <==== tutaj próbowałem coś rzeźbić, ale bez efektów. ), ); } }
class PluginMenuHandler { /** * Example handler that does nothing * * @param mixed $hook_data */ public function drawMenu($hook_data) { error_log("Genereting menu for redirectors"); $hook_data["redirectors"] = array( "name" => trans("Customer messages"), "img" => "../plugins/RedirectorsPlugin/img/user_comment.png", "link" => "?m=customermessages", "tip" => trans("User customer messges"), "accesskey" => "z", "prio" => "9", "submenu" => array( array( "name" => trans("Redirector list"), "link" => "?m=redirectorlist", "tip" => trans("Redirector list"), "prio" => 10 ), array( "name" => trans("New redirector"), "link" => "?m=redirectoradd", "tip" => trans("Add new redirector"), "prio" => 20 ) ));
return $hook_data; } }
class PluginDirHandler { /** * Example handler that does nothing * * @param mixed $hook_data */ public function addModulesDir($hook_data) { error_log("Adding modules directory for RedirectorsPlugin"); array_push($hook_data,SYS_DIR . "/plugins/RedirectorsPlugin/modules/");
return $hook_data; }
public function addTemplatesDir($hook_data) { error_log("Adding modules directory for RedirectorsPlugin"); $hook_data->AddTemplateDir(SYS_DIR . "/plugins/RedirectorsPlugin/templates/");
//return $hook_data; } }
Więc podsumowując - na mój chłopski rozum - najbardziej urządzałoby mnie pobranie instancji klasy pluginu z poziomu $LMS i juz dalsza praca na niej. Czy jest to w miarę sensowne rozwiązanie ?
Pozdrawiam.
W dniu 4 lutego 2015 18:59 użytkownik Maciej Lew maciej.lew.1987@gmail.com napisał:
Chyba nie da się tego zrobić w taki sposób jak chcesz to zrobić.
Od pewnego czasu LMS ma autoloader więc można osiągnąć podobny efekt na kilka innych sposobów:
- Zrobić własną klasę dziedziczącą po LMS i w niej dodać swoją nową
metodę lub metodę przesłaniającą obecnie dostępną:
class MyLMS extends LMS { public function myMethod() { echo 'myMethod'; } }
- Dodać zupełnie oderwaną od klasy LMS nową klasę
class MyClass { public function myMethod() { echo 'myMethod'; } }
- Jeśli chodzi o przesłonięcie istniejącej metody z LMS to można w
większości przypadków dodać własnego "managera":
class MyFinanceManager extends LMSFinanceManager implements LMSFinanceManagerInterface {
public function GetCustomerAssignments($id, $show_expired = false) { $assignments = parent::GetCustomerAssignments($id, $show_expired); // tu robimy coś na zmiennej $assignment i zwracamy zmodyfikowaną return $assignments; }
}
// rejestrujemy nowego managera $LMS->setFinanaceManager(new MyFinanceManager($LMS->getDb(), $LMS>getAuth(), $LMS->getCache(), $LMS->getSyslog()));
Dzięki autoloaderowi klasy MyLMS, MyClass i MyFinanceManager powinny być widoczne z innych pluginów (choć trzeba by było dorobić sobie sprawdzanie czy tak na pewno jest, czy ktoś nie wyłączył pluginu od którego zależy działanie naszego pluginu).
W dniu 03.02.2015 o 11:52, Przemysław Kudyba pisze:
Witam.
Przerabiam dodatki do LMS-a które jakiś czas temu nakodziłem, żeby robiły użytek z nowego stystemu pluginów w LMS. Mam w związku z tym pytanko: jak dorzucić z poziomu pluginu jakieś swoje metody do klasy LMS (a raczej instancji) tak, żeby były wydoczne dla funkcji spoza pluginu i możba było ich używać np. w innych pluginach ?
Pozdrawiam