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.