Ergebnis 1 bis 13 von 13

Thema: Zugriff auf pid in dca

  1. #1
    Contao-Nutzer
    Registriert seit
    19.06.2009.
    Beiträge
    93

    Standard Zugriff auf pid in dca

    Ich bin schon ein gutes Stück weiter gekommen, aber jetzt hackt es an einer anderen Stelle:

    Ich rufe die Funktion über load_callback auf (soweit kein Problem):
    PHP-Code:
    $GLOBALS['TL_DCA']['tl_newsletter']['fields']['sender']['load_callback'][] = array('xNewsletterSender''senderAdress'); 
    Folgende Funktion wird aufgerufen (funktioniert ebenfalls):
    PHP-Code:
    class xNewsletterSender extends Newsletter {
        public function 
    senderAdress($row$label) {
            
    $obj $this->Database->prepare("SELECT * FROM tl_newsletter_channel WHERE id=?")->limit(1)->execute(???);
        }

    Zum Problem: Wie kann ich in dieser Funktion auf die pid (oder id) zugreifen, sodass ich sie in execute() eintragen kann?

    Vielen Dank,
    Tom

    Falls sich jemand fragt, was das werden soll: Eine Erweiterung, die es ermöglicht jedem Newsletterarchiv einen Absender zuzuweisen.

  2. #2
    Contao-Nutzer
    Registriert seit
    19.06.2009.
    Beiträge
    93

    Standard

    Habe einen Weg gefunden auf die id zu zugreifen:
    PHP-Code:
    $this->Input->get('id'); 
    Vielleicht könnte mal jemand über meinen SQL-Code schauen, um an die pid zu kommen, weil mit dem stimmt auch etwas noch nicht:
    PHP-Code:
    $obj $this->Database->prepare("SELECT *, (SELECT * FROM tl_newsletter_channel WHERE tl_newsletter_channel.id=tl_newsletter.pid) AS archive FROM tl_newsletter WHERE id=?")
    ->
    limit(1)
    ->
    execute($this->Input->get('id')); 
    Fehlermeldung:
    Code:
    Fatal error: Uncaught exception Exception with message Query error: Operand should contain 1 column(s) (SELECT *, (SELECT * FROM tl_newsletter_channel WHERE tl_newsletter_channel.id=tl_newsletter.pid) AS archive FROM tl_newsletter WHERE id='5' LIMIT 0,1) thrown in /system/libraries/Database.php on line 519

  3. #3
    Gesperrt
    Registriert seit
    20.06.2009.
    Ort
    Potsdam/Berlin
    Beiträge
    6

    Standard

    ich verstehe gerade den Zweck deines SQL-Statements noch nicht ganz. Aber ich glaube mit einem Join kommst du da weiter, denn du willst ja die Daten von zwei Tabellen in einer Abfrage haben. Oder?

    Code:
    SELECT *
    FROM tl_newsletter_channel AS channel
    INNER JOIN tl_newsletter AS archive
      ON channel.id = archive.pid
    WHERE id=?

  4. #4
    Contao-Nutzer
    Registriert seit
    19.06.2009.
    Beiträge
    93

    Standard

    Der Sinn ist ganz simpel:
    • Ich lese per Input->get die id des Newsletters aus
    • Mit dieser id lese ich per Db-Abfrage die pid (id des Newsletterarchives) aus
    • Über die pid bekomme ich die gespeicherten Daten aus tl_newsletter_channel


    Nachtrag: Als Vorlage diente mir folgender Code:
    Code:
    $objArticlesStmt = $this->Database->prepare("SELECT *, (SELECT title FROM 
    tl_news_archive WHERE tl_news_archive.id=tl_news.pid) AS archive, (SELECT 
    displayed_name FROM tl_news_archive WHERE tl_news_archive.id=tl_news.pid) 
    AS displayed_name, (SELECT jumpTo FROM tl_news_archive WHERE 
    tl_news_archive.id=tl_news.pid) AS parentJumpTo, (SELECT name FROM tl_user 
    WHERE id=author) AS author FROM tl_news WHERE pid IN(" . implode(',', $this->news_archives)
     . ")" . ($this->news_featured ? " AND featured=1" : "") . (!BE_USER_LOGGED_IN 
    ? " AND (start='' OR start<?) AND (stop='' 
    OR stop>?) 
    AND published=1" : "") . " ORDER BY date DESC");
    Geändert von TomH (29.06.2009 um 15:53 Uhr)

  5. #5
    Gesperrt
    Registriert seit
    20.06.2009.
    Ort
    Potsdam/Berlin
    Beiträge
    6

    Standard

    Oje, SQL-Code in einer Zeile ist sehr schwer zu lesen und nachzuvollziehen.

    Der INNER JOIN sollte genau das machen was du bezweckst. Hast du das mal probiert? Der Asterix (*) wird da aber wohl nicht funktionieren. Ich finde es aber sowieso besser, wenn im SELECT nur die Datenfelder aus der DB geholt werden, die wirklich gebraucht werden.

    Beispiel:
    Code:
    SELECT channel.name, channel.email, archive.date ...

  6. #6
    Contao-Nutzer
    Registriert seit
    19.06.2009.
    Beiträge
    93

    Standard

    Du hattest bei WHERE id=? das archive.id vergessen - ansonsten funktioniert es wunderbar! Vielen Dank.

    Hier der endgültige Code für alle, die so etwas in die Richtung auch mal gebrauchen:
    Code:
    $obj = $this->Database->prepare("
    SELECT tl_newsletter_channel.sender, tl_newsletter_channel.senderName, tl_newsletter_channel.visibility, tl_newsletter_channel.overwrite 
    FROM tl_newsletter_channel 
    INNER JOIN tl_newsletter 
    ON tl_newsletter_channel.id = tl_newsletter.pid 
    WHERE tl_newsletter.id=?")
    ->limit(1)
    ->execute($this->Input->get('id'));
    Geändert von TomH (29.06.2009 um 15:53 Uhr)

  7. #7
    Gesperrt
    Registriert seit
    20.06.2009.
    Ort
    Potsdam/Berlin
    Beiträge
    6

    Standard

    Zitat Zitat von TomH Beitrag anzeigen
    Du hattest bei WHERE id=? das archive.id vergessen - ansonsten funktioniert es wunderbar! Vielen Dank.
    Ja, das passiert schon mal am späten Abend.

  8. #8
    Contao-Urgestein Avatar von FloB
    Registriert seit
    19.06.2009.
    Ort
    Sonnensystem
    Beiträge
    1.618

    Standard

    TomH, nutze bitte überall die Code-Tags (auch bei SQL – einfach [ CODE ]) – macht das ganze übersichtlicher .
    So long,
    FloB since Nov. 2007 +706P +115P and counting

  9. #9
    Contao Core-Team
    Association Vorstand
    Avatar von andreas.schempp
    Registriert seit
    15.06.2009.
    Ort
    Lyss
    Beiträge
    5.613
    Partner-ID
    8667
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Deine Funktion ist etwas verwirrend zu lesen, denn es müsste nicht
    PHP-Code:
    public function senderAdress($row$label
    sondern besser
    PHP-Code:
    public function senderAdress($value$dc
    heissen.

    $dc ist nämlich der Datacontainer, und darin kannst du mit $dc->id auf die ID zugreifen. Verwende immer besser den $dc als Input->get() (habe ich früher auch gemacht). Aber beim mehrfachen bearbeiten bleibt die GET-ID immer stehen und die $dc->id sollte dann stimmen.
    terminal42 gmbh
    Wir sind Contao Premium-Partner! Für Modulwünsche oder Programmierungen kannst du uns gerne kontaktieren.
    Hilfe für Isotope eCommerce kann man auch kaufen: Isotope Circle

  10. #10
    Contao-Nutzer
    Registriert seit
    19.06.2009.
    Beiträge
    93

    Standard

    Vielen Dank für den Tipp! Habe ich angepasst. Ich war von der get-Variante auch nicht wirklich begeistert, aber hatte übersehen, dass die id auch im dc gespeichert ist.

    @FloB: Antwort per PN, damit wir hier beim Thema bleiben.

  11. #11
    Contao-Nutzer
    Registriert seit
    19.06.2009.
    Beiträge
    93

    Standard

    Eine (hoffentlich vorerst letzte) Frage habe ich noch:

    Meine Klasse ist folgendermaßen definiert:
    PHP-Code:
    class xNewsletterSender extends Newsletter 
    Wenn ich nun in einer Funktion, in der $dc verfügbar ist, in der Klasse, folgenden Befehl aufrufe:
    PHP-Code:
    parent::send($dc); 
    sind in der Funktion send im DataContainer keine Werte mehr gespeichert.

    Woran liegt das und wie lässt es sich beheben?

  12. #12
    Contao Core-Team
    Association Vorstand
    Avatar von andreas.schempp
    Registriert seit
    15.06.2009.
    Ort
    Lyss
    Beiträge
    5.613
    Partner-ID
    8667
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Hallo Tom,

    Eigentlich kann das nicht sein.

    Hast du die Namen des Parameters auch $dc benannt?

    Beachte dass $dc meist nur die ID enthält, und keine anderen Werte (wie table oder pid).
    terminal42 gmbh
    Wir sind Contao Premium-Partner! Für Modulwünsche oder Programmierungen kannst du uns gerne kontaktieren.
    Hilfe für Isotope eCommerce kann man auch kaufen: Isotope Circle

  13. #13
    Contao-Nutzer
    Registriert seit
    19.06.2009.
    Beiträge
    93

    Standard

    Zitat Zitat von andreas.schempp Beitrag anzeigen
    Eigentlich kann das nicht sein.
    Ist auch nicht so war wohl gestern Abend etwas spät.

    Ja, dc für DataContainer finde ich gut.

Aktive Benutzer

Aktive Benutzer

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

Ähnliche Themen

  1. Antworten: 3
    Letzter Beitrag: 20.04.2010, 13:13
  2. Zugriff auf die FE Benutzer ID
    Von BruderFlexo im Forum Entwickler-Fragen
    Antworten: 1
    Letzter Beitrag: 10.03.2010, 15:21
  3. zuhäufiger SQL Zugriff
    Von Whitedragon im Forum Installation / Update
    Antworten: 1
    Letzter Beitrag: 17.02.2010, 19:00
  4. Zugriff auf Werte im DCA
    Von asteireif im Forum Entwickler-Fragen
    Antworten: 2
    Letzter Beitrag: 13.11.2009, 08:45

Lesezeichen

Lesezeichen

Berechtigungen

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