The storeFormData
hook is triggered before a submitted form is stored to the
database. It passes the result set and the form object and expects the result
set as return value.
array $data
The result set that will be written to the database table.
\Contao\Form $form
The form instance.
Return $data
or an array of key => values that should be written to the
database.
// src/EventListener/StoreFormDataListener.php
namespace App\EventListener;
use Contao\CoreBundle\DependencyInjection\Attribute\AsHook;
use Contao\Form;
use Contao\FrontendUser;
use Doctrine\DBAL\Connection;
use Symfony\Component\Security\Core\Security;
#[AsHook('storeFormData')]
class StoreFormDataListener
{
/**
* @var Connection
*/
private $connection;
/**
* @var Security
*/
private $security;
public function __construct(Connection $connection, Security $security)
{
$this->connection = $connection;
$this->security = $security;
}
public function __invoke(array $data, Form $form): array
{
$data['member'] = 0;
$user = $this->security->getUser();
if (!$user instanceof FrontendUser) {
return $data;
}
if (!$this->columnExistsInTable('member', $form->targetTable)) {
return $data;
}
// Also store the member ID who submitted the form
$data['member'] = $user->id;
return $data;
}
private function columnExistsInTable(string $columnName, string $tableName): bool
{
$columns = $this->connection->getSchemaManager()->listTableColumns($tableName);
foreach ($columns as $column) {
if ($column->getName() === $columnName) {
return true;
}
}
return false;
}
}