Przejdź do głównej treści

Listing przykładowej klasy

Kod
<?php

/**
 * CustomJSMenu jako custom widget
 */
final class CustomJSMenu {
    /**
     * @var string[]
     */
    // opisane w ptk. 1.
    private static $cMethods = [
        'execute'
    ];

    /**
     * @return string[]
     */
    public function getCallableMethods() {
        return self::$cMethods;
    }

    /**
     * @param $params
     * @return string|true
     */
    // opisane w ptk. 2.
    public function execute($params) {
        $pData = JSON::toArray($params);

        return print_r($pData, TRUE);
    }

    /**
     * @param $args
     * @return bool
     */
    // opisane w ptk. 3.
    public static function init($args) {
        if (!isset($args['menu']) || !$args['menu'] instanceof JSMenu) {
            return FALSE;
        }
        // opisane w ptk. 3.1.
        $HWND = App::registerClass('./scripts/CustomJSMenu.inc', __CLASS__);

        // menu drugiego poziomu
        $newSubMenu = new JSMenu($args['menu']->name.'newSubMenu');
        $newSubMenu->width = 260;
        $newSubMenu->addItem('document', Translator::translate('Nowy dokument'), NULL, 'on', TRUE);
        $newSubMenu->addItem('report', Translator::translate('Nowy raport'), NULL, 'on', TRUE);
        $newSubMenu->onChange = '(value) => {alert(value);}';

        $args['menu']->addItem('new', Translator::translate('Nowy'), NULL, 'on', TRUE, $newSubMenu);
        $args['menu']->addItem('edit', Translator::translate('Edycja)'), NULL, 'on', TRUE);
        $args['menu']->onChange = '(value) => {
                let params = '.(isset($args['params']) ? $args['params'] : '\'{}\'').'.parseJSON();
                let keyval = (typeof params[\'keyval\'] !== \'undefined\') ? params[\'keyval\'] : [];
                let js_after = (typeof params[\'js_after\'] !== \'undefined\') ? params[\'js_after\'] : () => {};                

                if (value === \'new\') {
                    // opisane w ptk. 3.2.
                    $A1(\''.$HWND.'\', null, '.(int)array_search('execute', self::$cMethods).', ({contid:keyval, js_after:js_after}).toJSONString(), \'alert(text);\');
                }
                
                if (value === \'edit\') {
                    // moze byc wiele zaznaczonych -> edytuj tylko pierwszego klienta
                    if (keyval.length) {
                        App.openDialogByCls(\'CONTACT_EDIT\', keyval.shift());
                    } else {
                        WidgetException(null, \'Wybierz klienta z listy\');
                    }
                }                
            }';
    }
}

// Wymagane, aby uruchomić skrypt
// W zmiennej $args, są to parametry w formie JSON lub ARRAY, przesłane z pola Parametry i obiektu, na którym dodany jest przycisk
CustomJSMenu::init($args);

Objaśnienie przykładu

  1. Parametr $cMethods
private static $cMethods = [
    'execute'
];

Parametr przechowuje listę dostępnych medot, które możemy wyołać poprzez JavaScript przez funkcje $A11. Ów listę możęmy w łatwy sposób przeszukać poprzez użycie array_search, np.

array_search('execute', self::$cMethods)
  1. Metoda execute W ów metodzie, możemy zawżeć całą logikę biznesową. Np. sprawdzić prawa i wyrenderować do html-a cały formularz

By móc użyć zwracanych danych (różnego typu) w wywołaniu poprzez $A1 z ów metody Metoda zwraca stringa, który później będzie użyty w $A1

public function execute($params) {
    $pData = JSON::toArray($params);

    return print_r($pData, TRUE);
}
  1. Metoda statyczna init,

Ta metoda musi być statyczna, gdyż po za ciałem klasy musimy ją wywołać poprzez:

CustomJSMenu::init($args);

a to wszystko po to by, framework załadował ów klase i odrazu wywołał interesującą nas metodę.

3.1. $HWND - złapanie uchwytu, na daną klasę, potrzebny dla js-owej metody $A1

$HWND = App::registerClass('./scripts/CustomJSMenu.inc', __CLASS__);

3.2. $A1 - Jest to ajaxowe wywołanie

$A1(\''.$HWND.'\', null, '.(int)array_search('execute', self::$cMethods).', ({contid:keyval, js_after:js_after}).toJSONString(), \'alert(text);\');

Parametr nr 1. - parametr HWND czyli nasz uchwyt na daną klasę,

Parametr nr 2. - w przykładzie podaliśmy wartość null, ale możemy w prost podać nazwę elementu, np. pola typu input, bądz panelu

Parametr nr 3. - id metody execute w tablicy self::$cMethods,

Parametr 4. - są to parametry do metody execute w formie JSON-a, np.

{
  contid: keyval,
  js_after: js_after
}

Parametr 5. - są to dane zwrócone z metody execute i wrzucone dla przykładu w js-owy alert,

alert(text);

Możemy tutaj zastosować funkcje, która sprawdzi czy otrzymaliśmy callbacka i dane włoży w znaleziony element, np.

function(text){$(\''.$this->name.'rp\').innerHTML = text;}