Hallo,
ich setze MetaModels 2.2 auf Contao 4.9 ein und möchte beim Erstellen eines Datensatzes im Frontend in MetaModels in das Datenfeld arc_tlmember_id die ID des gerade angemeldeten Members schreiben.
Hierzu bin ich durch einen Beitrag im Forum auf das Event PreEditModelEvent gestoßen. Damit funktioniert dies auch mit dem folgenden Code:
PHP-Code:
<?php
// src/EventListener/TestListener.php
namespace App\EventListener;
use ContaoCommunityAlliance\DcGeneral\Event\PreEditModelEvent;
use ContaoCommunityAlliance\DcGeneral\Event\PostPersistModelEvent;
use Terminal42\ServiceAnnotationBundle\Annotation\ServiceTag;
use Doctrine\DBAL\Connection;
use Contao\FrontendUser;
use Contao\CoreBundle\Routing\ScopeMatcher;
use Symfony\Component\HttpFoundation\RequestStack;
use Contao\CoreBundle\Monolog\ContaoContext;
use Psr\Log\LogLevel;
/**
* @ServiceTag("kernel.event_listener", event=PreEditModelEvent::NAME)
*/
class TestListener
{
public function __invoke(PreEditModelEvent $event):void
{
$strMetaModelNameConst = 'mm_dz_arc_artikelcontent';
$strMetaModelName = $event->getEnvironment()->getDataDefinition()->getName();
$myScope = TL_MODE;
if ('FE' !== TL_MODE
|| $strMetaModelNameConst != $strMetaModelName){
return;
} else
{
$Meldung ="Sind im FE in " . $strMetaModelName;
$myMemberID = \Contao\FrontendUser::getInstance()->id;
/** @var \MetaModels\DcGeneral\Data\Model $model */
$model = $event->getModel();
$mmId = $model->getItem()->get('id');
$myOwnerArray = $model->getItem()->get('arc_tlmember_id');
$myOwner = $myOwnerArray['id'];
if (empty($myOwner)){
$SchreibeMemberID = "Ja";
$db = \Contao\System::getContainer()->get('database_connection');
$count = $db->executeStatement("UPDATE mm_dz_arc_artikelcontent SET arc_tlmember_id=? WHERE id=?", array($myMemberID, $mmId));
}
}
\System::getContainer()
->get('monolog.logger.contao')
->log(LogLevel::INFO, 'TEST - Scope=' . $myScope . ' - Tabelle=' . $strMetaModelName . ' - Meldung: ' . $Meldung . ' - myOwner=' . $myOwner . ' - MemberID=' . $myMemberID . ' - DBCount=' . $count . ' - MM-Id='. $mmId . ' - SchreibeMemberID=' . $SchreibeMemberID, array(
'contao' => new ContaoContext(__CLASS__.'::'.__FUNCTION__, TL_GENERAL
)));
}
}
Allerdings ist das Event doch nicht ideal, da der Datensatz zu dem Zeitpunkt ja noch nicht existiert. Daher habe ich es stattdessen mit dem Event PostPersistModelEvent versucht. Hier erhalte ich aber die Fehlermeldung
Code:
request.CRITICAL: Uncaught PHP Exception TypeError: "Argument 1 passed to App\EventListener\TestListener::__invoke() must be an instance of ContaoCommunityAlliance\DcGeneral\Event\PostPersistModelEvent, instance of ContaoCommunityAlliance\DcGeneral\Event\PreEditModelEvent given, called in /html/contao/vendor/symfony/event-dispatcher/EventDispatcher.php on line 304" at /html/contao/src/EventListener/TestListener.php line 22 {"exception":"[object] (TypeError(code: 0): Argument 1 passed to App\\EventListener\\TestListener::__invoke() must be an instance of ContaoCommunityAlliance\\DcGeneral\\Event\\PostPersistModelEvent, instance of ContaoCommunityAlliance\\DcGeneral\\Event\\PreEditModelEvent given, called in /html/contao/vendor/symfony/event-dispatcher/EventDispatcher.php on line 304 at /html/contao/src/EventListener/TestListener.php:22)"} []
Da ich noch nicht viel Erfahrung mit php habe verstehe ich das so, das es die Methode __invoke für PostPersistModelEvent nicht gibt.
Ich habe das Forum dazu schon intensiv durchsucht, bin aber leider nicht weiter gekommen.
Hinweise sind herzlich willkommen.
Lesezeichen