
Zitat von
Spooky
@jenda in deinem Slack Thread hast du nun anderen Code gepostet und einen anderen Fehler. Das solltest du hier dementsprechend auch machen.
Zudem scheint dein Problem erstmal auch gar nichts mit MetaModels zu tun haben, oder?
Es geht darum, dass das System immer noch nicht die Funktion getRelatedArticle in meinem Helper findet. Also ich bekomme folgende Fehlermeldung, wenn ich die entsprechende URL mit einem entsprechenden ID aufrufe.
Fehlermeldung
PHP-Code:
Symfony\Component\ErrorHandler\Error\UndefinedMethodError:
Attempted to call an undefined method named "getRelatedArticle" of class "App\Helper\MetaModelsTemplateHelper".
at src/Controller/MetaModelsAjaxController.php:29
at App\Controller\MetaModelsAjaxController->__invoke(object(Request))
(vendor/symfony/http-kernel/HttpKernel.php:181)
at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), 1)
(vendor/symfony/http-kernel/HttpKernel.php:76)
at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), 1, true)
(vendor/symfony/http-kernel/Kernel.php:197)
at Symfony\Component\HttpKernel\Kernel->handle(object(Request))
(public/index.php:42)
Hier sind nochmals alle Dateien, die ich dafür verwende
config/routes.yml
PHP-Code:
ajax_get_data:
path: /ajax/get-data
controller: App\Controller\AjaxController::getData
methods: GET
app.controller:
resource: ../src/Controller
type: annotation
config/services.yml
services:
PHP-Code:
App\Helper\MetaModelsTemplateHelper:
public: true
autowire: true
autoconfigure: true
App\Controller\:
resource: '../src/Controller/'
arguments:
public: true
autowire: true
autoconfigure: true
src/Controller/MetaModelsAjaxController.php
PHP-Code:
<?php
namespace App\Controller;
use App\Helper\MetaModelsTemplateHelper;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
#[Route('/ajax/mm-articles', name: MetaModelsAjaxController::class)]
class MetaModelsAjaxController
{
private MetaModelsTemplateHelper $templateHelper;
public function __construct(MetaModelsTemplateHelper $templateHelper)
{
$this->templateHelper = $templateHelper;
}
public function __invoke(Request $request): JsonResponse
{
$articleId = (int) $request->query->get('articleId'); // Falls du eine ID brauchst
if (!$articleId) {
return new JsonResponse(['error' => 'Ungültige Anfrage'], 400);
}
$articleItem = $this->templateHelper->getRelatedArticle($articleId);
if (!$articleItem) {
return new JsonResponse(['error' => 'Artikel nicht gefunden'], 404);
}
return new JsonResponse([
'id' => $articleItem->get('id'),
'title' => $articleItem->get('title'),
]);
}
}
src/Helper/MetaModelsTemplateHelper.php
PHP-Code:
<?php
namespace App\Helper;
use MetaModels\Filter\Setting\IFilterSettingFactory;
use MetaModels\Render\Setting\IRenderSettingFactory;
use MetaModels\IFactory;
use MetaModels\IMetaModel;
class MetaModelsTemplateHelper
{
/**
* The factory.
*
* @var IFactory
*/
private IFactory $factory;
/**
* Filter setting factory.
*
* @var IFilterSettingFactory
*/
private IFilterSettingFactory $filterFactory;
/**
* Render setting factory.
*
* @var IRenderSettingFactory
*/
private IRenderSettingFactory $renderFactory;
/**
* MetaModelsTemplateHelper constructor.
*
* @param IFactory $factory
* @param IFilterSettingFactory $filterFactory
* @param IRenderSettingFactory $renderFactory
*/
public function __construct(
IFactory $factory,
IFilterSettingFactory $filterFactory,
IRenderSettingFactory $renderFactory
) {
$this->factory = $factory;
$this->filterFactory = $filterFactory;
$this->renderFactory = $renderFactory;
}
/**
* Retrieve all staff members of a given division.
*
* @param string $divisionAlias The alias of division.
*
* @return array
*/
public function getPersonArticles(string $personId): array
{
$modelName = 'mm_person_articles';
$renderId = 3;
$parentId = (int) $personId;
$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 pid = ?', [$parentId]);
$filter->addFilterRule($filterRule);
$items = $model->findByFilter($filter);
$articleItems = $items->parseAll('html5', $this->renderFactory->createCollection($model, $renderId));
return $articleItems;
}
public function getRelatedArticle(string $articleId): ?IMetaModel
{
$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);
if (empty($items)) {
return null;
}
$relatedArticleItems = $items->parseAll('html5', $this->renderFactory->createCollection($model, $renderId));
return $relatedArticleItems[0];
}
}