Contao-Camp 2024
Ergebnis 1 bis 8 von 8

Thema: [GELÖST] GET Parameter Ajax Route

  1. #1
    Contao-Fan
    Registriert seit
    09.02.2011.
    Beiträge
    600

    Standard [GELÖST] GET Parameter Ajax Route

    Hi,

    ich möchte per Ajax einzelne Formularfelder (Kein Contao Formular - eigene Erweiterung) aus der Datenbank nachladen.

    Contao 4.9.21

    Es funktioniert eigentlich schon fast alles, nur wie bekomme ich den Get Parameter in den Controller ?

    Soweit bin ich jetzt:

    /src/Controller/ExampleController.php
    PHP-Code:
    <?php 
    namespace App\Controller;
    use 
    Symfony\Component\HttpFoundation\Request;
    use 
    Symfony\Component\HttpFoundation\Response;
    use 
    Symfony\Component\Routing\Annotation\Route;
    use 
    Doctrine\DBAL\Connection

    /**
     * @Route("/produkt", name=ExampleController::class)
     */
     
    class ExampleController
    {    
        private 
    $db;
        public function 
    __construct(Connection $db)
        {
           
    $this->db $db;
        }

        public function 
    __invoke(Request $request): Response
       
    {    
            
    $input 16155;

            
    $resultSet $this->db->executeQuery("        
            SELECT * FROM tl_modelle 
            WHERE id = ?"
    ,array($input));        
            
    $data $resultSet->fetchAssociative();
            
    $arr implode(" "$data);    
                    return new 
    Response($arr);        
        }    
    }
    AjaxTeil im Template:
    PHP-Code:
          $.ajax({
                   
    type"GET",
               
    url"/produkt/",
                   
    data'model_id='+$("#modell_id").val(),
                    
    success: function (resultat) {
                    
    alert(resultat);
                    }
                }); 
    Um die "model_id" gehts vor allem, wie bekomm ich die als $input Variable in den Controller ?

    Die Datenbankabfrage mit fixem Wert funktioniert. Bei Klick auf zuständigen Button im Template wird alles korrekt im Alert ausgegeben.

    Vermutlich steckt hier die Lösung, oder bei den Parametern, aber ich checks wohl nicht...
    PHP-Code:
    $request->query->get('model_id');
    $request->request->get('model_id'); 
    Bitte in die richtige Richtung schubsen, oder ein konkretes Beispiel. Bin mit Symfonie und Routes absolut am Beginn...

    Vielen Dank

    LG Tintifax
    Geändert von tintifax (26.10.2021 um 13:09 Uhr)

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

    Standard

    PHP-Code:
    $request->query->get('model_id'); 
    wäre schon richtig
    » sponsor me via GitHub or PayPal or Revolut

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

    Standard

    PHP-Code:
    data'model_id='+$("#modell_id").val(), 
    Einmal model und einmal modell (mit zwei l). Absicht, oder ein Bug, der erklärt, warum du die Daten nicht "findest"?
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  4. #4
    Contao-Fan
    Registriert seit
    09.02.2011.
    Beiträge
    600

    Standard

    Zitat Zitat von fiedsch Beitrag anzeigen
    PHP-Code:
    data'model_id='+$("#modell_id").val(), 
    Einmal model und einmal modell (mit zwei l). Absicht, oder ein Bug, der erklärt, warum du die Daten nicht "findest"?
    Das ist Absicht bzw irgendwann mal so passiert, sicherlich nicht optimal

    #modell_id ist die ID, model_id = name vom Formularfeld

  5. #5
    Contao-Fan
    Registriert seit
    09.02.2011.
    Beiträge
    600

    Standard

    services.yaml und routes.yaml stimmen eh, oder ?

    PHP-Code:
    # config/services.yaml
    services:
        
    _defaults:
            
    autowiretrue
            autoconfigure
    true
            
    public: false

        App
    \:
            
    resource: ../src
            exclude
    : ../src/{Entity,Migrations,Model,Resources,Tests,Widget}
        
        
    App\Controller\:
            
    resource: ../src/Controller
            tags
    : ['controller.service_arguments']
            public: 
    true 
    PHP-Code:
    # config/routes.yaml
    app.controller:
        
    resource: ../src/Controller
        type
    annotation 

  6. #6
    Contao-Fan Avatar von markocupic
    Registriert seit
    06.12.2010.
    Ort
    Oberkirch (Schweiz)
    Beiträge
    660

    Standard

    Hallo tintifax

    Hier ein Beispiel eines Controllers, den du mit https://foo.ch/member/#member-id# aufrufen kannst. Beispielsweise https://foo.ch/member/123.
    Der Controller gibt die ID, den Vornamen und den Nachnamen des Datensatzes im JSON Format zurück.

    Beispielsweise:
    Code:
    {"data":{"id":"123","firstname":"Hans","lastname":"Test"}}
    oder
    Code:
    {"data":null}
    wenn kein Datensatz zur ID gefunden wurde.

    Die ID ist Bestandteil der url und muss eine Zahl sein, sonst verursacht der Aufruf eine Exception.

    PHP-Code:
    <?php

    // src/Controller/MemberController.php

    namespace App\Controller;

    use 
    Doctrine\DBAL\Connection;
    use 
    Symfony\Component\HttpFoundation\JsonResponse;
    use 
    Symfony\Component\Routing\Annotation\Route;

    /**
     * @Route("/member/{id}", name=MemberController::class)
     */
    class MemberController
    {

        
    /**
         * @var Connection
         */
        
    private $connection;

        public function 
    __construct(Connection $connection)
        {
            
    $this->connection $connection;
        }

        
    /**
         * @throws \Doctrine\DBAL\Driver\Exception
         * @throws \Doctrine\DBAL\Exception
         */
        
    public function __invoke(int $id): JsonResponse
        
    {

            
    $resResult $this->connection->executeQuery(
                
    "SELECT id,firstname,lastname FROM tl_member WHERE id=?",
                [
    $id]
            );

            
    $row $resResult->fetchAssociative();

            
    $arrJson = [
                
    'data' => !$row null $row,
            ];

            return new 
    JsonResponse($arrJson);
        }

    }
    Javascript-Teil:
    Code:
    <script>
      $.getJSON("member/123", json => {
        if (json && json.data !== null) {
          console.log('ID: ' + json.data['id']);
          console.log('Firstname: ' + json.data['firstname']);
          console.log('Lastname: ' + json.data['lastname']);
        }
      });
    </script>

    services.yaml und routes.yaml stimmen eh, oder ?
    Ja, das stimmt.

    Liebe Grüsse

    Marko
    Geändert von markocupic (25.10.2021 um 21:18 Uhr)
    Anfragen für bezahlten Support oder Extension-Programmierung via PN.

  7. #7
    Contao-Fan
    Registriert seit
    09.02.2011.
    Beiträge
    600

    Standard

    Vielen Dank für die Hilfe, habs aber nun so gelöst, weil nix anderes funktioniert hat.

    Lösung meines Problems in Rosa: $input = \Contao\Input::get('model_id');

    Hier nochmal die funktionierende ExampleController.php

    PHP-Code:
    <?php 
    namespace App\Controller;
    use 
    Symfony\Component\HttpFoundation\Request;
    use 
    Symfony\Component\HttpFoundation\Response;
    use 
    Symfony\Component\Routing\Annotation\Route;
    use 
    Doctrine\DBAL\Connection

    /**
     * @Route("/produkt", name=ExampleController::class)
     */
     
    class ExampleController
    {    
        private 
    $db;
        public function 
    __construct(Connection $db)
        {
           
    $this->db $db;
        }

        public function 
    __invoke(Request $request): Response
       
    {    
            
          
    $input = \Contao\Input::get('model_id');

            
    $resultSet $this->db->executeQuery("        
            SELECT * FROM tl_modelle 
            WHERE id = ?"
    ,array($input));        
            
    $data $resultSet->fetchAssociative();
            
    $arr implode(" "$data);    
            return new 
    Response($arr);        
        }    
    }

  8. #8
    Contao-Fan Avatar von markocupic
    Registriert seit
    06.12.2010.
    Ort
    Oberkirch (Schweiz)
    Beiträge
    660

    Standard

    Ja, klar. Natürlich führen viele Wege nach Rom.
    Symfony bietet von Haus aus schon sehr viel power, welche ich gerne auch nutze.
    Lg Marko
    Anfragen für bezahlten Support oder Extension-Programmierung via PN.

Aktive Benutzer

Aktive Benutzer

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

Lesezeichen

Lesezeichen

Berechtigungen

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