Ergebnis 1 bis 9 von 9

Thema: Backend-Modul: Daten in Datenbank statt in localconfig.php speichern

  1. #1
    Contao-Nutzer
    Registriert seit
    12.11.2010.
    Beiträge
    178

    Standard Backend-Modul: Daten in Datenbank statt in localconfig.php speichern

    Hallo

    ich bin gerade dabei, ein kleines Backend-Modul zu schreiben, welches momentan den Datencontainer File nutzt und lediglich aus einigen Eingabefeldern besteht. Die Eingaben werden beim File-Datencontainer bekanntlich in der localconfig.php gespeichert. Ich würde diese jedoch lieber in einer Datenbanktabelle speichern (wobei die Tabellenspalten identisch zu den Eingabefeldern benannt sind).

    Im Forum war dies in diesem Thread bereits Thema, jedoch frage ich mich, ob es nicht eine unkompliziertere Möglichkeit gibt.

    Danke und viele Grüße!

  2. #2
    Contao-Nutzer
    Registriert seit
    14.03.2012.
    Ort
    Berlin
    Beiträge
    225

  3. #3
    Contao-Nutzer
    Registriert seit
    12.11.2010.
    Beiträge
    178

    Standard

    Hallo jk1,

    danke, das Prinzip habe ich vermutlich verstanden.
    Allerdings habe ich Probleme mit dem Callback. Sobald ich diesen in der config.php definiere, funktioniert weder das Anlegen noch das Bearbeiten eines Datensatzes. Im Contao-Backend ist dann außer der Modul-Überschrift in der Hauptspalte nichts zu sehen (DCA wird nicht geladen oder so…)

    Hier mein auf das notwendigste gekürzte Code:

    config/config.php
    PHP-Code:
    <?php 
    /**
     * Back end modules
     */
    $GLOBALS['BE_MOD']['content']['my_module'] = array
    (
        
    'tables'    => array('tl_my_module'),
        
    'icon'        => 'system/modules/my_module/html/my_module.png',
        
    'callback'    => 'MyModule'
    );
    ?>
    config/database.sql
    Code:
    CREATE TABLE `tl_my_module` (
    	`id` int(10) unsigned NOT NULL auto_increment,
    	`pid` int(10) unsigned NOT NULL default '0',
    	`tstamp` int(10) unsigned NOT NULL default '0',
    	`title` varchar(255) NOT NULL default '',
    	PRIMARY KEY  (`id`),
    	KEY `pid` (`pid`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    MyModule.php
    PHP-Code:
    <?php
    class MyModule extends BackendModule
    {
        protected function 
    compile()
        {
            
    // test
            // $this->redirect('contao/main.php?do=my_module&act=edit&id=1');
        
    }
    }
    ?>
    dca/my_module.php
    PHP-Code:
    <?php
    $GLOBALS
    ['TL_DCA']['tl_my_module'] = array
    (
        
    // Allgemein Konfiguration
        
    'config' => array
        (
            
    //'dataContainer'    => 'File',
            
    'dataContainer'    => 'Table',
            
    'table'            => 'tl_my_module',
            
    // 'closed'        => true
        
    ),

        
    'palettes' => array
        (
            
    'default'    => '{legend},title'
        
    ),

        
    'fields' => array
        (
            
    'title' => array
            (
                
    'label'        => &$GLOBALS['TL_LANG']['tl_my_module']['title'],
                
    'inputType'    => 'text'
            
    )
        )
    );
    ?>
    Gruß


    EDIT: Hmm… selbst wenn man es so hinbekommt wie von jk1 bzw. the_scrat vorgeschlagen, ist es doch eher ein "Hack", da man $GLOBALS['TL_DCA']['tl_my_module'[['config']['closed'] = true erst nach dem Anlegen eines initialen Datensatzes setzen kann, oder?
    Geändert von JaiBee (16.09.2013 um 15:15 Uhr)

  4. #4
    Contao-Nutzer
    Registriert seit
    14.03.2012.
    Ort
    Berlin
    Beiträge
    225

    Standard

    Dort steht ja auch etwas weiter unten, dass wenn du dein Modul als Callback Modul registriert, die DCA nicht verwendet wird.
    Was ich meinte, ist ein DCA Callback: https://contao.org/de/manual/3.1/dat...html#callbacks

    Die Zeile mit dem Callback also aus der Config entfernen & das onload_callback im DCA nutzen:

    PHP-Code:
    $GLOBALS['TL_DCA']['tl_my_module'] = array
    (
        
    // Allgemein Konfiguration
        
    'config' => array
        (
            
    'dataContainer'    => 'Table',
            
    'table'            => 'tl_my_module',
            
    'onload_callback' => array(array('deineKlasse''deineMethode'))
        ), 
    ... 
    deineKlasse & deineMethode könntest du auch direkt in die DCA Datei packen.

    PHP-Code:
    class deineKlasse extends Backend
    {
       public function 
    deineMethode()
       {
       
    //Anzahl auslesen & entsprechend weiterleiten.
       
    }


    Ich hab das selber noch nicht ausprobiert - sollte aber so ungefähr funktionieren. Kannst ja mal Rückmeldung geben ;-)



    edit:
    EDIT: Hmm… selbst wenn man es so hinbekommt wie von jk1 bzw. the_scrat vorgeschlagen, ist es doch eher ein "Hack", da man $GLOBALS['TL_DCA']['tl_my_module'[['config']['closed'] = true erst nach dem Anlegen eines initialen Datensatzes setzen kann, oder?
    Auch das könntest du erst in dem onload_callback setzen, wenn bereits ein Datensatz existiert.
    Geändert von jk1 (16.09.2013 um 15:25 Uhr)

  5. #5
    Contao-Nutzer
    Registriert seit
    12.11.2010.
    Beiträge
    178

    Standard

    Zitat Zitat von jk1 Beitrag anzeigen
    Was ich meinte, ist ein DCA Callback: https://contao.org/de/manual/3.1/dat...html#callbacks
    Ah, okay, das Callback wird nun aufgerufen. Danke schön!
    Momentan gerate ich noch in eine Art Dauerumleitung bis schließlich das memory_limit erreicht wird.

    MyModule.php
    PHP-Code:
    <?php 
    class MyModule extends Backend
    {
        public function 
    load()
        {
            
    $objResult $this->Database->prepare('SELECT 1 FROM tl_my_module LIMIT 1')->execute();

            
    // if table is not empty
            
    if ($objResult->next())
            {            
                
    // forbid adding further records to the table
                
    $GLOBALS['TL_DCA']['tl_my_module']['config']['closed'] = true;

                if (
    is_null($this->Input->get('act')))
                {
                    
    // edit existing record
                    
    $this->redirect('contao/main.php?do=my_module&act=edit&id=1');
                }

            }
            elseif (
    is_null($this->Input->get('act')))
            {
                
    // create new record
                
    $this->redirect('contao/main.php?do=my_module&act=create');
            }
        }
    }
    ?>
    Gleich zu Beginn bei gesetztem act-Parameter abzubrechen (return), bringt nichts. Naja, irgendwo befindet sich vlt. noch ein Denkfehler.

    Gruß
    Geändert von JaiBee (16.09.2013 um 17:56 Uhr) Grund: is_null(); redirect -> load

  6. #6
    Contao-Nutzer
    Registriert seit
    14.03.2012.
    Ort
    Berlin
    Beiträge
    225

    Standard

    Das Callback wird auch aufgerufen, wenn du einen Datensatz bearbeitest oder erstellst. D.h. als erstes musst du über die GET Parameter checken, wo du dich befindest.
    act=edit & act=create solltest du also davon ausschließen, da du es ja nur auf der Übersicht anwenden möchtest.

    Dein SQL sieht auch ein bischen komisch aus. SELECT 1 ?

  7. #7
    Contao-Nutzer
    Registriert seit
    12.11.2010.
    Beiträge
    178

    Standard

    Aww… Fehler gefunden. Meine Methode hieß redirect, wodurch mittels this->redirect(…) die falsche Funktion aufgerufen wurde (hat sich also selbst wieder aufgerufen). Tja, das kommt davon, wenn man nicht aufpasst und keine IDE verwendet…

    Nach dem Umbenennen funktioniert alles wie gewünscht (werde den Code oben gleich anpassen).

    Zitat Zitat von jk1 Beitrag anzeigen
    act=edit & act=create solltest du also davon ausschließen, da du es ja nur auf der Übersicht anwenden möchtest.
    Das mache ich mit
    PHP-Code:
    if (is_null($this->Input->get('act'))) { // redirect

    Zitat Zitat von jk1 Beitrag anzeigen
    Dein SQL sieht auch ein bischen komisch aus. SELECT 1 ?
    Das kann man machen. Ergibt "1", wenn sich in der Tabelle etwas befindet, ansonsten nicht.

    Mit folgendem Snippet in der languages/default.php lässt sich noch das Datensatz ID 1 bearbeiten überschreiben:
    PHP-Code:
    if ($this->Input->get('do') === 'my_plugin') {
        
    $GLOBALS['TL_LANG']['MSC']['editRecord'] = 'MyPlugin konfigurieren';

    Vielen Dank, jk1, für deine Hilfe!

    Gruß

  8. #8
    Contao-Nutzer
    Registriert seit
    14.03.2012.
    Ort
    Berlin
    Beiträge
    225

    Standard

    Ah ok, gut zu wissen.

    Wenn du die Prüfung der get Parameter aber vorher machst, kannst du dir einen Query in der Eingabemaske sparen

  9. #9
    Contao-Nutzer
    Registriert seit
    12.11.2010.
    Beiträge
    178

    Standard

    Zitat Zitat von jk1 Beitrag anzeigen
    Wenn du die Prüfung der get Parameter aber vorher machst, kannst du dir einen Query in der Eingabemaske sparen
    Wollte sicherstellen, dass $GLOBALS['TL_DCA']['tl_my_module']['config']['closed'] = true; gesetzt werden kann.

    PHP-Code:
    <?php 
    class MyPlugin extends Backend
    {
        
    /**
         * Onload callback
         */
        
    public function my_plugin_redirect()
        {
            
    // forbid adding further records to the table
            
    $GLOBALS['TL_DCA']['tl_my_plugin']['config']['closed'] = true;

            
    // return immediately if sensible
            
    if (!is_null($this->Input->get('act')) && $this->Input->get('act') === 'edit')
            {
                return;
            }

            
    // fetch information whether table is empty
            
    $objResult $this->Database->prepare('SELECT 1 FROM `tl_my_plugin` LIMIT 1')->execute();

            
    // if table is not empty
            
    if ($objResult->next())
            {
                
    // redirect to: edit existing record
                
    $get 'act=edit&id=1';
            }
            else
            {
                if (
    is_null($this->Input->get('act')))
                {
                    
    // redirect to: create new record
                    
    $get 'act=create';
                }
                else
                {
                    
    // allow adding initial record and return
                    
    $GLOBALS['TL_DCA']['tl_my_plugin']['config']['closed'] = false;
                    return;
                }
            }

            
    // redirect
            
    $this->redirect('contao/main.php?do=my_plugin&' $get);
        }
    }
    ?>
    Geändert von JaiBee (17.09.2013 um 12:45 Uhr)

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
  •