Eigenen Controller für Ajax-Abfrage
Hallo,
ich will mir einen Artikel durch seine ID aus der Datenbank per Ajax holen und seine Inhalte dann in den DOM laden. Dafür habe ich mir folgende Sachen erstellt. Ich habe den Cache gelöscht.
Allerdings bekomme ich noch 500 Error zurück und wenn ich die Ajaxurl anklicke, lautet der Fehler im Debugmodus. Woran kann es noch liegen?
PHP-Code:
Call to a member function get() on null
$templateHelper = \Contao\System::getContainer()->get(MetaModelsTemplateHelper::class);
Controller für die Ajaxabfrage in src/Controller/FrontendModule/MetaModelsAjaxController.php
PHP-Code:
<?php
namespace App\Controller\FrontendModule;
use App\Helper\MetaModelsTemplateHelper;
use Contao\CoreBundle\DependencyInjection\Attribute\AsFrontendModule;
use Contao\ModuleModel;
use Symfony\Component\HttpFoundation\Response;
$templateHelper = \Contao\System::getContainer()->get(MetaModelsTemplateHelper::class);
class MetaModelsAjaxController extends AbstractController
{
public function ajaxAction(Request $request): JsonResponse
{
// Daten aus der Anfrage holen
$articleId = (int) $request->query->get('articleId');
$articleItem = $templateHelper->getRelatedArticle($articleId);
dump($articleItem);
// Hier MetaModels-Daten abrufen
$data = [
'id' => $articleItem->get('id'),
'title' => $articleItem->get('title'), // Simulierte Daten
];
return new JsonResponse($data);
}
}
Registrierung der Route in config/routes.yml
PHP-Code:
ajax_metamodels:
path: /ajax/metamodels
controller: App\Controller\FrontendModule\MetaModelsAjaxController::ajaxAction
methods: [GET, POST]
meinen MetaModelsTemplateHelper.php habe ich um eine neue Funktion erweitert
PHP-Code:
public function getRelatedArticle(string $articleId): array
{
$modelName = 'mm_person_articles';
$renderId = 3;
$model = $this->factory->getMetaModel($modelName);
if (!$model) {
throw new \RuntimeException("MetaModel '$modelName' not found.");
}
$filter = $model->getEmptyFilter();
$filterRule = new \MetaModels\Filter\Rules\SimpleQuery('SELECT id FROM mm_person_articles WHERE id = ?', [$articleId]);
$filter->addFilterRule($filterRule);
$items = $model->findByFilter($filter);
$articleItem = $items->parseAll('html5', $this->renderFactory->createCollection($model, $renderId));
return $articleItem;
}
in meiner JS-Datei übergebe ich folgende URL
HTML-Code:
const url = `/ajax/metamodels?articleId=${articleId}`;