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
Nebentabelle in welcher die Kategorien gespeichert werden, welcher ein Event zugewiesen werden kann
Nebentabelle in welcher die Kommentare eines Events gespeichert werden (1:n)
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:
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:
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:
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
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;
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;
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;
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'
)
));
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')
)
)
);
- 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}
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


Kommentar