Ergebnis 1 bis 7 von 7

Thema: tl_page um dca erweitern

  1. #1
    Contao-Nutzer Avatar von ttcdummy
    Registriert seit
    02.03.2014.
    Beiträge
    213
    User beschenken
    Wunschliste

    Standard tl_page um dca erweitern

    Hallo zusammen,

    ich habe jetzt schon verschiedene Bundles durchforstet aber kein passendes gefunden und irgendwie bin ich auch nicht ganz sicher wonach ich da eigentlich ausschau halten muss.

    Ich würde gerne in einem eigenen Bundle die Tabelle tl_page um einen weiteren Edit-Button ergänzen, welcher dann andere Inhalte pflegt als der bereits existierende Edit-Button. Sozusagen "zusätzliche weitere Informationen zur Seite". Den Button anlegen ist nicht weiter schwer, habe ich hin bekommen. Doch jetzt stellen sich einige fragen:

    Ich habe den Jump-To-Article-Button kopiert und ans operation-Array angehangen:

    PHP-Code:
    array_insert($GLOBALS['TL_DCA']['tl_page']['list']['operations'],9,array (
       
    'my_new_table' => array
       (
          
    'label'               => &$GLOBALS['TL_LANG']['tl_page']['mynewtable'],
          
    'href'                => 'do=my_new_table&act=edit',
          
    'icon'                => 'article.svg',
          
    'button_callback'     => array('tl_page_extended''editMyNewTable')
       )
    ));

    class 
    tl_page_extended extends Backend
    {
       public function 
    editMyNewTable($row$href$label$title$icon)
       {
          return (
    $row['type'] == 'regular' || $row['type'] == 'error_403' || $row['type'] == 'error_404') ? '<a href="' $this->addToUrl($href.'&amp;id='.$row['id']) . '" title="'.StringUtil::specialchars($title).'">'.Image::getHtml($icon$label).'</a> ' Image::getHtml(preg_replace('/\.svg$/i''_.svg'$icon)).' ';
       }

    Damit wird dann ein Backend-Modul benötigt, welches "my_new_table" heißt.
    Aufgerufen wird es über den zusammen gesetzten Link z. B.:
    Code:
    /contao?do=my_new_table&act=edit&id=8&rt=XXXXX&ref=XXXXX
    Dieses bestücke ich dann mit meinen gewünschten DCA-Feldern usw. ...

    Jetzt das Problem:
    Für die entsprechenden Seiten (IDs) existieren die Datenbankeinträge in "my_new_table" ja nicht, sodass die vermeintlich noch leeren Felder nicht angezeigt werden können.
    Irgendwie müsste das System hingehen und schauen, welche Seiten bereits existieren und dafür initial in der "my_new_table" einen leeren Eintrag anlegen, sodass ich diesen dann editieren kann bei Aufruf.

    Ich wäre sehr dankbar für ein Beispiel (evtl. sogar ein bereits existierendes Bundle) welches sich auch auf die Seiten IDs bezieht, oder einfach nur ein paar Stichworte mit denen ich weiter forschen kann.

    Vielleicht gehe ich das alles aber auch ganz falsch an. Ich lasse mich da gerne belehren!

    Viele Grüße

  2. #2
    Contao-Fan Avatar von eS_IT
    Registriert seit
    21.07.2010.
    Ort
    Werne a. d. Lippe
    Beiträge
    585
    Partner-ID
    6161
    User beschenken
    Wunschliste

    Standard

    Hallo ttcdummy,

    Contao legt automatisch einen leeren Datensatz an. Vermutlich musst Du Deine Tabelle als Kindtabelle im DCA von `tl_page` registrieren (ctable) und in der Konfiguration Deiner Tabelle die Elterntabelle (ptable) mit `tl_page` angeben.

    Viele Grüße,
    eS_IT
    Viele Grüße,
    eS_IT
    --
    e@sy Solutions IT - Ihr Partner für professionelle Softwareentwicklung
    Website - Contao Codebook - Partnerprofil - GitHub

  3. #3
    Contao-Nutzer Avatar von ttcdummy
    Registriert seit
    02.03.2014.
    Beiträge
    213
    User beschenken
    Wunschliste

    Standard

    Danke für die Antwort.
    Generell wird dann aber nur die Tabelle my_new_table leer angelegt ohne die Einträge welche ich gerne direkt den Seiten zuordnen würde. Ich will eigentlich keine weitere Tabelle/Liste hinter der Schaltfläche sondern einen direkten Eintrag (klar muss der in einer Tabelle my_new_table liegen). Aber diese Auflistung wird quasi nie angezeigt.

    Da diese Einträge nicht existieren, aber die Seiten dazu würde ich diese gerne automatisch beim Seitenanlegen generieren und dann direkt aufrufen. Der Eintrag ist dann genau einer Seite zugeordnet.

    Und für bereits bestehende Seiten würde ich die ebenfalls gerne automatisch erstellen lassen. Und löschen soll sich das ja auch wenn man die Seite löscht ;-)
    Geändert von ttcdummy (02.02.2018 um 16:00 Uhr)

  4. #4
    Contao-Fan Avatar von eS_IT
    Registriert seit
    21.07.2010.
    Ort
    Werne a. d. Lippe
    Beiträge
    585
    Partner-ID
    6161
    User beschenken
    Wunschliste

    Standard

    Okay, verstehe. Du könntest die Daten beim Laden der Bearbeitungsseite per `onload_callback` in die Datenbank einfügen. Weitere Infos zu Callbacks findest Du auch in meinem Blog.

    Viele Grüße,
    eS_IT
    Viele Grüße,
    eS_IT
    --
    e@sy Solutions IT - Ihr Partner für professionelle Softwareentwicklung
    Website - Contao Codebook - Partnerprofil - GitHub

  5. #5
    Contao-Nutzer Avatar von ttcdummy
    Registriert seit
    02.03.2014.
    Beiträge
    213
    User beschenken
    Wunschliste

    Standard

    Hallo,

    danke das hat weiter geholfen mit dem onload_callback.
    Die Funktion generateArticle (https://github.com/contao/core-bundl...page.php#L1133) funktioniert ja ganz ähnlich.

    Gibt es evtl. auch eine Möglichkeit diese Einträge nicht zur Laufzeit mit onload_callback, sondern initial bei der Installation des Bundels z. B. einmal zu erzeugen?

    Grüße

  6. #6
    Contao-Nutzer Avatar von ttcdummy
    Registriert seit
    02.03.2014.
    Beiträge
    213
    User beschenken
    Wunschliste

    Standard

    Hallo nochmal,

    mir ist nicht ganz klar, wie ich den Zusammenhang herstelle zwischen Seiten-ID und meinem Tabelleneintrag.
    Den Tabelleneintrag rufe ich auf per
    Code:
    "do=page&table=tl_new_table&id=1&act=edit"
    In der Tabelle tl_new_table habe ich im config-Teil der Einfachheit halber eine Statische ID versucht automatisch zu erstellen per onload_callback:
    PHP-Code:
    $GLOBALS['TL_DCA']['tl_new_table'] = array
    (
        
    // Config
        
    'config' => array
        (
            
    'dataContainer'               => 'Table',
            
    'enableVersioning'            => true,
            
    'ptable'                      => 'tl_page',
            
    'onload_callback'             => array('tl_new_table''generateItem'),

    ... 
    PHP-Code:
    ...
        
    // Fields
        
    'fields' => array
        (
            
    'id' => array
            (
                
    'sql'                     => "int(10) unsigned NOT NULL auto_increment"
            
    ),
    ... 
    PHP-Code:
    ...
    class 
    tl_new_table extends Backend
    {
        public function 
    generateItem(DataContainer $dc)
        {

            
    // Create item
            
    $arrSet['id'] = 1;
            
    $this->Database->prepare("INSERT INTO tl_new_table %s")->set($arrSet)->execute();
        }

    }; 
    Leider wird hier kein Eintrag angelegt.

    Die Fehlermeldung beim Linkaufruf:
    Code:
    Cannot load record "tl_new_table.id=1".
    Zu guter Letzt ist das ja eher eine statische Herangehensweise (da id=1 versucht wird anzulegen).

    Die ID im Link
    Code:
    "do=page&table=tl_new_table&id=1&act=edit"
    generiert sich aus der ID der Seite.

    Wie bekomme ich das nur verknüpft?

    Grüße
    Geändert von ttcdummy (06.02.2018 um 12:41 Uhr)

  7. #7
    Contao-Fan Avatar von eS_IT
    Registriert seit
    21.07.2010.
    Ort
    Werne a. d. Lippe
    Beiträge
    585
    Partner-ID
    6161
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von ttcdummy Beitrag anzeigen
    Gibt es evtl. auch eine Möglichkeit diese Einträge nicht zur Laufzeit mit onload_callback, sondern initial bei der Installation des Bundels z. B. einmal zu erzeugen?
    Hallo ttcdummy,

    das würde Dir ja nicht viel nutzen, da ja auch später noch Seiten angelegt werden können, also nach der Installation Deines Bundles und für diese müssen ja vermutlich auch Daten angelegt werden.

    Ich denke, Du gehst hier grundsätzlich den falschen Weg. Ich würde wie gesagt `tl_page` als Elterntabelle und `tl_new_table` als Kindtabelle eintragen. Dann erstellst Du in der Übersicht statt eines normalen Links (der Dich zur Übersicht der Kindtabelle führt) einen Bearbeitenlink (der Dich direkt zur Bearbeiten-Maske führt).

    Normaler Link Artikel => Liste der Inhaltselemente:
    example.org/contao?do=article&table=tl_content&id=2&rt=xxx

    Link zum Bearbeiten eines Inhaltselement:
    example.org/contao?do=article&table=tl_content&id=14&act=edit& rt=xxx&ref=xxx

    Du musst nur herausfinden, welcher Eintrag in Deiner Tabelle zu welcher Seite gehört und die entsprechende Id in den Link einfügen. Dies kannst Du aber relativ einfach mit einem `button_callback` erledigen. Wichtig ist hier, dass die Id aus Deiner Tabelle und nicht die Id der Seite in den Link eingefügt wird.

    Bei diesem Vorgehen musst Du Dich nicht um das Vergeben der `pid` oder das Anlegen von Daten kümmern.

    Viele Grüße,
    eS_IT
    Viele Grüße,
    eS_IT
    --
    e@sy Solutions IT - Ihr Partner für professionelle Softwareentwicklung
    Website - Contao Codebook - Partnerprofil - GitHub

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
  •