Przejdź do głównej treści

Prosty dialog


W artykule tym został opisany przykład prostego okna dialogowego z wykorzystaniem kilku pól formularza oraz podstawowymi przyciskami zapisz i anuluj.

Widok
Przykład prostego okna dialogowego
Przykład prostego okna dialogowego

Przykład do pobrania oraz listing klasy

Przykład do pobrania

Poniżej znajduje się plik z przykładem klasy dialoga dodania/edycji Ticketa.

Tutaj go możesz pobrać: TicketDialog.inc

Metoda cMethods

Jeśli potrzebujemy odwołać się po jakimś zdarzeniu JS-owym na przycisku/pola, musimy zadeklarować metodę w tablicy cMethods

/**
 * Lista method do których możemy się odwołać przez JS-a
 * @var string[] 
*/
protected static $cMethods = [
    'toHtml' => 'toHtml',
];

Metoda Open

Jest odpowiedzialna za sprawdzenie czy użytkownik ma prawo wejść do danego modułu, sprawdzamy to za pomocą klasy UserRights.
Poniższy przykład sprawdza prawa dostępu do modułu Baza wiedzy

if (!UserRights::checkSysAcc('bswfms.knowledgebase')) {
    JScript::add('alertMessage(\''.Translator::translateJS('Brak uprawnień do bazy wiedzy').'\');');
    return FALSE;
}
  • Następnie powinniśmy w metodzie open wywołać rodzica metody i wywołać metode create by utworzył się nam formularz. Wykonujemy to wszystko za pomocą:
parent::open();
$this->create();
  • Jeśli potrzebujemy przesłać do formularza jakieś dane, to należy przed wywołaniem metody create użyć z klasy DialogForm metody setSData(). Ustawienie statycznych danych na dialogu, dzięki którym, np. możemy przesłać dane nie od użytkownika, tylko systemowe, takie dane, które wskażą nam jednoznacznie Beana.
$this->setSData(['ticketIsHelp' => $this->ticketIsHelp]);
  • Jeśli potrzebujesz dane do formularza użyj metody setWData() z klasy DialogForm. Jest ona odpowiedzialna za dodanie danych do Widgetu np. gdy chcesz by pole miało już jakąś deflautową wartość w value.
$this->setWData([
    'contid' => $defaultData['contid'],
    'copeid' => $defaultData['copeid'],
]);

Metoda create

Jest odpowiedzialna za utworzenie ciała dialog-a, to tutaj deklarujemy różne typy pól do formularza.
By poprawnie utworzyć metodę create pierw należy sprawdzić czy dialog został otworzony. Sprawdzamy to po przez:

if (!$this->isOpened()) {
    return FALSE;
}

Metoda save

Jak można się domyślać tworzy nowy, bądź edytuje już istniejący zasób.
Tutaj także walidujemy dane wejściowe
Możesz znaleźć przykład prostego walidatora w przykładowym pliku. Link do pliku znajdziesz na początku tego dokumentu.
Dane możesz pobrać dane przez:

$sData = $this->getSData();
$wData = $this->getWData();

ale także pobrać wszystkie dane skomasowane w jedną tablicę po przez użycie

$this->getData();

Dodawanie pol w formularzu

By dodać pola do formularza, pierw trzeba utworzyć obiekt typu DialogComposer, a później dodajemy widgety dla określonych typów danych/pol. Jeśli chcesz zobaczyć przykład, wróć się do przykładowego pliku TicketDialog.inc i spójrz na linie 210 w chronionej metodzie create.

Dodanie przycisków Zapisz i Analuj

Dodanie przycisków jest bardzo proste. Wystarczy na nowo utworzony obiekt klasy DialogComposer odwołać się do metody addModernButtonsPanel.
Pierwszy parametr w tej metodzie jest ustawiony na wartości deflautowe 'bOk','bCancel'

$dialogComposer->addModernButtonsPanel([
    'bSave',
    'bCancel',
]);

Deklaracja Dialogu w Service

Deklaracja statyczna

Akcje statyczne / korowe, to akcje które zostały już zaimplementowane w podstawowej wersji systemu. Plik odpowiedzialny za mapowanie serwisów to MapService.inc


Przykład

self::FKRCPELEMENT => [
    'dscrpt'       => Translator::translate('Pozycja produktu na karcie RCP'),
    'path'         => MOD_PATH.'Evidence/forms/FKElementRCPDialog.inc',
    'class'        => 'FKElementRCPDialog',
    'dscrptColumn' => 'commnt',
    'beanPath'     => MOD_PATH.'Evidence/beans/FKElementRCPBean.inc',
    'beanClass'    => 'FKElementRCPBean',
    'caption'      => '',
    'params'       => ['fkelid' => 0],
],
  1. Zadeklaruj stałą, z nawą oraz wartością pisaną z dużych liter, np. const FKRCPELEMENT = 'FKRCPELEMENT';
  2. Utwórz na końcu tablicy statycznej map, która znajduje się w metodzie statycznej init, tablice której kluczem będzie twoja stała a wartością tablica z parametrami. Przed wszystkim dodaj:
    1. path z ścieszką do pliku który chcesz załadować.

      Notatka

      Tutaj należy trzymać się konwencji rozdzielenia typu klasy na różne katalogi oraz ustawiania poprawnych nazw pliku/klasy.
      - Plik typu lista dajemy do głównego katalogu. Ten typ pliku jest odpowiedzialny za wyświetlenie listy np. użytkowników,
      - Inne typy plików trzymamy w osobnych katalogach oraz ustawiamy nazwę pliku/klasy tak by mówiła czego dotyczy ale nazwa nie może zawierać typu pliku.

    2. class z nazwą klasy, którą chcesz użyć, (mamy pliki gdzie możemy znaleźć pare klas w 1 pliku)
    3. gicon ikonki, które znajdziesz w guideline,
    4. beanPath path do potrzebnego beana / zasobu bazy danych. Powinien znajdować się w katalogu beans i nazwa klasy oraz pliku nie powinna zawierać słowa bean
    5. beanClass tjw. z class,

Notatka

Pamiętaj, że Dialog jest odpowiedzialny za załadowanie formularza do dialoga/okienta, a formularz pracuje na danych oraz różnymi typami pól.

Deklaracja akcji specjalnej

Akcje specjalne są tworzone dla klienta gdy chce jakąś modyfikację, czyli są one tworzone per projekt.

Plik odpowiedzialny za mapowanie serwisów specjalnych to CustomMapService.inc Ładuje on dane z pliku typu JSON, jego budowa jest taka sana jak w MapService
Przykład

  "CUSTOM_EXACTORIS_TESTS_RUN": {
    "caption": "Uruchomienie testów",
    "icon": "goal.svg",
    "path": "{SCRIPTS_PATH}Exactoris\/View/Form\/TestsRunDialog.inc",
    "class": "\\ReadyApp\\Exactoris\\View\\Form\\TestsRunDialog",
    "params": {
      "prc_id": 0
    }
  }
  1. Nazwa klucza składa się z:
    • Wymaganego 1 segmentu CUSTOM, np. CUSTOM_ EXACTORIS_TESTS_RUN
    • Drugi segment nazwy, jest to Nazwa projektu, np. CUSTOM_ EXACTORIS _TESTS_RUN
    • Trzeci segment to Nazwa akcji, np. CUSTOM_EXACTORIS_ TESTS_RUN
  2. W params można od razu przesłać, typ akcji przez parameter 'mode', np: "mode": 'new'