[gelöst] Wie frage ich einen Catalog Eintrag per ID in einer Erweiterung ab?

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • Cyberlussi
    Contao-Nutzer
    • 20.02.2012
    • 123

    #1

    [gelöst] Wie frage ich einen Catalog Eintrag per ID in einer Erweiterung ab?

    Hi,

    ich habe das Internet schon gut durchforstet, habe aber keine Antwort gefunden ... hoffe, hier kann mir jemand die zündende Idee oder gar Antwort geben. Ich arbeite gerade an einer Erweiterung, die mit einem Formular und Catalog arbeitet. Klappt mitlerweile ganz gut ... mir fehlt aber folgendes:

    Wie frage ich in meiner Erweiterung in einem Hook einen Katalogeintrag ab? Parameter ist die ID des eines Katalogeintrages (die ich per GET erhalte). Ich suche nach einem Aufruf wie "array $entry = Catalog::getCatalogData(katalogid);" oder so ähnlich. Weiß jemand ob und wie das geht?
    Zuletzt geändert von Cyberlussi; 09.04.2012, 22:34.
  • Tim G
    Contao-Urgestein
    • 13.02.2010
    • 2212

    #2
    Mit einem Hook wirst du da nicht weiterkommen.
    Nutze eine normale Datenbank-Abfrage.
    http://www.tim-gatzky.de ˙ auch schon wieder 2 Jahre alt - wie die Zeit vergeht... muss mal umbauen.

    Kommentar

    • Cyberlussi
      Contao-Nutzer
      • 20.02.2012
      • 123

      #3
      nein, nein ... ich bin in einem Hook schon drin (loadFormField) - und will nun darin anhand eines GET Parameters (ID des Katalogeintrages) die Daten aus dem Katalogeintrag lesen (konkrete Kurstitel, Termine, ..), um Felder zu belegen.

      Ich habe gesehen, dass verschiedene Extensions direkt auf die Datenbank zugreifen (wobei ich das ganze Schema beim Catalog noch nicht verstanden habe), aber ich denke, dass eine PHP Methode aus dem Catalog zukunftsicherer wäre. Zudem beziehen sich die Daten, die ich abfragen will auf ein catalogmultitextwizardfield Feld ... was eine "einfache" Datenbankabfrage wieder aufwendiger macht.

      In dem Catalog Leser landet ja ein schönes assoz. Array $this->entries mit all den Daten - genau das will ich auch haben (bzw. der Bereich unter ['data']).

      Codeauszug (Zur Information, noch nicht lauffähig)
      PHP-Code:
          public function myloadFormField(Widget $objWidget, $strForm, $arrFormData)
          {
              // nach Formularalias
              if ($arrFormData['alias'] == 'meinalias')
              {        
                  if ($objWidget->name == 'foobar') // radio-buttons
                  {
                      // Katalog id als GET Parameter
                      $this->Import('Database');
                      $this->Import('Input');
                      $this->Import('Catalog'); // ?
                      if ($this->Input->get("cd-k") && is_numeric($this->Input->get("cd-k")))
                      {
                          $kid = $this->Input->get("cd-k");
                          //                
                          // hier irgendwie aus Catalog mit Hilfe der ID die Feldoptionen auslesen (Feld ist catalogmultitextwizardfield) und in $options ablegen
                          //
                          // setze Optionen im Widget
                          $objWidget->options = $options;
                      }
                  } 
      // usw ... 
      
      Zuletzt geändert von Cyberlussi; 09.04.2012, 00:23. Grund: Codeauszug hinzugefügt

      Kommentar

      • Tim G
        Contao-Urgestein
        • 13.02.2010
        • 2212

        #4
        $objCatalogRow = $this->Database->prepare("SELECT * FROM deineCatalogTabelle WHERE id=?")->limit(1)->execute(DEINE_ID);
        $arrCatalogRow = $objCatalogRow->fetchAssoc();

        Viele Grüße
        http://www.tim-gatzky.de ˙ auch schon wieder 2 Jahre alt - wie die Zeit vergeht... muss mal umbauen.

        Kommentar

        • Tim G
          Contao-Urgestein
          • 13.02.2010
          • 2212

          #5
          Eine Klasse importieren hat nichts mit Hooks zu tun.
          Aus Sicht von OOP ist das Importieren vergleichbar mit der Vererbung/Erweiterung deiner Klasse mit der importierten.
          Man erhält Zutritt zu public deklarierten Variablen/Funktionen der externen Klasse.

          Wenn es ne public Funktion gibt getCatalog oder so, habs nicht vor mir, dann kannst du mit $this->Catalog->getCatalog(); darauf zugreifen. So als Beispiel.
          http://www.tim-gatzky.de ˙ auch schon wieder 2 Jahre alt - wie die Zeit vergeht... muss mal umbauen.

          Kommentar

          • Cyberlussi
            Contao-Nutzer
            • 20.02.2012
            • 123

            #6
            Hi,

            super, denke, habe es hinbekommen. Ich finde zwar immer noch, dass Datenbankabfragen in einer Komponente (wie Catalog) gekapselt werden sollten. Aber so ist es auch einfach.

            Danke!

            Wer es mal braucht - so geht es:
            • k ist GET Parameter und hält eine Catalog-ID
            • Manche Felder sind als CatalogMultiTextWizardField ausgeführt und müssen dekodiert werden (weil XML in Datenbank)



            PHP-Code:
                        $this->Import('Database');
                        $this->Import('Input');
                        $this->Import('CatalogMultiTextWizardField');
            
                        // Katalogdaten aus Datenbank per GET
                        if ($this->Input->get("k") && is_numeric($this->Input->get("k")))
                        {
                            $request_id = $this->Input->get("k");
                            $objCatalogRow = $this->Database->prepare("SELECT * FROM meine_katalog_tabelle WHERE id=?")->limit(1)->execute($request_id);
                            $arrCatalogRow = $objCatalogRow->fetchAssoc();
                            if (count($arrCatalogRow)) 
                            {
                                foreach ($arrCatalogRow as $key=>$value)
                                {
                                    libxml_use_internal_errors(true);
                                    if (simplexml_load_string($value) !== FALSE) 
                                    {
                                        // XML decodieren
                                        $arrCatalogRow[$key] = $this->CatalogMultiTextWizardField->decodeEntries($value);
                                    }
                                }
                            }
                            // print_r($arrCatalogRow);
                        } 
                        else
                        {
                            $arrCatalogRow = array();
                        } 
            
            Das kann man in einen Hook packen wie z.B. loadFormField() und einzelne Widget/Felderwerte/Feldoptionen festlegen.
            Zuletzt geändert von Cyberlussi; 09.04.2012, 22:34.

            Kommentar

            Lädt...