Extension für Eventverwaltung - Fragen zum DCA

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • crivi
    Contao-Nutzer
    • 03.11.2011
    • 16

    #1

    Extension für Eventverwaltung - Fragen zum DCA

    Hallo zusammen

    Ich bin ein absoluter Neuling in der Entwicklung von Contao Extensions.
    Trotzdem wage ich mich nun an diese Aufgabe.

    Ich habe meine Extension aufgrund vom Tagebuch hier im Forum und einigen anderen Tutorials aufgebaut.

    Diese Extension stellt eine Eventverwaltung für Kulturschaffende dar.
    Eine Veranstaltung soll im BE eingegeben werden und danach im FE in einer Tabelle ausgegeben werden. Um das FE habe ich mich bis anhin noch gar nicht gekümmert.

    Mein Datenbankaufbau sieht so aus:

    Haupttabelle in welcher die Events gespeichert werden
    Code:
    CREATE TABLE `tl_qg_events` (
      `id` int(10) unsigned NOT NULL auto_increment,
      `pid` int(10) unsigned NULL default '0',
      `tstamp` int(10) unsigned NULL default '0',
      `title` varchar(255) NULL default NULL,
      `lead` text NULL,
      `detail` text NULL,
      `category` int(10) unsigned NULL default NULL,
      `image` varchar(255) NULL default NULL,
      `artist` varchar(255) NULL default NULL,
      `organiser` varchar(255) NULL default NULL,
      `link_artist` varchar(255) NULL default NULL,
      `link_organiser` varchar(255) NULL default NULL,
      `ticketprice` varchar(255) NULL default NULL,
      PRIMARY KEY  (`id`),
      KEY `pid` (`pid`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    Nebentabelle in welcher die Kategorien gespeichert werden, welcher ein Event zugewiesen werden kann
    Code:
    CREATE TABLE `tl_qg_event_category` (
      `id` int(10) unsigned NOT NULL auto_increment,
      `tstamp` int(10) unsigned NOT NULL default '0',
      `title` varchar(64) NULL default NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    Nebentabelle in welcher die Kommentare eines Events gespeichert werden (1:n)
    Code:
    CREATE TABLE `tl_qg_event_comments` (
      `id` int(10) unsigned NULL auto_increment,
      `tstamp` int(10) unsigned NULL default '0',
      `eventid` int(10) unsigned NULL default '0',
      `name` varchar(255) NULL default NULL,
      `comment` varchar(255) NULL default NULL,
      `active` varchar(10) NULL default NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    Sollte es im DB-Aufbau Fehler haben, bitte ich um Input.

    Nun meine Probleme sind folgende:
    - Wie bringe ich die Verkettung vom Event und Kategorie resp. Event und Kommentare im BE hin?
    Am liebsten wäre es mir, wenn ich alle Kategorien als Dropdown anzeigen kann. Über die Darstellung der Kommentare habe ich mir bislang noch keine Gedanken gemacht.
    - Wie speichere ich Einträge in die DB?

    Meine config.php sieht aktuell so aus:

    PHP-Code:
    $GLOBALS['TL_CONFIG']['debugMode'] = true;
    $GLOBALS['TL_CONFIG']['displayErrors'] = true;
    
    array_insert($GLOBALS['BE_MOD']['content'], 3, array
    (
        'qg_events' => array
        (
            'tables' => array('tl_qg_events','tl_qg_event_category','tl_qg_event_comments'),
            'icon'   => 'system/modules/qg_events/html/icon.gif'
        )
    )); 
    
    Hier noch eine Frage: Muss ich bei 'tables' alle Tabellen angeben? Für was ist dieser Eintrag genau?

    Dann kommen wir zu meinem DCA File. Der Aufbau im BE funktioniert eigentlich einwandfrei.
    Nur werden die Einträge nicht gespeichert. Wie muss ich da vorgehen?

    Hier mein DCA File:

    PHP-Code:
    $GLOBALS['TL_DCA']['tl_qg_events'] = array
    (
    
        // Config
        'config' => array
        (
            'dataContainer'               => 'Table',
            'switchToEdit'               => true,
            'ptable'                      => 'tl_qg_event_category',
        ),
        
        // List
        'list' => array
        (
            'sorting' => array
            (
                'mode'                    => 4,
                'fields'                  => array('title'),
                'flag'                    => 1,
                'headerFields'            => array('title', 'lead'),
                'panelLayout'             => 'search,limit',
                'child_record_callback'   => array('tl_qg_events', 'listEvents')
    
            ),
            'global_operations' => array
            (
                'all' => array
                (
                    'label'               => &$GLOBALS['TL_LANG']['MSC']['all'],
                    'href'                => 'act=select',
                    'class'               => 'header_edit_all',
                    'attributes'          => 'onclick="Backend.getScrollOffset();"'
                )
            ),
            'operations' => array
            (
                'edit' => array
                (
                    'label'               => &$GLOBALS['TL_LANG']['tl_qg_events']['edit'],
                    'href'                => 'act=edit',
                    'icon'                => 'edit.gif'
                ),
                'copy' => array
                (
                    'label'               => &$GLOBALS['TL_LANG']['tl_qg_events']['copy'],
                    'href'                => 'act=copy',
                    'icon'                => 'copy.gif'
                ),
                'delete' => array
                (
                    'label'               => &$GLOBALS['TL_LANG']['tl_qg_events']['delete'],
                    'href'                => 'act=delete',
                    'icon'                => 'delete.gif',
                    'attributes'          => 'onclick="if (!confirm(\'' . $GLOBALS['TL_LANG']['MSC']['deleteConfirm'] . '\')) return false; Backend.getScrollOffset();"'
                ),
                'show' => array
                (
                    'label'               => &$GLOBALS['TL_LANG']['tl_qg_events']['show'],
                    'href'                => 'act=show',
                    'icon'                => 'show.gif'
                )
            )
        
        ),
        
        // Palettes
        'palettes' => array
        (
            'default'                     => '{title_legend},title,category,artist;{description_legend},lead,detail,ticketprice;{links_legend},link_artist,link_organiser;{image_legend},image;'
        ),
        
        // Fields
        'fields' => array
        (
            'title' => array
            (
                'label'                   => &$GLOBALS['TL_LANG']['tl_qg_events']['title'],
                'inputType'               => 'text',
                'search'                  => true,
                'eval'                    => array('mandatory'=>true, 'maxlength'=>255, 'tl_class'=>'w50')
            ),
             'category' => array
            (
                'label'                   => &$GLOBALS['TL_LANG']['tl_qg_events']['category'],
                'inputType'               => 'text',
                'search'                  => true,
                'eval'                    => array('mandatory'=>true, 'maxlength'=>255, 'tl_class'=>'w50')
            ),
            'lead' => array
            (
                'label'                   => &$GLOBALS['TL_LANG']['tl_qg_events']['lead'],
                'inputType'               => 'textarea',
                'search'                  => true,
                'eval'                    => array('mandatory'=>true, 'maxlength'=>200)
            ),
    
            'artist' => array
            (
                'label'                   => &$GLOBALS['TL_LANG']['tl_qg_events']['artist'],
                'inputType'               => 'text',
                'search'                  => true,
                'eval'                    => array('mandatory'=>false, 'maxlength'=>255, 'tl_class'=>'w50')
            ),
            'detail' => array
            (
                'label'                   => &$GLOBALS['TL_LANG']['tl_qg_events']['detail'],
                'inputType'               => 'textarea',
                'search'                  => true,
                'eval'                    => array('mandatory'=>true, 'maxlength'=>1000)
            ),
          'ticketprice' => array
            (
                'label'                   => &$GLOBALS['TL_LANG']['tl_qg_events']['ticketprice'],
                'inputType'               => 'text',
                'search'                  => true,
                'eval'                    => array('mandatory'=>false, 'maxlength'=>255, 'tl_class'=>'w50')
            ),
             'link_artist' => array
            (
                'label'                   => &$GLOBALS['TL_LANG']['tl_qg_events']['link_artist'],
                'inputType'               => 'text',
                'search'                  => true,
                'eval'                    => array('mandatory'=>false, 'maxlength'=>255, 'tl_class'=>'w50')
            ),
             'link_organiser' => array
            (
                'label'                   => &$GLOBALS['TL_LANG']['tl_qg_events']['link_organiser'],
                'inputType'               => 'text',
                'search'                  => true,
                'eval'                    => array('mandatory'=>false, 'maxlength'=>255, 'tl_class'=>'w50')
            ),
             'image' => array
            (
                'label'                   => &$GLOBALS['TL_LANG']['tl_qg_events']['image'],
                'inputType'               => 'fileTree',
                'search'                  => true,
                'eval'                    => array('files'=>true, 'filesOnly'=>true, 'fieldType'=>'radio')
            )
           
        )
    ); 
    
    Hierzu habe ich auch noch die eine oder andere Frage:
    - Für was ist hier in der Config der Eintrag 'ptable', oder 'ctable'? Die Beschreibung aus der DCA Hilfe kenne ich. Nur gibt es da noch eine verständlichere Art dies zu erklären? Warum dass hier aktuell tl_qg_event_category eingetragen ist, weiss ich nicht. Wenn ich aber eine andere Tabelle (z.B. tl_qg_events) eintrage wird folgender Fehler im BE angezeigt:
    Code:
    Fatal error: Uncaught exception Exception with message Query error: You can't specify target table 'tl_qg_events' for update in FROM clause (DELETE FROM tl_qg_events WHERE NOT EXISTS (SELECT * FROM tl_qg_events WHERE tl_qg_events.pid = tl_qg_events.id)) thrown in /home/httpd/vhosts/xxx.xx/subdomains/contao/httpdocs/system/libraries/Database.php on line 677 
    #0 /home/httpd/vhosts/xxx.xx/subdomains/contao/httpdocs/system/libraries/Database.php(624): Database_Statement->query()
    #1 /home/httpd/vhosts/xxx.xx/subdomains/contao/httpdocs/system/libraries/Database.php(164): Database_Statement->execute()
    #2 /home/httpd/vhosts/xxx.xx/subdomains/contao/httpdocs/system/drivers/DC_Table.php(2787): Database->execute('DELETE FROM tl_...')
    #3 /home/httpd/vhosts/xxx.xx/subdomains/contao/httpdocs/system/drivers/DC_Table.php(303): DC_Table->reviseTable()
    #4 /home/httpd/vhosts/xxx.xx/subdomains/contao/httpdocs/system/modules/backend/Backend.php(271): DC_Table->showAll()
    #5 /home/httpd/vhosts/xxx.xx/subdomains/contao/httpdocs/contao/main.php(101): Backend->getBackendModule('qg_events')
    #6 /home/httpd/vhosts/xxx.xx/subdomains/contao/httpdocs/contao/main.php(286): Main->run()
    #7 {main}
    Ich bin mir bewusst, dass es viele Fragen sind. Es wäre aber super, wenn wir Schritt für Schritt die Fragen besprechen könnten.

    Vielen herzlichen Dank für Eure Hilfe.
    Sollten noch irgendwelche Angaben fehlen, einfach schreiben. Es gäbe da noch ein Sprach-File. Da dies meiner Ansicht nach keine Relevanz hat, habe ich den Inhalt dieses Files nicht gepostet.

    Gruss Raffi
    Zuletzt geändert von crivi; 07.12.2011, 09:47.
  • Bandyt
    Contao-Fan
    • 22.04.2010
    • 808

    #2
    Hallo Raffi,

    ich fürchte du bist noch recht weit von der Lösung weg (Du verwechselt Child- und Parenttable, nutzt die falschen Modi, etc)


    Schau dir vielleicht mal diese DCA-Definitionen aus meinem League Manager an. Dort hast du Spieler und verbindest diese mit Mannschaften (Über eine Parent-Child-Verbindung):
    DCA für Spieler
    DCA für Zuordnung Spieler-Mannschaft

    Ich hoffe das hilft dir etwas weiter.

    EDIT: Hier noch der Code aus der config.php:
    PHP-Code:
    'tl_lm_players' => array
             (
                'tables' => array('tl_lm_players','tl_lm_players_to_team'),
                    'icon'   => 'system/modules/league-manager/images/player.png'
             ), 
    
    Meine Erweiterungen: League Manager | Forum

    Kommentar

    • crivi
      Contao-Nutzer
      • 03.11.2011
      • 16

      #3
      Hallo

      Vielen Dank für die rasche Antwort.
      Ja ich bin mir bewusst, dass ich noch einiges verwechsle. Deshalb dachte ich, ich wende mich mal ans Forum, um etwas Licht ins Dunkle zu bringen.

      Brauche ich überhaupt eine Parent Table und eine Child Table? Wenn ja für was?
      Muss ich grundsätzlich für die Speicherung eines Eintrages in die Datenbank noch etwas erledigen, oder sollte Contao dies selbst machen?

      Ich überlege mir gerade, ob ich das Modul calendar als Grundlage für meine Entwicklung nehmen soll. Ist es einfacher von Grund auf eine Extension selber zu schreiben, oder ist es einfacher wenn ich als Grundlage eine bestehende Extension nehme, welcher meiner im Grunde ähnlich ist?

      Fragen über Fragen.

      Immerhin... Es ist noch kein Meister vom Himmel gefallen. Und irgendwann muss man ja beginnen. Aller Anfang ist schwer

      Vielen Dank.
      Gruess Raffi

      Kommentar

      Lädt...