Ergebnis 1 bis 40 von 40

Thema: Eigenen Controller für Ajax-Abfrage

  1. #1
    Contao-Fan Avatar von jenda
    Registriert seit
    20.06.2009.
    Ort
    Berlin
    Beiträge
    521

    Standard 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
    : [GETPOST
    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}`;

  2. #2
    Alter Contao-Hase
    Registriert seit
    24.02.2021.
    Beiträge
    1.471
    Partner-ID
    11715
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Ich nutze kein Metamodels, hier müsstest du auf cc @zonky warten.

    Sollte
    $templateHelper = \Contao\System::getContainer()->get(MetaModelsTemplateHelper::class);
    nicht innerhalb der Methode ajaxAction sein ?

  3. #3
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    37.137
    Partner-ID
    10107

    Standard

    Du solltest außerdem DI verwenden, nicht System::getContainer()
    » sponsor me via GitHub or Revolut

  4. #4
    Alter Contao-Hase
    Registriert seit
    24.02.2021.
    Beiträge
    1.471
    Partner-ID
    11715
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Du solltest außerdem DI verwenden, nicht System::getContainer()
    Wenn Zonky seine Notifications aus dem Forum funktionieren würden, hätte er dies schon lange erwähnt <3

  5. #5
    Contao-Fan Avatar von jenda
    Registriert seit
    20.06.2009.
    Ort
    Berlin
    Beiträge
    521

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Du solltest außerdem DI verwenden, nicht System::getContainer()
    Was heißt DI konkret?

  6. #6
    Wandelndes Contao-Lexikon Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    10.180
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von zoglo Beitrag anzeigen
    Wenn Zonky seine Notifications aus dem Forum funktionieren würden, hätte er dies schon lange erwähnt <3
    hmm - verstehe ich nicht...


    @Jan:

    wenn man nicht gerade in einem Template unterwegs ist, sollte man die Sachen z. B. über einen Contructor rein ziehen und nicht per System::getContainer() ... siehe Handbuch
    https://metamodels.readthedocs.io/de...terer-services ff.
    und Beispiele
    https://github.com/e-spin/vortrag-co...lateHelper.php
    https://github.com/e-spin/vortrag-co...ntListener.php

    In dem Controller dann den Helper einzubinden ist eher "suboptimal"

    Tipp:

    baue Dir die Sachen Schrittweise auf - also simpler Controller, der "Hallo Welt" zurück liefert - wenn das geht, das Routing anpassen so dass nur die notwendigen Sachen übergeben werden können, weiter gehts mit einfachen Ajax call, dann die Sachen aus der MM-API einbauen...

    Da Du mehrsprachig bist, musst Du sicher die gewünschte Sprache mit übergeben und abfragen.

  7. #7
    Alter Contao-Hase
    Registriert seit
    24.02.2021.
    Beiträge
    1.471
    Partner-ID
    11715
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Zitat Zitat von zonky Beitrag anzeigen
    hmm - verstehe ich nicht...
    https://community.contao.org/de/show...f%C3%BCr-zonky

  8. #8

  9. #9
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    37.137
    Partner-ID
    10107

    Standard

    @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?
    » sponsor me via GitHub or Revolut

  10. #10
    Contao-Fan Avatar von jenda
    Registriert seit
    20.06.2009.
    Ort
    Berlin
    Beiträge
    521

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    @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), 1true)
         (
    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];
        }
    }
    Geändert von jenda (13.03.2025 um 20:03 Uhr)

  11. #11
    Wandelndes Contao-Lexikon Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    10.180
    User beschenken
    Wunschliste

    Standard

    Du solltest eher die Methode getPersonArticles als private in den Controller packen sowie im Constructor die aus dem Helper und dann aus invoke das getPersonArticles abfragen

    irgendwie wird Deine Fehlermeldung nicht angezeigt - zumindest bei mir nicht

    ... warum er die Methode nicht findet, sehe ich ad hoc auch nicht - mit den auto* Sachen sollte alles für die Argumente aufgelöst werden

  12. #12
    Contao-Fan Avatar von jenda
    Registriert seit
    20.06.2009.
    Ort
    Berlin
    Beiträge
    521

    Standard

    Anscheinend kann das System nun die Class finden, allerdings erhalte ich nun eine Fehlermeldung Call to a member function get() on null für

    PHP-Code:
    $filterRule = new \MetaModels\Filter\Rules\SimpleQuery(
                
    'SELECT id FROM mm_person_articles WHERE id = ?',
                [
    $articleId]
            ); 

    PHP-Code:
    Error:
    Call to a member function get() on null

      at vendor
    /metamodels/core/src/Filter/Rules/SimpleQuery.php:172
      at MetaModels
    \Filter\Rules\SimpleQuery->sanitizeConnection(null)
         (
    vendor/metamodels/core/src/Filter/Rules/SimpleQuery.php:114)
      
    at MetaModels\Filter\Rules\SimpleQuery->__construct('SELECT id FROM mm_person_articles WHERE id = ?', array('7'))
         (
    src/Helper/MetaModelsTemplateHelper.php:92)
      
    at App\Helper\MetaModelsTemplateHelper->getRelatedArticle('7')
         (
    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), 1true)
         (
    vendor/symfony/http-kernel/Kernel.php:197)
      
    at Symfony\Component\HttpKernel\Kernel->handle(object(Request))
         (public/
    index.php:42

  13. #13
    Contao-Fan Avatar von jenda
    Registriert seit
    20.06.2009.
    Ort
    Berlin
    Beiträge
    521

    Standard

    Zitat Zitat von zonky Beitrag anzeigen
    Du solltest eher die Methode getPersonArticles als private in den Controller packen sowie im Constructor die aus dem Helper und dann aus invoke das getPersonArticles abfragen

    irgendwie wird Deine Fehlermeldung nicht angezeigt - zumindest bei mir nicht

    ... warum er die Methode nicht findet, sehe ich ad hoc auch nicht - mit den auto* Sachen sollte alles für die Argumente aufgelöst werden
    Wenn ich es richtig verstehe, soll ich die Class getRelatedArticle aus dem Helper rausnehmen und dafür in den Controller packen?

  14. #14
    Wandelndes Contao-Lexikon Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    10.180
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von jenda Beitrag anzeigen
    Wenn ich es richtig verstehe, soll ich die Class getRelatedArticle aus dem Helper rausnehmen und dafür in den Controller packen?
    ja, den Helper brauchst Du ja nun eigentlich nicht mehr

  15. #15
    Contao-Fan Avatar von jenda
    Registriert seit
    20.06.2009.
    Ort
    Berlin
    Beiträge
    521

    Standard

    Zitat Zitat von zonky Beitrag anzeigen
    ja, den Helper brauchst Du ja nun eigentlich nicht mehr
    Den verwende ich allerdings für die Ausgabe von allen Artikeln bei einer Person. In diesem Fall geht es mir darum, dass ich mir aus dem Attribut Select, die zugehörigen Artikel bei einem Artikel per Ajax rausholen will.

  16. #16
    Wandelndes Contao-Lexikon Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    10.180
    User beschenken
    Wunschliste

    Standard

    "verboten" ist es sicherlich nicht - viele Wege führen nach Rom...

    Die Fehlermeldung kann nicht so recht deuten - der Contructor von SimpleQuery bekommt keine DB-Connection und der Fallback auf System::getContainer()->get('database_connection') schlägt fehl - hmm...

  17. #17
    Contao-Fan Avatar von jenda
    Registriert seit
    20.06.2009.
    Ort
    Berlin
    Beiträge
    521

    Standard

    Zitat Zitat von zonky Beitrag anzeigen
    "verboten" ist es sicherlich nicht - viele Wege führen nach Rom...

    Die Fehlermeldung kann nicht so recht deuten - der Contructor von SimpleQuery bekommt keine DB-Connection und der Fallback auf System::getContainer()->get('database_connection') schlägt fehl - hmm...
    Mich überrascht das auch, weil es bei den anderen Class für die Personen und deren Artikeln im Helper ohne Probleme klappt. Meinst du, dass es einen Fehler irgendwo gibt, der damit zusammenhängen könnte?

    Warum meinst du, dass ich den Helper nicht brauche? Würdest du die MM-Abfrage direkt in AJAX-Controller machen?

  18. #18
    Wandelndes Contao-Lexikon Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    10.180
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von jenda Beitrag anzeigen
    A) Warum meinst du, dass ich den Helper nicht brauche?
    B) Würdest du die MM-Abfrage direkt in AJAX-Controller machen?
    zu A: musst Du planen

    zu B: ja

  19. #19
    Wandelndes Contao-Lexikon Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    10.180
    User beschenken
    Wunschliste

    Standard

    mit

    PHP-Code:

    /**
     * https://domain.de/ajax/mm-articles/11
     *
     * Gruss Ingolf
     */

    #[Route('/ajax/mm-articles/{articleId}', name: MetaModelsAjaxController::class, defaults: ['_scope' => 'frontend', '_token_check' => false])]
    class MetaModelsAjaxController
    {
    //...

        
    public function __invoke(int $articleIdRequest $request): JsonResponse
        
    {
    //... 
    läuft die Sache erstmal ... der Rest ist noch ausbaufähig

  20. #20
    Alter Contao-Hase
    Registriert seit
    24.02.2021.
    Beiträge
    1.471
    Partner-ID
    11715
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Zitat Zitat von zonky Beitrag anzeigen
    mit

    PHP-Code:

    /**
     * https://domain.de/ajax/mm-articles/11
     *
     * Gruss Ingolf
     */

    #[Route('/ajax/mm-articles/{articleId}', name: MetaModelsAjaxController::class, defaults: ['_scope' => 'frontend', '_token_check' => false])]
    class MetaModelsAjaxController
    {
    //...

        
    public function __invoke(int $articleIdRequest $request): JsonResponse
        
    {
    //... 
    läuft die Sache erstmal ... der Rest ist noch ausbaufähig
    Wäre das nicht etwas fürs Handbuch?

  21. #21
    Wandelndes Contao-Lexikon Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    10.180
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von zoglo Beitrag anzeigen
    Wäre das nicht etwas fürs Handbuch?
    ist für alle zugänglich: https://github.com/MetaModels/docs-de/

    wobei das Routing mit MM primär nix zu tun hat(te) - könnte also auch in das C-Handbuch

  22. #22
    Alter Contao-Hase
    Registriert seit
    24.02.2021.
    Beiträge
    1.471
    Partner-ID
    11715
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Zitat Zitat von zonky Beitrag anzeigen
    ist für alle zugänglich: https://github.com/MetaModels/docs-de/

    wobei das Routing mit MM primär nix zu tun hat(te) - könnte also auch in das C-Handbuch
    Ist es bereits:
    https://docs.contao.org/dev/framework/routing/

    Und auch in der Symfony Dokumentation:
    https://symfony.com/doc/current/routing.html

    Aber wenn es nichts mit MM zu tun hatte, dann braucht man auch keinen Eintrag im MM Handbuch, da hast du natürlich recht.

    Vielleicht sollte in das MM Handbuch Repo auch eine CONTRIBUTING.md denn da fehlt gänzlich eine Dokumentation, wie man beitragen könnte.

  23. #23
    Wandelndes Contao-Lexikon Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    10.180
    User beschenken
    Wunschliste

    Standard

    siehe https://community.contao.org/de/show...l=1#post388357 ... seit 2015 gab es glaube ich zwei Artikel, die nicht von mir geschrieben wurden

    eine CONTRIBUTING.md kann ich aber dennoch anlegen - die Hoffnung stirbt zuletzt

    das sind "normale" MD Dateien mit ein paar kleinen Besonderheiten - dazu gibts die liesmich.txt

  24. #24
    Wandelndes Contao-Lexikon Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    10.180
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von zoglo Beitrag anzeigen
    das hatte ich oben ja auch verlinkt - ist aber alles etwas verteilt im C-Handbuch und es gibt keine so richtige "C&P-Vorlage" für eine Abfrage mit ein, zwei Parametern

  25. #25
    Alter Contao-Hase
    Registriert seit
    24.02.2021.
    Beiträge
    1.471
    Partner-ID
    11715
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Zitat Zitat von zonky Beitrag anzeigen
    das hatte ich oben ja auch verlinkt - ist aber alles etwas verteilt im C-Handbuch und es gibt keine so richtige "C&P-Vorlage" für eine Abfrage mit ein, zwei Parametern
    Muss man sich zusammen schustern. Nicht immer kann die eine von unendlichen Lösungen copy-paste ready dokumentiert werden.

    https://docs.contao.org/dev/framewor...srf-protection

    https://docs.contao.org/dev/framewor...#request-scope

    Zitat Zitat von zonky Beitrag anzeigen
    dazu gibts die liesmich.txt
    Der Link http://rst.ninjs.org/ ist nicht mehr aufrufbar.

    Warum nicht in die Readme? Dann würde man es beim Aufruf des Repos sehen. Vermutlich ist deine liesmich.txt dann die CONTRIBUTING.md ?
    Da es eine .txt Datei ist, würde auch kein markdown gehen Wäre es ein .md, könntest du sogar code tags nutzen.

    **Edit**

    Wäre aber offtopic, vielleicht sollten wir dafür einen eigenen Thread machen.
    Geändert von zoglo (15.03.2025 um 13:31 Uhr)

  26. #26
    Wandelndes Contao-Lexikon Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    10.180
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von zoglo Beitrag anzeigen
    Muss man sich zusammen schustern.
    korrekt - aber offensichtlich finden nicht alle Schuster die richtigen Lederflecken ;-)

  27. #27
    Alter Contao-Hase
    Registriert seit
    24.02.2021.
    Beiträge
    1.471
    Partner-ID
    11715
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Zitat Zitat von zonky Beitrag anzeigen
    korrekt - aber offensichtlich finden nicht alle Schuster die richtigen Lederflecken ;-)
    Dann waren sie keine Schuster.

  28. #28
    Wandelndes Contao-Lexikon Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    10.180
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von zoglo Beitrag anzeigen
    Wäre aber offtopic, vielleicht sollten wir dafür einen eigenen Thread machen.
    ich kann das sicher mal anpassen - die liesmich.txt war eher als Info für mich aus den Anfangstagen des Handbuches vor nun fast 11 Jahren... ich glaube nicht, dass dadurch der große Schreibwille entfacht wird

  29. #29
    Wandelndes Contao-Lexikon Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    10.180
    User beschenken
    Wunschliste

    Standard

    https://github.com/MetaModels/docs-d...ONTRIBUTING.md

    nun bin ich gespannt, welche Flut von Artikeln hereinbricht

  30. #30
    Contao-Fan Avatar von jenda
    Registriert seit
    20.06.2009.
    Ort
    Berlin
    Beiträge
    521

    Standard

    Ich habe die Controllerfunktion umgeschrieben und bekomme trotzdem die gleiche Fehlermeldung für die Zeile mit der SQL-Abfrage zurück, wenn ich die entsprechende URL (ajax/mm-articles?articleId=7) mit einer ID abrufe.

    Hat jemand noch eine Idee, woran das liegen mag?

    HTML-Code:
    Call to a member function get() on null
    PHP-Code:
    $filterRule = new \MetaModels\Filter\Rules\SimpleQuery('SELECT id FROM mm_person_articles WHERE id = ?', [$articleId]); 
    Hier ist die neu Version.

    PHP-Code:
    <?php

    namespace App\Controller;

    use 
    App\Helper\MetaModelsTemplateHelper;
    use 
    MetaModels\Filter\Setting\IFilterSettingFactory;
    use 
    MetaModels\Render\Setting\IRenderSettingFactory;
    use 
    MetaModels\IFactory;
    use 
    MetaModels\IMetaModel;
    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 
    IFactory $factory;
        private 
    IRenderSettingFactory $renderFactory;
        private 
    IFilterSettingFactory $filterFactory;

        public function 
    __construct(IFactory $factoryIFilterSettingFactory $filterFactoryIRenderSettingFactory $renderFactory)
        {
            
    $this->factory $factory;
            
    $this->renderFactory $renderFactory;
            
    $this->filterFactory $filterFactory;
        }

        private function 
    getRelatedArticle(int $articleId): ?array
        {
            
    $modelName 'mm_person_articles';
            
    $renderId 3;
            
    $model $this->factory->getMetaModel($modelName);

            
    // Prüfen, ob das MetaModel existiert
            
    if (!$model) {
                throw new \
    RuntimeException("MetaModel '$modelName' not found.");
            }

            
    $filter $model->getEmptyFilter();

            
    // Prüfen, ob der Filter korrekt initialisiert wurde
            
    if (!$filter) {
                throw new \
    RuntimeException("Filter konnte nicht für das MetaModel '$modelName' erstellt werden.");
            }

            
    $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];  // Gib nur das erste Element zurück
        
    }

        public function 
    __invoke(Request $request): JsonResponse
        
    {
            
    $articleId = (int) $request->query->get('articleId');

            if (!
    $articleId) {
                return new 
    JsonResponse(['error' => 'Ungültige Anfrage'], 400);
            }

            
    $articleItem $this->getRelatedArticle($articleId);

            if (!
    $articleItem) {
                return new 
    JsonResponse(['error' => 'Artikel nicht gefunden'], 404);
            }

            return new 
    JsonResponse([
                
    'id' => $articleItem['id'],
                
    'title' => $articleItem['title'],
            ]);
        }
    }

  31. #31
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    37.137
    Partner-ID
    10107

    Standard

    Du musst immer den Debug-Modus aktivieren und den Stack Trace posten.
    » sponsor me via GitHub or Revolut

  32. #32
    Contao-Fan Avatar von jenda
    Registriert seit
    20.06.2009.
    Ort
    Berlin
    Beiträge
    521

    Standard

    Ich habe die Funktion noch so geschrieben, um den vorherigen Fehler zu vermeiden. Allerdings wird mir jetzt gesagt, dass die Seite nicht existiert, obwohl ich die Route im Controller und in routes.yml wie folgt definiert habe.

    Controller
    PHP-Code:
    <?php

    namespace App\Controller;

    use 
    App\Helper\MetaModelsTemplateHelper;
    use 
    Contao\CoreBundle\Controller\AbstractController;
    use 
    Contao\CoreBundle\Framework\ContaoFramework;
    use 
    Doctrine\DBAL\Connection;
    use 
    MetaModels\Filter\Setting\IFilterSettingFactory;
    use 
    MetaModels\Render\Setting\IRenderSettingFactory;
    use 
    MetaModels\IFactory;
    use 
    MetaModels\IMetaModel;
    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 extends AbstractController
    {
        private 
    IFactory $factory;
        private 
    IRenderSettingFactory $renderFactory;
        private 
    IFilterSettingFactory $filterFactory;
        private 
    Connection $connection;
        private 
    ContaoFramework $framework;

        public function 
    __construct(IFactory $factoryIFilterSettingFactory $filterFactoryIRenderSettingFactory $renderFactoryConnection $connectionContaoFramework $framework)
        {
            
    $this->factory $factory;
            
    $this->renderFactory $renderFactory;
            
    $this->filterFactory $filterFactory;
            
    $this->connection $connection;
            
    $this->framework $framework;
        }

        private function 
    getRelatedArticle(int $articleId): ?array
        {
            
    $this->framework->initialize();

            
    $modelName 'mm_person_articles';
            
    $renderId 3;
            
    $model $this->factory->getMetaModel($modelName);

            
    // Prüfen, ob das MetaModel existiert
            
    if (!$model) {
                throw new \
    RuntimeException("MetaModel '$modelName' not found.");
            }

            
    // Direct database query to get the article ID
            
    $qb $this->connection->createQueryBuilder();
            
    $result $qb
                
    ->select('id')
                ->
    from($modelName)
                ->
    where('id = :articleId')
                ->
    setParameter('articleId'$articleId)
                ->
    executeQuery()
                ->
    fetchAssociative();
            
    dump($result);
            if (!
    $result) {
                return 
    null;
            }

            
    $filter $model->getEmptyFilter();

            
    // Prüfen, ob der Filter korrekt initialisiert wurde
            
    if (!$filter) {
                throw new \
    RuntimeException("Filter konnte nicht für das MetaModel '$modelName' erstellt werden.");
            }

            
    $items $model->findByFilter($filter);

            if (empty(
    $items)) {
                return 
    null;
            }
            
    $relatedArticleItems $items->parseAll('html5'$this->renderFactory->createCollection($model$renderId));

            return 
    $relatedArticleItems[0] ?? null;  // Gib nur das erste Element zurück
        
    }

        
    #[Route('/ajax/mm-articles', name: 'app_metamodels_ajax', methods: ['GET'])]
        
    public function __invoke(Request $request): JsonResponse
        
    {
            
    $this->framework->initialize();

            
    $articleId = (int) $request->query->get('articleId');

            if (!
    $articleId) {
                return new 
    JsonResponse(['error' => 'Ungültige Anfrage'], 400);
            }

            
    $articleItem $this->getRelatedArticle($articleId);

            if (!
    $articleItem) {
                return new 
    JsonResponse(['error' => 'Artikel nicht gefunden'], 404);
            }

            return new 
    JsonResponse([
                
    'id' => $articleItem['id'],
                
    'title' => $articleItem['title'],
            ]);
        }
    }
    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 
    services.yml
    PHP-Code:
    services:
      
    _defaults:
        public: 
    true
        autowire
    true
        autoconfigure
    true

      App
    \Helper\MetaModelsTemplateHelper:

      
    App\Controller\MetaModelsAjaxController:
        
    arguments:
          
    $factory'@metamodels.factory'
          
    $filterFactory'@metamodels.filter_setting_factory'
          
    $renderFactory'@metamodels.render_setting_factory'
          
    $connection'@database_connection' 

  33. #33
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    37.137
    Partner-ID
    10107

    Standard

    Du hast da nun ein Durcheinander - außer es ist Absicht.

    Um welche Route geht es dir nun?
    » sponsor me via GitHub or Revolut

  34. #34
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    3.038

    Standard

    Deine Angaben (Konfigurationen) widersprechen sich

    • PHP Attribute: #[Route('/ajax/mm-articles', name: MetaModelsAjaxController::class)]
    • routes.yml: path: /ajax/get-data


    Außerdem konfigurierst Du type: annotation, verwendest aber Attributes. siehe @spookys Antwort)
    Geändert von fiedsch (17.03.2025 um 15:18 Uhr)
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  35. #35
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    37.137
    Partner-ID
    10107

    Standard

    Zitat Zitat von fiedsch Beitrag anzeigen
    Außerdem konfigurierst Du type: annotation, verwendest aber Attributes.
    Das muss in Symfony 5 (Contao 4.13) so sein.
    » sponsor me via GitHub or Revolut

  36. #36
    Contao-Fan Avatar von jenda
    Registriert seit
    20.06.2009.
    Ort
    Berlin
    Beiträge
    521

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Du hast da nun ein Durcheinander - außer es ist Absicht.

    Um welche Route geht es dir nun?
    Was meinst du genau? :-)

    Die Route ist dort im Controller wie folgt definiert. Muss es anders sein? Oder doch lieber in routes.yml?
    HTML-Code:
    #[Route('/ajax/mm-articles', name: MetaModelsAjaxController::class)]

  37. #37
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    37.137
    Partner-ID
    10107

    Standard

    Zitat Zitat von jenda Beitrag anzeigen
    Was meinst du genau? :-)

    Die Route ist dort im Controller wie folgt definiert. Muss es anders sein? Oder doch lieber in routes.yml?
    HTML-Code:
    #[Route('/ajax/mm-articles', name: MetaModelsAjaxController::class)]
    Aber welche URL willst du nun aufrufen? Denn der Pfad zu deiner Controller lautet nun insgesamt wie folgt:

    /ajax/mm-articles/ajax/mm-articles
    » sponsor me via GitHub or Revolut

  38. #38
    Contao-Fan Avatar von jenda
    Registriert seit
    20.06.2009.
    Ort
    Berlin
    Beiträge
    521

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Aber welche URL willst du nun aufrufen? Denn der Pfad zu deiner Controller lautet nun insgesamt wie folgt:

    /ajax/mm-articles/ajax/mm-articles
    ich will die Domain und /ajax/mm-articles und danach wird dynamisch daran articleId=Nummer angehängt

  39. #39
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    37.137
    Partner-ID
    10107

    Standard

    Zitat Zitat von jenda Beitrag anzeigen
    ich will die Domain und /ajax/mm-articles und danach wird dynamisch daran articleId=Nummer angehängt
    Aktuell hast du deinen Pfad aber auf /ajax/mm-articles/ajax/mm-articles konfguriert. Du hast nämlich einmal [#Route] auf der Klasse selbst - und dann nochmal auf der __invoke Methode.
    » sponsor me via GitHub or Revolut

  40. #40
    Wandelndes Contao-Lexikon Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    10.180
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von jenda Beitrag anzeigen
    Ich habe die Controllerfunktion umgeschrieben und bekomme trotzdem die gleiche Fehlermeldung für die Zeile mit der SQL-Abfrage zurück, wenn ich die entsprechende URL (ajax/mm-articles?articleId=7) mit einer ID abrufe.
    hast Du meine Änderungen auf Deiner Seite überschrieben?!? bei mir gings...

    siehe #19

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •