Ergebnis 1 bis 12 von 12

Thema: Zwei eigene Backend Module auf einer Tabelle

  1. #1
    Contao-Nutzer Avatar von dcm75
    Registriert seit
    21.06.2009.
    Beiträge
    96

    Standard Zwei eigene Backend Module auf einer Tabelle

    Hallo zusammen,

    ich möchte auf einer Tabelle ein Zweites eigenes Modul anwenden.

    In einem Modul1 befindet folgende Konfiguration "config/config.php" ist wie folgt aufgebaut:
    PHP-Code:
    // Backend module
    $GLOBALS['BE_MOD']['Funktion1']['VerwaltungVonMyTable'] = array
    (
        
    'tables'       => array('mytable'),
    ); 

    In einem Modul2 müsste ich jetzt die gleich Konfiguration "config/config.php" verwenden:
    PHP-Code:
    // Backend module
    $GLOBALS['BE_MOD']['Funktion2']['NeueVerwaltungVonMyTable_Text_Manager'] = array
    (
        
    'tables'       => array('mytable'),
    ); 
    die Klasse mytable darf es aber nur einmal geben.

    Wie kann ich ein Zweites Backend-Modul für die selbe Tabelle entwickeln?

    Danke und Viele Grüße
    Daniel
    Geändert von dcm75 (21.01.2013 um 19:58 Uhr) Grund: Tippfehler im Titel

  2. #2
    Contao-Urgestein Avatar von Toflar
    Registriert seit
    15.06.2009.
    Beiträge
    4.467
    Partner-ID
    8667
    User beschenken
    Wunschliste

    Standard

    Was möchtest du denn machen? Die Tabelle quasi vorfiltern?
    Contao Core-Entwickler @terminal42 gmbh
    Wir sind Contao Premium-Partner!
    Für Individuallösungen kannst du uns gerne kontaktieren.
    PS: Heute schon getrakked?

  3. #3
    Contao-Nutzer Avatar von dcm75
    Registriert seit
    21.06.2009.
    Beiträge
    96

    Standard

    Hi Toflar,

    ich möchte zwei Backendmodule MyMod1 und MyMod2 die als Basis eine tabelle mytable nutzen erstellen.

    Problem ist, das ich zwei config.php benötige - eine für MyMod1 und eine für MyMod2.

    Der folgende Eintrag greif auf die Klasse mytable zu, die es aber nur einmal geben darf.
    Code:
    'tables'       => array('mytable'), // Läd die Klasse mytable
    Ideal wäre eine art Deklaration, die es erlaubt den Klassennamen unabhängig von Tablenamen zu benennen.

    Es geht nicht nur um ein Vorfiltern. Die Backendmodule MyMod1 und MyMod2 bieten komplett unterschiedliche Funktionen.

    Die Module MyMod1 und MyMod2 möchte ich komplett mit DCA entwickeln (https://contao.org/de/manual/3.0/dat...er-arrays.html).

    Danke und Viele Grüße
    Daniel
    Geändert von dcm75 (20.01.2013 um 22:56 Uhr)

  4. #4
    Contao-Urgestein Avatar von Toflar
    Registriert seit
    15.06.2009.
    Beiträge
    4.467
    Partner-ID
    8667
    User beschenken
    Wunschliste

    Standard

    Hey Daniel

    Sorry, aber ich versteh immer noch nicht, was du genau machen willst.

    Du kannst die gleiche Tabelle so oft angeben wie du willst. Du kannst ein Modul 5x anlegen und sie immer das gleiche machen lassen.
    Schliesslich lädt es ja keine Klasse, sondern ein DCA. Das ist ein Array und keine Klasse

    Erklär doch, was du machen willst an deinem konkreten Beispiel.
    Wenn sie komplett unterschiedliche Funktionen bieten, arbeiten sie auch auf komplett unterschiedlichen Tabellen
    Contao Core-Entwickler @terminal42 gmbh
    Wir sind Contao Premium-Partner!
    Für Individuallösungen kannst du uns gerne kontaktieren.
    PS: Heute schon getrakked?

  5. #5
    Contao-Nutzer Avatar von dcm75
    Registriert seit
    21.06.2009.
    Beiträge
    96

    Standard

    Hi Toflar,

    gar nicht so einfach zu erklären :-)

    Das DCA existiert ja bereits und wird direkt aus der Datei mytable.php geladen.

    mytable.php:
    Code:
    class mytable  extends Backend
    {
            public function onload($dc)
    	{
    		echo "Ich gebe A aus"; 
    		return;
    	}
    ...
    }
    
    $GLOBALS['TL_DCA']['mytable'] = array
    (
    ...
        	'config' => array
            (
    		'dataContainer'                 => 'Table',
                    'onload_callback'		=> array(array('mytable', 'onload')),
            )
    ...
    );
    Ich müsste jetzt eine andere config laden z.B.

    mytable2.php:
    Code:
    class mytable2  extends Backend
    {
            public function onload($dc)
    	{
    		echo "Ich gebe B aus"; 
    		return;
    	}
    ...
    }
    
    $GLOBALS['TL_DCA']['mytable2'] = array
    (
    ...
        	'config' => array
            (
    		'dataContainer'                 => 'Table',
                    'onload_callback'		=> array(array('mytable2', 'onload')),
            )
    ...
    );
    Das DCA kann aber nur einmal deklariert werden und muss meines Wissens wie die Tabelle mytable heißen.
    $GLOBALS['TL_DCA']['mytable2'] geht damit leider nicht!

    Ich hoffe das Problem ist besser verständlich.

    Danke und Viele Grüße
    Daniel
    Geändert von dcm75 (21.01.2013 um 20:05 Uhr)

  6. #6
    Maintainer Avatar von xtra
    Registriert seit
    02.07.2009.
    Ort
    Tuebingen
    Beiträge
    2.007
    User beschenken
    Wunschliste

    Standard

    Mach es mit dem loadDataContainer HOOK.


    PHP-Code:
    // config.php
    $GLOBALS['TL_HOOKS']['loadDataContainer'][] = array('Foo''loadDataContainerHOOK');

    // Foo.php
    class Foo extends Backend
    {
      public function 
    loadDataContainerHOOK($strTable)
      {
        if (
    $this->Input->get('do') == 'VerwaltungVonMyTable')
        {
          
    $GLOBALS['TL_DCA']['mytable']['config']['onload_callback'][] = array('mytable''onload');
        } else {
          
    $GLOBALS['TL_DCA']['mytable']['config']['onload_callback'][] = array('mytable''onload2');
        }
      }


    Bedenke stets: Wenn Du ungenaue oder unzureichende Angaben machst, so koennte dies die Bearbeitung deiner Frage endlos verzoegern (oder sogar dazu fyhren, dass ich zu viel nachdenken muss und die Antwort vergesse!). Kein Support per PN.

  7. #7
    Contao-Nutzer Avatar von dcm75
    Registriert seit
    21.06.2009.
    Beiträge
    96

    Standard Es funktioniert mit HOOKS

    Hi xtra,

    gleich getestet - ja, damit funktioniert es :-)

    HOOKS fand ich noch ein wenig abstrakt aber so langsam verstehe ich deren Sinn.

    Danke Dir!
    Daniel

  8. #8
    Contao-Nutzer Avatar von dcm75
    Registriert seit
    21.06.2009.
    Beiträge
    96

    Standard Hooks funktionieren aber nicht die schönste Lösung

    Hallo zusammen,

    die Umsetzung mit Hooks funktioniert zwar, aber nach einigen Test denke ich, dass der Code nicht gut lesbar sein wird.

    Sind ja zwei verschiedene Funktionalitäten in der gleichen Klasse, die lediglich über eine Weiche getrennt sind.

    Schön wäre eine komplette Trennung etwa in der config.php, die mir erlaub mal mytable.php und mal mytable2.php zu laden.

    Hat jemand noch weiteren Tipp neben dem loadDataContainerHOOK für mich?

    Danke und Viele Grüße
    Daniel
    Geändert von dcm75 (28.01.2013 um 19:34 Uhr)

  9. #9
    Maintainer Avatar von xtra
    Registriert seit
    02.07.2009.
    Ort
    Tuebingen
    Beiträge
    2.007
    User beschenken
    Wunschliste

    Standard

    Nein, habe ich nicht, denn das kannst du mit dem ja auch machen....
    PHP-Code:
    // config.php
    $GLOBALS['TL_HOOKS']['loadDataContainer'][] = array('Foo''loadDataContainerHOOK');

    // Foo.php
    class Foo extends Backend
    {
      public function 
    loadDataContainerHOOK($strTable)
      {
        if (
    $this->Input->get('do') == 'VerwaltungVonMyTable')
        {
          
    $GLOBALS['TL_DCA']['mytable']['config']['onload_callback'][] = array('MyTable''onload');
        } else {
          
    $GLOBALS['TL_DCA']['mytable']['config']['onload_callback'][] = array('MyTable2''onload');
        }
      }

    Oder ich versteh die Frage nicht.
    Bedenke stets: Wenn Du ungenaue oder unzureichende Angaben machst, so koennte dies die Bearbeitung deiner Frage endlos verzoegern (oder sogar dazu fyhren, dass ich zu viel nachdenken muss und die Antwort vergesse!). Kein Support per PN.

  10. #10
    Contao-Nutzer Avatar von dcm75
    Registriert seit
    21.06.2009.
    Beiträge
    96

    Standard

    Hi xtra,

    Danke für die Antwort!

    In Deinem Beispiel spielt sich alles in der Klasse Foo ab. Ich würde den Code für das Modul gerne in eine komplett andere Datei und damit auch in eine andere Klasse realisieren.

    Die Anpassung betrifft nicht nur die onload-Funktion, sondern z.B. auch das Palettes-Array welches ich neu definieren möchte.

    Zwei unterschiedliche Module in eine Datei zu packen ist etwas unübersichtlich.

    Viele Grüße
    Daniel
    Geändert von dcm75 (28.01.2013 um 21:36 Uhr)

  11. #11
    Maintainer Avatar von xtra
    Registriert seit
    02.07.2009.
    Ort
    Tuebingen
    Beiträge
    2.007
    User beschenken
    Wunschliste

    Standard

    Bei mir spielt sich alles in 3 Klassen ab...

    • Foo - die den HOOK implementiert und den onload_callback auf eine der beiden anderen Klassen delegiert.
    • MyTable - die deine erste Implementierung ist.
    • MyTable2 - die dann deine zweite Implementierung darstellt.


    Ich glaube du verwechselst hier gerade DCA-Datei mit Klasse.
    Bedenke stets: Wenn Du ungenaue oder unzureichende Angaben machst, so koennte dies die Bearbeitung deiner Frage endlos verzoegern (oder sogar dazu fyhren, dass ich zu viel nachdenken muss und die Antwort vergesse!). Kein Support per PN.

  12. #12
    Contao-Nutzer Avatar von dcm75
    Registriert seit
    21.06.2009.
    Beiträge
    96

    Standard

    Hi xtra,

    Dein Vorschlag würde das Problem auch lösen - Vielen Dank dafür!

    Ich hab mich jetzt doch zur Programmierung des Backend-Moduls ohne DCA-Containern entschlossen.

    PHP-Code:
    // Backend module
    $GLOBALS['BE_MOD']['Funktion2']['NeueVerwaltungVonMyTable_Text_Manager'] = array
    (
        
    'callback'       =>'myOwnModHandling',
    ); 
    Grüße
    Daniel
    Geändert von dcm75 (03.02.2013 um 13:26 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
  •