2011/4/26 A.L.E.C alec@alec.pl:
On 26.04.2011 14:34, Digital Dog wrote:
Nic nie jest dodawane do $nodes, więc warunek jest zawsze fałszywy, więc hook nie jest wykonywany.
Poprawione w cvsie. Dzięki.
Dzięki za szybką reakcję! Hooki są bardzo wygodne, pomagają reagować natychmiast na zdarzenia w LMSie, w tym modyfikować ustawienia ruterów, menedżerów pasma, firewalli itd. (pamiętając o blokadach by uniknąć zniszczenia konfiga lub sytuacji wyścigu w razie 2 lub więcej jednoczesnych modyfikacji).
Chciałbym nieśmiało zaproponować drobne usprawnienia, nie wymagające wiele pracy, dotyczące statusów i powiadomień. Dane otrzymane w $vars w funkcji obsługi tego samego hooka różnią się w zależności od miejsca wywołania. Po poprawce mamy (testy z użyciem var_dump($vars)): 1) dla wywołania z hiperłącza: **** node_warn_after: zmieniono powiadomienie komputera array(2) { ["nodes"]=>array(1) { [0]=>string(1) "4" } ["warning"]=>int(1) } (dzięki ['warning'] wiadomo wprost czy włączono czy wyłączono powiadomienie).
2) bezpośredni klik na ikonie ostrzeżenia: **** node_warn_after: zmieniono powiadomienie komputera array(1) { ["nodeid"]=>string(1) "4" } (nie wiadomo czy powiadomienie zostało włączone czy wyłączone - trzeba patrzeć do bazy)
Obsługa takich niejednorodnych danych jest dość niewygodna: w funkcji hooka trzeba sprawdzać czy ustawione jest ['nodeid'] i jeśli nie to posługiwać się ['nodes']. Proponuję taką zmianę, by w obu przypadkach w $vars mieć element ['nodes'] (choćby z 1 pozycją) i ['warning'] -- to 1 zmiana, a wszystkie następne hooki będą dla wszystkich userów łatwiejsze do napisania (a obecne nie przestaną działać - backward compatibility ftw!)
Dla hooka node_set_after jest jeszcze inaczej: 1) klik w hiperłącze: **** node_set_after: zmieniono status komputera array(1) { ["nodes"]=>array(1) { [0]=>string(1) "4" } } (brak informacji czy komputery zostały podłączone czy odłączone - odpowiednika powyższego ['warning'])
2) klik bezpośrednio w ikonę (wynik jak wyżej): **** node_set_after: zmieniono status komputera array(1) { ["nodeid"]=>string(1) "4" }
Tutaj proponuję również to ujednolicić i dodać np. element ['status'] typu int zawierający info czy węzeł/węzły zostały włączone czy wyłączone.
Drugim wartościowym usprawnieniem byłaby możliwość anulowania wykonania danej operacji w hookach _before (taki jest sens hooków _before). Na przykład, na podstawie nodedel.php:
$LMS->ExecHook('node_del_before', $plugin_data); $LMS->DeleteNode($nodeid); $LMS->ExecHook('node_del_after', $plugin_data);
można by zmienić na coś podobnego do:
$cancel = $LMS->ExecHook('node_del_before', $plugin_data); if ($cancel === 1) { $LMS->DeleteNode($nodeid); $LMS->ExecHook('node_del_after', $plugin_data); }
To rozwiązanie też utrzymuje wsteczną zgodność z istniejącymi skryptami. Dzięki temu na podstawie tylko sobie znanych reguł (np. wyciąganych z innej bazy obsługiwanej przez inny system) funkcja hooka może decydować czy akcja powinna być wykonana, czy nie.
Długie wyszło... Wielkie dzięki i pozdrowienia.