Ergebnis 1 bis 8 von 8

Thema: DCA: 2 Tabellen, zweite Tabelle mit Baumstruktur

  1. #1
    Contao-Nutzer
    Registriert seit
    08.12.2011.
    Beiträge
    27

    Standard DCA: 2 Tabellen, zweite Tabelle mit Baumstruktur

    Hallo,

    ich benötige eine zweistufige Bearbeitung im Backend, die erste Stufe als Liste, die zweite als Baum. Konkret sehen die Daten ungefähr so aus:

    Buch: Titel, Autor, Sprache
    Kapitel: Titel, Text, übergeordnetes Kapitel

    Im Backend soll es eine Liste der Bücher geben, wo man die Buchdaten bearbeiten kann und zu einer Baumstruktur der Kapitel kommt. In dieser Baumstruktur kann man pro Buch die Kapitel anlegen, sortieren und bearbeiten.

    Folgende Tabellen habe ich dazu angelegt:

    tl_book: id, tstamp, titel, author, language
    tl_book_chapter: id, pid, tstamp, titel, text

    Ich habe eine List View für die Bücher und eine Tree View für Kapitel. Mein Problem ist nun, das damit die pid von tl_book_chapter doppelt belegt ist, einmal um das Buch zum Kapitel referenzieren und einmal um das übergeordnete Kapitel zu referenzieren. Die beiden Referenzierungen habe ich in der Konfiguration des DCA mittels ptable und ctable gemacht. Da die beiden aber fix auf den Spalte id und pid arbeiten habe ich das Problem der Doppelbedeutung.

    Ein möglicher Ausweg wäre es, in der Kapiteltabelle einen Foreign Key book_id einzuführen. Aber wie bringe ich das dem DCA bei?

    Eine andere Lösung wäre es Buch und Kapitel in einer Tabelle zusammenzufassen:

    tl_book: id, pid, tstamp, titel, author, language, text

    Aber wie konfiguriere ich hier im DCA zwei verschiedene Views für ein und die selbe Tabelle. Im DCA kann es wohl nur Konfiguration pro Tabelle geben, wenn ich die Variable anschaue: $GLOBALS['TL_DCA']['tl_book'] = ...

    Bei meinen bisherigen Problemchen habe ich im Code anderer Erweiterungen oder im Contao Core schnell eine Lösung gefunden, aber mein jetziges Problem scheint es noch nicht zu geben. Kann mir jemand einen Rat geben.

  2. #2
    Contao-Urgestein Avatar von Samson1964
    Registriert seit
    05.11.2012.
    Ort
    Berlin
    Beiträge
    2.794

    Frage

    Und hast Du eine Lösung gefunden? Ich suche gerade sowas Ähnliches. Zwei Tabellen, ptable und ctable. Die ctable möchte ich jetzt zusätzlich als normale Tabelle ansprechen um auf ALLE Datensätze zugreifen zu können. In der Variante ctable stehen mir ja nie alle Datensätze zur Verfügung.
    Viele Grüße
    Frank

    Seit Mai 2013 Fan von Contao
    Webmaster vom Deutschen Schachbund und Berliner Schachverband
    Mein Blog: Schachbulle
    Meine Erweiterungen bei GitHub
    Meine Videos auf YouTube: Playlist zur Contao-Programmierung/Einrichtung

  3. #3
    Contao-Nutzer
    Registriert seit
    08.12.2011.
    Beiträge
    27

    Standard

    Meine Lösung findest Du hier https://github.com/falkoschumann/contao-books.

    Die zweite Tabelle mit der Baumstruktur kann eine ctable haben, bei mir tl_content. Sie darf aber kein ptable haben, sonst funktioniert die Baumstruktur nicht. Den Link von der ersten Tabelle zur zweiten mit der Baumstruktur habe ich per Hand zusammengestellt, anstelle vom DCA generieren zu lassen.

    Der Aufbau ist nun tl_book -> tl_chapter -> tl_content. Wobei tl_book eine List View ist, tl_chapter eine Tree View und tl_content eine Parent View.

    Den Code findest Du bei GitHub, die Erweiterung ist auch im Extension Repository zu finden: https://contao.org/de/erweiterungsliste/view/books.html

    Probier die Erweiterung aus und schau, ob es das ist was Du suchst. Wenn Du fragen zum Quelltext hast, keine Hemmungen, frag einfach

  4. #4
    Contao-Urgestein Avatar von Samson1964
    Registriert seit
    05.11.2012.
    Ort
    Berlin
    Beiträge
    2.794

    Standard

    Ich habe jetzt nochmal Dein Eingangsposting genauer gelesen und mußte feststellen, daß es wohl doch weiter entfernt ist als ich dachte. Interessant ist die Trennung von tl_book und tl_chapter allemal. Nur kann ich root auf meine ctable nicht anwenden. Das funktioniert im mode 4 nicht. Wenn es ginge, könnte ich wahrscheinlich wunderbar zwei Ansichten meiner ctable machen - einmal ohne Beziehung zu ptable.id und einmal mit.

    Wobei: Wenn ich ptable und ctable weglasse, müßte ich doch theoretisch trotzdem eine Beziehung bei Bedarf zueinander herstellen können...

    Auf jeden Fall eine interessante Erweiterung hast Du da. Ich überlege ob ich die für die Vereinsbibliothek benutze.
    Viele Grüße
    Frank

    Seit Mai 2013 Fan von Contao
    Webmaster vom Deutschen Schachbund und Berliner Schachverband
    Mein Blog: Schachbulle
    Meine Erweiterungen bei GitHub
    Meine Videos auf YouTube: Playlist zur Contao-Programmierung/Einrichtung

  5. #5
    Contao-Urgestein Avatar von Samson1964
    Registriert seit
    05.11.2012.
    Ort
    Berlin
    Beiträge
    2.794

    Standard

    Ich werde Deine Erweiterung für die Vereinsbibliothek nehmen. Beim Import in tl_book muß wohl auch die Dummy-Einträge in tl_chapter anlegen...
    Viele Grüße
    Frank

    Seit Mai 2013 Fan von Contao
    Webmaster vom Deutschen Schachbund und Berliner Schachverband
    Mein Blog: Schachbulle
    Meine Erweiterungen bei GitHub
    Meine Videos auf YouTube: Playlist zur Contao-Programmierung/Einrichtung

  6. #6
    Contao-Nutzer
    Registriert seit
    08.12.2011.
    Beiträge
    27

    Standard

    Das Root-Chapter ist mehr als ein Dummy. Dort kannst Du Inhaltselemente ablegen, die auf der Titelseite mit dem Inhaltsverzeichnis angezeigt werden. Und ja es wird gebraucht.

    Klingt als ob du die Tabellen per Hand und nicht per Backend befüllst. Ich habe für die Books-Erweiterung schon an ein Import/Export-Mechanismus gedacht. Mir ist aber noch nichts passendes eingefallen. Importierst Du irgend eine externe Datei(en). Wenn ja welches Format?

  7. #7
    Contao-Urgestein Avatar von Samson1964
    Registriert seit
    05.11.2012.
    Ort
    Berlin
    Beiträge
    2.794

    Standard

    Ich habe jetzt books ein wenig erweitert in meiner dcaconfig:
    PHP-Code:
    /**
     * Books Extension for Contao / Anpassung DSB-Bibliothek
     *
     */

    // Ändern der Feld-Konfiguration
    $GLOBALS['TL_DCA']['tl_book']['palettes']['default'] = str_replace
    (
        
    ',language',
        
    ',language,owner,subject_field,number,position,remarks;{image_legend:hide},image',
        
    $GLOBALS['TL_DCA']['tl_book']['palettes']['default']
    );

    // Hinzufügen der Feld-Konfiguration
    $GLOBALS['TL_DCA']['tl_book']['fields']['owner'] = array
    (
        
    'label'         => &$GLOBALS['TL_LANG']['tl_book']['owner'],
        
    'exclude'       => true,
        
    'filter'        => true,
        
    'inputType'     => 'text',
        
    'eval'          => array
        (
            
    'mandatory'    => false,
            
    'maxlength' => 255
            
    'tl_class'     => 'w50'
        
    ),
        
    'sql'           => "varchar(255) NOT NULL default ''"
    );

    $GLOBALS['TL_DCA']['tl_book']['fields']['subject_field'] = array
    (
        
    'label'         => &$GLOBALS['TL_LANG']['tl_book']['subject_field'],
        
    'exclude'       => true,
        
    'filter'        => true,
        
    'inputType'     => 'text',
        
    'eval'          => array
        (
            
    'mandatory'    => false,
            
    'maxlength' => 255
            
    'tl_class'     => 'w50'
        
    ),
        
    'sql'           => "varchar(255) NOT NULL default ''"
    );

    $GLOBALS['TL_DCA']['tl_book']['fields']['number'] = array
    (
        
    'label'         => &$GLOBALS['TL_LANG']['tl_book']['number'],
        
    'exclude'       => true,
        
    'inputType'     => 'text',
        
    'eval'          => array
        (
            
    'mandatory'    => false,
            
    'maxlength' => 5
            
    'tl_class'     => 'w50'
        
    ),
        
    'sql'           => "varchar(5) NOT NULL default ''"
    );

    $GLOBALS['TL_DCA']['tl_book']['fields']['position'] = array
    (
        
    'label'         => &$GLOBALS['TL_LANG']['tl_book']['position'],
        
    'exclude'       => true,
        
    'filter'        => true,
        
    'inputType'     => 'text',
        
    'eval'          => array
        (
            
    'mandatory'    => false,
            
    'maxlength' => 255
            
    'tl_class'     => 'w50'
        
    ),
        
    'sql'           => "varchar(255) NOT NULL default ''"
    );

    $GLOBALS['TL_DCA']['tl_book']['fields']['remarks'] = array
    (
        
    'label'         => &$GLOBALS['TL_LANG']['tl_book']['remarks'],
        
    'exclude'       => true,
        
    'search'        => true,
        
    'inputType'     => 'text',
        
    'eval'          => array
        (
            
    'mandatory'    => false,
            
    'maxlength' => 512
            
    'tl_class'     => 'long'
        
    ),
        
    'sql'           => "varchar(512) NOT NULL default ''"
    );

    $GLOBALS['TL_DCA']['tl_book']['fields']['image'] = array
    (
        
    'label'                   => &$GLOBALS['TL_LANG']['tl_book']['image'],
        
    'exclude'                 => true,
        
    'inputType'               => 'fileTree',
        
    'eval'                    => array
        (
            
    'files'               => true
            
    'fieldType'           => 'radio'
            
    'filesOnly'           => true
            
    'extensions'          => 'jpg,jpeg,png,gif'
        
    ),
        
    'sql'                     => "binary(16) NULL" 
    );

    unset(
    $GLOBALS['BE_MOD']['content']['books']);
    /**
     * Backend-Bereich DSB anlegen, wenn noch nicht vorhanden
     */
    if(!$GLOBALS['BE_MOD']['dsb']) 
    {
        
    $dsb = array(
            
    'dsb' => array()
        );
        
    array_insert($GLOBALS['BE_MOD'], 0$dsb);
    }
    // Books verschieben
    $GLOBALS['BE_MOD']['dsb']['books'] = array
    (
        
    'tables' => array('tl_book''tl_chapter''tl_content'),
        
    'icon'   => 'system/modules/books/assets/book.png'
    ); 
    Ich brauchte Felder für Sachgebiet, Bemerkungen, Eigentümer, Anzahl (Duplikate) und Standort. Dann noch ein Bild-Feld für das Cover. Ganz unten habe ich books aus dem Menü content rausgeworfen und in meinen eigenen Bereich verschoben.

    Den Import mache ich mit phpMyAdmin. Die aus Excel erstellte CSV-Datei schiebe ich entweder bei http://www.convertcsv.com/csv-to-sql.htm hoch oder ich bastele mir schnell ein PHP-Skript um die SQL-Query-Dateien zu erstellen.
    Viele Grüße
    Frank

    Seit Mai 2013 Fan von Contao
    Webmaster vom Deutschen Schachbund und Berliner Schachverband
    Mein Blog: Schachbulle
    Meine Erweiterungen bei GitHub
    Meine Videos auf YouTube: Playlist zur Contao-Programmierung/Einrichtung

  8. #8
    Contao-Nutzer
    Registriert seit
    08.12.2011.
    Beiträge
    27

    Standard

    Ich habe bewusst nicht zuviel an Informationen in Form von zusätzlichen Feldern in der Books-Erweiterung bereits vorgegeben. Dank DCA kann man die bei Bedarf individuell nachrüsten, so wie Du es machst.

    Für den Import/Export suche ich was strukturierteres als CSV. Sieht so aus, als ob Du nur einen Katalog von Büchern erstellen willst. Wir erstellen damit ganze Bücher zum Online lesen. Für zig Bücher mit im Schnitt 100 bis 200 Seiten sind Excel und CSV zum Offline-Bearbeiten eher nicht geeignet. Ich möchte es zumindest nicht

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
  •