YForm Callback-Action mit Parametern

Quell-ID: GitHub Discussion #5

Use Case

Bei einem YForm-Formular soll eine Callback-Funktion aufgerufen werden, der zusätzliche Parameter übergeben werden können.

Verwendete AddOns

  • YForm

Zielbeschreibung

Die Callback-Action in YForm soll nicht nur die Standard-Parameter erhalten, sondern auch eigene, benutzerdefinierte Werte.

Ursprünglicher Code

$yform->setActionField('callback', ['sh_gruppe_aenderungswunsch::newChange']);

Lösung

Mit einer anonymen Funktion (Closure) kann der eigentliche Aufruf mit zusätzlichen Parametern gewrappt werden.

PHP >= 7.4 (Arrow Function)

$yform->setActionField('callback', [
    fn () => sh_gruppe_aenderungswunsch::newChange('hier', 'die', 'params')
]);

PHP < 7.4 (klassische anonyme Funktion)

$yform->setActionField('callback', [
    function () {
        sh_gruppe_aenderungswunsch::newChange('hier', 'die', 'params');
    }
]);

Mit Zugriff auf das YForm Action-Objekt

YForm übergibt standardmäßig das rex_yform_action_callback-Objekt als ersten Parameter. Bei der obigen Variante wird es verschluckt. Falls das Objekt weiterhin übergeben werden soll:

$yform->setActionField('callback', [
    fn (rex_yform_action_callback $action) => sh_gruppe_aenderungswunsch::newChange($action, 'hier', 'die', 'params')
]);

Die Callback-Methode

class sh_gruppe_aenderungswunsch
{
    public static function newChange(rex_yform_action_callback $action, string $param1, string $param2, string $param3): void
    {
        // $action ist das übergebene Action-Objekt
        // Zugriff auf Formulardaten:
        $formData = $action->getParam('value_pool');
    }
}

Besserer Ansatz

Für komplexere Szenarien empfiehlt sich eine dedizierte Callback-Klasse:

class MyFormCallback
{
    private array $params;
    
    public function __construct(array $params)
    {
        $this->params = $params;
    }
    
    public function __invoke(rex_yform_action_callback $action): void
    {
        // Zugriff auf $this->params und $action
    }
}

// Verwendung
$yform->setActionField('callback', [new MyFormCallback(['key' => 'value'])]);

Diese objektorientierte Variante ist besonders bei vielen Parametern übersichtlicher und leichter testbar.