Przejdź do głównej treści

CustomWidget jako skrypt podczas akcji systemowych


Wstęp

Mechanizm CustomWidget pozwala nam na dodanie do sekwencji wydarzeń związanych z obiektem systemowym (najczęściej dialogiem) własnego skryptu php, który niejako w tle wykona dla nas określone zdanie. Przykładowo, gdy użytkownik tworzy jakiś dokument w systemie i chcemy, żeby przed zapisaniem go zostało wykonane sprawdzenie, czy uzupełnił on pewne pola w konkretny sposób (np. na fakturze została przekroczona jakaś kwota, albo czy dodał załącznik określonego typu) lub w pewnych okolicznościach chcemy, żeby do wyznaczonych użytkowników system wysłał powiadomienie po zapisaniu dokumentu, utworzeniu spawy itp. przez innego użytkownika. Wszystko to możemy zrobić przy użyciu własnego skryptu podłączonego do systemu przy wykorzystaniu mechanizmu CustomWidgets.

Ograniczenia

CustomWidget jako skrypt pozwala na użycie własnych skryptów tylko w pewnych miejscach systemu tzn. tylko na wybranych obiektach oraz tylko w określonych momentach, zazwyczaj jest to tuż przed zapisem lub zaraz po zapisaniu obiektu (dokumentu, sprawy, pozycji itp.).

Ogólna charakterystyka najczęściej stosowanych momentów wywołania dodatkowych skryptów

typ akcjiopis akcji
beforeOpenprzed otwarciem obiektu np. dialoga
afterOpenpo otworzeniu obiektu np. dialoga
beforeSaveprzed zapisaniem obiektu np. dialoga
afterSavepo zapisaniu obiektu np. dialoga
onCloseprzed zamknięciem obiektu np. dialoga
onToHtmlprzed wykonaniem renderowania obiektu

Jak utworzyć własny skrypt CustomWidget

Operacje do wykonania z poziomu GUI

  1. Wejść w Panel Sterowania
  2. Następnie przejść do Mechanizm CustomWidget,
Panel Sterowania z zaznaczoną opcją CW
Panel Sterowania z zaznaczoną opcją CW
  1. Następnie klikamy w lewym górnym rogu przycisk Nowy.
  1. W otwartym formularzu Element CustomWidget należy odpowiednio uzupełnić pola
  • Nazwa - tu wpisujemy dowolną nazwę charakteryzującą nasz widget/skrypt
  • Opis - opcjonalnie dodajemy opis co robi nasz skrypt
  • Typ - z listy rozwianej wybieramy opcję skrypt
  • Parametry - w tym polu w formacie JSON wpisujemy w kluczu scripts ścieżkę do naszego skryptu, oraz jeśli potrzebujemy dodatkowych parametrów wejściowych do naszego skryptu podajemy je np. w kluczu params (dla CW jako skryptu można zdefiniować dowolne klucze)

Dodatkowe parametry (wraz z podstawowymi informacjami na temat przesyłającego obiektu) można odebrać w swoim skrypcie w tablicy o stałej nazwie $args.

Parametry – Przykład
Parametry
// obiekt dodawany w polu `Parametry`
{
  "script": "MyExample.inc",
  "params": "przykładowy parametr",
  "array": [1,2,3,4],
  "object": {
    "name": "abc"
  }
}

Uwaga

Własny skrypt umieszczamy w ścieżce public_html/apps/edokumenty/scripts.

Oczywiście nic nie stoi na przeszkodzie, żeby własne skrypty zagnieździć wewnątrz wlasnego katalogu, wówczas w parametrze scripts podajemy nazwę naszego katalogu oraz nazwę skryptu np. MyFolder/MyScript.inc

  • Miejsce użycia - tu wpisujemy, gdzie będzie użyty nasz skrypt. Wpis ma postać <nazwa_obiektu>/<moment_wywołania>. Wszystkie dostępne na chwilę obecną miejsca użycia zostały opisane w kolejnym paragrafie.
  • Kolejność - w tym przypadku to pole nie ma znaczenia; zostawiamy puste

Utworzenie własnego skryptu

Skrypt, jaki tworzymy, może być dowolną klasą PHP lub skryptem proceduralnym. To co istotne to to, żeby w pierwszej kolejności sprawdzić, czy zmienna $args jest ustawiona i niepusta. Jeśli tak, to możemy wykonać dowolną operację związaną z naszym obiektem systemowym. Jak wcześniej wspomniano, skrypt umieszczamy w ścieżce public_html/apps/edokumenty/scripts, ewentualnie zagnieżdzając dalej, tym razem już w dowolnej strukturze katalogów (zgodnie z tym co podaliśmy w parametrach po stronie GUI podczas tworzenia CustomWidgetu).

Nazwa funkcji inicjującej może być dowolna, a klasa może zwierać większą ilość funkcjim w zależności od potrzeb


class MyExample {
    
    public static function init(array $params): void {
    
        // tutaj wykonujemy operacje, jakie chcemy wykonać
        
    }

}

if (isset($args)) {
    MyExample::init($args);
}

Miejsca użycia skryptów

Miejsca użycia, czyli na jakim obiekcie i w którym momencie zostanie wykonany nasz dodatkowy zadeklarowany skrypt, znajdują się w tabeli poniżej.

Miejsce użyciaOpis
ContractPlugin/beforeSaveAkcja po otwarciu dokumentu typu Umowa
CustomDocumentPlugin/afterOpenAkcja po otwarciu customowego dokumentu
DemandPlugin/beforeSaveAkcja przed zapisaniem formatki Zapotrzebowania
DemandPlugin/afterSaveAkcja po zapisaniem formatki Zapotrzebowania
DocumentForm/onCloseAkcja podczas zamykania formatki dokumentu
DocumentForm/onToHtmlAkcja na serializacji formatki dokumentu do HTMLa
DocumentBean/beforeAddRightAkcja przed dodaniem rekordu
DocumentBean/afterAddRightAkcja po dodaniu rekordu
DocumentBean/beforeUpdateRightAkcja przed aktualizacją rekordu
DocumentBean/afterUpdateRightAkcja po aktualizacji rekordu
EventBean/beforeCreateAkcja przed dodaniem rekordu zdarzenia
EventBean/afterCreateAkcja po dodaniu rekordu zdarzenia
FKElementDemandMainForm/beforeSaveAkcja przed zapisaniem pozycji zapotrzebowania
FKElementOfferMainForm/beforeSaveAkcja przed zapisaniem pozycji oferty
FKElementOrderMainForm/beforeSaveAkcja przed zapisaniem pozycji zamówienia
FKElementPMMMainForm/beforeSaveAkcja przed zapisaniem pozycji przesunięcia między magazynowego
FKElementProcessMainForm/beforeSaveAkcja przed zapisaniem pozycji sprawy
FKElementProtocolDocumentMainForm/beforeSaveAkcja przed zapisaniem pozycji dokumentu protokołu
FKElementPZMainForm/beforeSaveAkcja przed zapisaniem pozycji przyjęcia zewnętrznego
FKElementRCPMainForm/beforeSaveAkcja przed zapisaniem pozycji karty RCP
FKElementVatNoteMainForm/beforeSaveAkcja przed zapisaniem pozycji faktury
FKElementWZMainForm/beforeSaveAkcja przed zapisaniem pozycji wydania zewnętrznego
FKElementDemandMainForm/afterSaveAkcja po zapisaniu pozycji zapotrzebowania
FKElementOfferMainForm/afterSaveAkcja po zapisaniu pozycji oferty
FKElementOrderMainForm/afterSaveAkcja po zapisaniu pozycji zamówienia
FKElementPMMMainForm/afterSaveAkcja po zapisaniu pozycji przesunięcia między magazynowego
FKElementProcessMainForm/afterSaveAkcja po zapisaniu pozycji sprawy
FKElementProtocolDocumentMainForm/afterSaveAkcja po zapisaniu pozycji dokumentu protokołu
FKElementPZMainForm/afterSaveAkcja po zapisaniu pozycji przyjęcia zewnętrznego
FKElementRCPMainForm/afterSaveAkcja po zapisaniu pozycji karty RCP
FKElementVatNoteMainForm/afterSaveAkcja po zapisaniu pozycji faktury
FKElementWZMainForm/afterSaveAkcja po zapisaniu pozycji wydania zewnętrznego
ProcessDialog/onCloseAkcja podczas zamykania formatki podglądu sprawy
ProcessSummaryForm/afterCreateAkcja po przygotowaniu formularza (przed przekazaniem parametrów do szablonu process_summary.tpl)
RCPForm/beforeSaveAkcja przed zapisaniem formatki karty RCP
RCPForm/afterSaveAkcja po zapisaniu formatki karty RCP
UserFilesExplorerView/onAddItemAkcja po dodaniu pliku dla eksploratora plików
VatNotePlugin/beforeOpenOtwarcie formatki faktury zakupu, sprzedaży
VatNotePlugin/afterOpenOtwarcie formatki faktury zakupu, sprzedaży
PROCESS/sendRightRequestNoteAkcja sprawy przed zapisaniem formatki
ResolutionPlugin/beforeSaveAkcja przed zapisaniem dokumentu typu Uchwała
DocumentForm/beforeSaveAkcja przed zapisaniem dokumentu
VatNoteOutPlugin/toHtmlAkcja w plug-ine faktury sprzedaży
VatNoteIncPlugin/toHtmlAkcja w plug-ine faktury zakupu
VatNoteCostForm/toHtmlAkcja w pozycji kosztu faktury
TodoMod/saveNewCardCreator/beforeSaveWykonuje się przed zapisaniem zadania za pomocą kreatora na panelu (dodatkowy panel pojawia się w momencie klikania Nowe zadania (backlog oraz panel zadań))
TodoMod/saveNewCardCreator/afterSaveWykonuje się po zapisaniu zadania za pomocą kreatora na panelu (dodatkowy panel pojawia się w momencie klikania Nowe zadania (backlog oraz panel zadań))
DocumentBean/beforeAddRightEmisja zdarzenia na beanie dokumentu przed dodaniem rekordu
DocumentBean/afterAddRightEmisja zdarzenia w beanie dokumentu po dodaniu rekordu
DocumentBean/beforeUpdateRightEmisja zdarzenia w beanie dokumentu przed aktualizacją rekordu
DocumentBean/afterUpdateRightEmisja zdarzenia w beanie dokumentu po aktualizacji rekordu
EventBean/beforeCreateEmisja zdarzenia w beanie zdarzenia przed dodaniem rekordu
EventBean/afterCreateEmisja zdarzenia w beanie zdarzenia po dodaniu rekordu
Process/beforeCloseEmisja zdarzenia przed zamknięciem sprawy
Process/afterCloseEmisja zdarzenia po zamknięciu sprawy
Process/beforeResumptionEmisja zdarzenia przed wznowieniem sprawy
Process/afterResumptionEmisja zdarzenia po aktualizacji rekordu
DocumentForm/beforeToHtmlAkcja przed serializacją do html formatki dokumentu
DocumentForm/onToHtmlAkcja na serializacji do html formatki dokumentu
DecreeForm/beforeSaveAkcja przed zapisaniem dekretacji dokumentu
DecreeForm/afterSaveAkcja po zapisaniem dekretacji dokumentu
OrderDocumentPlugin/beforeSaveAkcja przed zapisaniem formatki zamówienia
OrderDocumentPlugin/afterSaveAkcja po zapisaniem formatki zamówienia
OrderDocumentPlugin/afterOpenAkcja po otwarciu formatki zamówienia
ProcessEditDialog/beforeOpenAkcja podczas otwierania kartoteki edycji sprawy

Przykład

Tworzymy po stronie GUI nasz CustomWidget jako skrypt. W formatce Element CustomWidget wypełniamy następująco pola:

  • Nazwa -> Example
  • Opis -> CustomWidget jako skrypt
  • Typ -> wybieramy skrypt
  • Parametry wpisujemy:
{
  "script": "MyExample.inc",
  "params": "przykładowy parametr",
  "array": [1,2,3,4],
  "object": {
    "name": "abc"
  }
}
  • Miejce użycia -> DocumentForm/beforeSave

Następnie pobieramy plik z przykładem, który umieszczamy w ścieżce public_html/apps/edokumenty/scripts:

MyExample.inc

Dalej, wchodzimy po stronie GUI do modułu Dokumenty, wybieramy (lub tworzymy nowy) dowolny dokument i klikamy na zapisz. Jeśli zadziałał nasz skrypt, powinien pokazać się alert: