Der ist jetzt sicher und kann produktiv verwendetet werden, wenn ich die Liste mit den Tabellennamen erweitere, die für die Veranstaltungen verwendet werden?
Nachdem Du die Liste mit den Tabellennamen ger nicht verwendest, wenn Du
PHP-Code:
$form_id = \Input::post('form_id');
$tablenames = [
1 => 'tl_an_testlauf',
// ...
];
$tablename = $form_id; // unabhängig vom Inhalt von $tablenames setzt Du hier $tablename immer auf den Inhalt von \Input::post('form_id')
schreibst, bist Du wieder da wo Du schon warst. Funktioniert, sollte man aber nicht unbedingt machen.
Die generelle Frage ist für mich hierbei immer die: woher kommen die Daten?
Der Parameter $arrForm (oder die ID in $intId) kommen von Contao, \Input:ost() vom User und könnte manipuliert sein.
Jetzt kannst Du entweder die $intId zusammen mit der Liste $tablenames verwenden. Sie enthielte bei Verwendung der $intId die Zuorndung von numerischer Formular-ID (gemäß Contao-Backend; siehe dortiges blaues (i)-Icon) zum von Dir benötigten Tabellennamen.
Oder Du verwendest ein Feld aus der Formularkonfiguration, das Du selbst gleich dem benötigten Tabellennamen setzen kannst.
Hier bietet sich für mich aus der Formulardefinition der "Formalias" ("Der Formalias ist eine eindeutige Referenz, die anstelle der numerischen Form-ID aufgerufen werden kann.") an, auf den Du mit $arrForm['alias'] zugreifen können solltest.
Damit hättest Du dann nur noch
PHP-Code:
$tablename = $arrForm['alias'];
Damit sollte dann auch die Prüfung, ob der so bestimmte $tablename === null ist
PHP-Code:
if (null === $tablename) {
System::log("Konnte Tabellenname zu Formular-ID '$form_id' nicht bestimmen", __METHOD__, TL_ERROR);
$objWidget->addError('Der Gutschein-Code ist ungültig oder wurde schon verwendet! -1ste Meldung');
return $objWidget;
}
komplett entfallen können, da Contao den Alias immer setzt: wenn Du keinen Wert vorgibst, wird einer generiert.
Den Sinn der Prüfung
PHP-Code:
if ($arrForm['formID'] == \Input::post('form_id')) {
habe ich noch nicht verstanden. Das wäre ja bestenfalls etwas wie: "ist die form_id aus den Post-Daten wie erwartet gleich der aus den $arrForm-Daten"?
Und wenn ich den Post-Daten nicht vertraue, den $arrForm-Daten aber schon, frage ich mich, wieso ich nicht gleich die $arrForm-Daten verwende.
PHP-Code:
<?php
namespace AppBundle\Hooks;
use Contao\Database;
use Contao\Widget;
use Contao\System;
class Forms {
public function myValidateFormField(Widget $objWidget, $intId, $arrForm) {
if ($objWidget->name == 'gutscheincode') {
$tablename = $arrForm['alias'];
$sql = "SELECT * FROM $tablename WHERE gutscheincode=?";
$result = Database::getInstance()->prepare($sql)->execute($objWidget->value);
if ($result->numRows > 0) {
$objWidget->addError('Dieser Gutschein-Code ist ungültig oder wurde schon verwendet!');
}
}
return $objWidget;
}
}
Noch eine Idee zum Text des addError(): Die Gültigkeit des Gutscheincodes an sich müsste doch von der Validierung bzgl. der Whitelist stammen. D.h. es sollte in diesem -- hoffentlich vorgelagerten Schritt -- eine eigene Fehlermeldung erscheinen. Dann bliebe in diesem Schritt als einziger Fehler noch etwas wie "Dieser Gutschein-Code wurde schon verwendet!". Vielleicht macht es das für den User klarer.
Lesezeichen