Ergebnis 1 bis 11 von 11

Thema: DCA - Palettes abhängig von ptable.field

  1. #1
    Contao-Nutzer
    Registriert seit
    25.08.2011.
    Beiträge
    59

    Standard DCA - Palettes abhängig von ptable.field

    Moin, moin,
    ich wollte die DCA-Erstellung im ersten Schritt wie folgt umbauen:

    PHP-Code:
    <?php if (!defined('TL_ROOT')) die('You can not access this file directly!');
    $GLOBALS['TL_DCA']['tl_km_dokumente'] = array
    (
        
    // Config
        
    'config' => array
        (
            ...
        ),
        
    // List
        
    'list' => array
        (
            ...
        )
    );
    $GLOBALS['TL_DCA']['tl_km_dokumente'] = array
    (
        
    // Palettes
        
    'palettes' => array
        (
            ...
        ),
        
    // Subpalettes
        
    'subpalettes' => array
        (
            ...
        )
    );
    $GLOBALS['TL_DCA']['tl_km_dokumente'] = array
    (
        
    // Fields
        
    'fields' => array
        (
            ...
        )
    );
    ?>
    weil ich letztendlich die 'Palettes' abhängig von einem Feld in der Elterntabelle variieren möchte. Leider bekomme ich bereits jetzt die Fehlermeldung:
    Fatal error: Could not create a data container object in …\system\modules\backend\Backend.php on line 220

    #0 [internal function]: __error(256, 'Could not creat...', 'F:\Contao2Go\ht...', 220, Array)
    #1 …\system\modules\backend\Backend.php(220): trigger_error('Could not creat...', 256)
    #2 …\contao\main.php(120): Backend->getBackendModule('Sitzungen')
    #3 …\contao\main.php(230): Main->run()
    #4 {main}

    Ist dieses Vorgehen grundsätzlich falsch? Darf man das $GLOBALS['TL_DCA'] nicht stückeln?

    Im Voraus schon mal Danke für die Tipps, Gruß
    Bees2

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

    Standard

    Sieht sehr komisch aus Erklär doch mal was das Ziel ist und nicht dein Vorgehen Dann kann man dir sagen, wie du es machen könntest/solltest
    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
    Registriert seit
    25.08.2011.
    Beiträge
    59

    Standard

    Hallo Toflar,
    herzlichen Dank für Deine angebotene Hilfestellung. Hier mein Ziel:

    Ich habe eine Elterntabelle, mit einem Select-Feld (FeldEltern1), welches zwei verschiedene Werte annehmen kann (Wert1, Wert2). Desweiteren habe ich eine Kindtabelle. Nun soll, wenn FeldEltern1 == Wert1 die Palette in der Kindtabelle z.B.
    'default' => 'KindFeld1,KindFeld2,KindFeld3', bei FeldEltern1 == Wert2 hingegen 'default' => 'KindFeld4,KindFeld5,KindFeld6' sein.

    Gruß
    Bees2

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

    Standard

    Dann würde ich das mit einem onload_callback machen

    PHP-Code:
    $GLOBALS['TL_DCA']['tl_kindtabelle'] = array 

        
    // Config 
        
    'config' => array 
        ( 
            
    'onload_callback' => array(array('MeineKlasse''meineMethode'))
        ), 
        
    // Subpalettes 
        
    'subpalettes' => array 
        ( 
            ... 
        ), 
        
    // Fields 
        
    'fields' => array 
        ( 
            ... 
        ) 
    ); 
    PHP-Code:
    class MeineKlasse
    {
        public function 
    meineMethode($dc)
        {
            
    // Prüfen was in Elterntabelle steht
            
    if ($elterntabelle == $bla) {
                
    $palette 'xy,bla;';
            } else {
                
    $palette 'zq,foo,tu;';
            }

            
    $GLOBALS['TL_DCA']['tl_kindtabelle']['palettes']['default'] = $palette;
        }

    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
    Registriert seit
    25.08.2011.
    Beiträge
    59

    Standard

    Hallo Toflar,
    kann mich drehen und wenden, wie ich will. Habe im Config-Array des DCA den 'onload_callback'=> array('tl_km_dokumente', 'setPalettes') eingerichtet. Die Funktion sieht wie folgt aus:
    PHP-Code:
        public function setPalettes(DataContainer $dc
        {
            
    $objResult $this->Database->prepare("SELECT datcont FROM tl_km_tops WHERE id=?")
                                            ->
    execute($dc->activeRecord->pid);

            
    // Prüfen was in Elterntabelle steht
            
    if ($objResult->datcont == '1')    {
                    
    $palette 'datei,typ,datname,published,tabelle';
                }
            else
                {
                    
    $palette 'datei,typ,datname,published,language';
                }

            
    $GLOBALS['TL_DCA']['tl_km_dokumente']['palettes']['default'] = $palette;

            return 
    $palette;
        } 
    Doch die Paletten-Default-Anweisung in der Funktion wird nicht ausgeführt. :-(

    Auch der Wert, der über den return zurückgegebenen Variablen $palette, scheint nicht anzukommen. Dazu hatte ich probiert die Initialisierung des DCA-Arraysauf diesem Wege hinzubekommen:
    PHP-Code:
    $GLOBALS['TL_DCA']['tl_km_dokumente'] = array
    (
        
        
    // Config
        
    'config' => array
        (
            
    'dataContainer'               => 'Table',
            
    'ptable'                         => 'tl_km_tops',
            
    'onload_callback'              => array('tl_km_dokumente''setPalettes'),
        ),
        
        
    // List
        
    'list' => array
        (
            ...
        ),
        
    // Fields
        
    'fields' => array
        (
            ...
        )
    );
    $GLOBALS['TL_DCA']['tl_km_dokumente']['palettes']['default'] = $this->setPalettes();                                // funktioniert nicht!!
    $GLOBALS['TL_DCA']['tl_km_dokumente']['palettes']['default'] = 'datei,typ,datname,published,tabelle';          // so funktioniert es 
    Gruß
    Bees2

  6. #6
    Contao-Nutzer
    Registriert seit
    25.08.2011.
    Beiträge
    59

    Standard

    Moin, moin,
    noch eine kleine Zusatzinfo. Wenn ich
    PHP-Code:
    'onload_callback'  => array('tl_km_dokumente''setPalettes'
    in
    PHP-Code:
    'onload_callback'  => array(array('tl_km_dokumente''setPalettes')) 
    ändere, wird der Callback korrekt ausgeführt, allerdings erhalte ich dann folgende Fehlermeldung, aus der ich nicht schlau werde:
    Code:
    Recoverable error: Argument 2 passed to tl_km_dokumente::setPalettes() must be an instance of DataContainer, none given, called in F:\Contao2Go\htdocs\vhosts\meeresschutz_2100\system\drivers\DC_Table.php on line 200 and defined in …\system\modules\sitzungen\dca\tl_km_dokumente.php on line 205
    
    #0 …\system\modules\sitzungen\dca\tl_km_dokumente.php(205): __error(4096, 'Argument 2 pass...', 'F:\Contao2Go\ht...', 205, Array)
    #1 …\system\drivers\DC_Table.php(200): tl_km_dokumente->setPalettes(Object(DC_Table))
    #2 …\system\modules\backend\Backend.php(226): DC_Table->__construct('tl_km_dokumente')
    #3 …\contao\main.php(120): Backend->getBackendModule('Sitzungen')
    #4 …\contao\main.php(230): Main->run()
    #5 {main}
    
    
    Warning: Cannot modify header information - headers already sent by (output started at F:\Contao2Go\htdocs\vhosts\meeresschutz_2100\system\functions.php:162) in …\system\libraries\Template.php on line 267
    
    #0 [internal function]: __error(2, 'Cannot modify h...', 'F:\Contao2Go\ht...', 267, Array)
    #1 …\system\libraries\Template.php(267): header('Vary: User-Agen...', false)
    #2 …\system\modules\backend\BackendTemplate.php(161): Template->output()
    #3 …\contao\main.php(221): BackendTemplate->output()
    #4 …\contao\main.php(123): Main->output()
    #5 …\contao\main.php(230): Main->run()
    #6 {main}
    
    
    Warning: Cannot modify header information - headers already sent by (output started at F:\Contao2Go\htdocs\vhosts\meeresschutz_2100\system\functions.php:162) in …\system\libraries\Template.php on line 268
    
    #0 [internal function]: __error(2, 'Cannot modify h...', 'F:\Contao2Go\ht...', 268, Array)
    #1 …\system\libraries\Template.php(268): header('Content-Type: t...')
    #2 …\system\modules\backend\BackendTemplate.php(161): Template->output()
    #3 …\contao\main.php(221): BackendTemplate->output()
    #4 …\contao\main.php(123): Main->output()
    #5 …\contao\main.php(230): Main->run()
    #6 {main}
    Gruß
    Bees2

    PS: Und jetzt noch
    PHP-Code:
    public function setPalettes($varValue,DataContainer $dc
    in
    PHP-Code:
    public function setPalettes(DataContainer $dc
    geändert. Nun läuft es!! Großes Dankeschön an Toflar für den Anschub!!
    Geändert von bees2 (06.08.2013 um 08:02 Uhr)

  7. #7
    Contao-Nutzer
    Registriert seit
    25.08.2011.
    Beiträge
    59

    Beitrag

    Moin, moin,
    zu früh gefreut! Schade!

    Unglücklicherweise steht mir der Datacontainer scheinbar gar nicht zur Verfügung. Meine Callback-Funktion für den onload_callback sieht, wie folgt, aus:
    PHP-Code:
        public function setPalettes(DataContainer $dc
        {
            
    $objResult $this->Database->prepare("SELECT datcont FROM tl_km_tops WHERE id=?")
                                            ->
    execute($dc->activeRecord->pid);
            if (
    $objResult->datcont == 1)    {
                    
    $palette 'datei,typ,datname,published,angelegt_am, angelegt_von,geaendert_von;';
                } else {
                    
    $palette 'datei,typ,datname,published,up_datname;';
                }

            
    $GLOBALS['TL_DCA']['tl_km_dokumente']['palettes']['default'] = $palette;

            return 
    $palette;
        } 
    Hier ist das $objResult immer leer. Ersetze ich hingegen beispielhaft
    PHP-Code:
            $objResult $this->Database->prepare("SELECT datcont FROM tl_km_tops WHERE id=?")
                                            ->
    execute($dc->activeRecord->pid); 
    durch
    PHP-Code:
    $objResult $this->Database->execute("SELECT datcont FROM tl_km_tops WHERE id=21"); 
    funktioniert die Funktion einwandfrei.

    Wie komme ich trotzdem an $dc->activeRecord->pid??

    Gruß
    Bees2

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

    Standard

    Beim onload_callback gibt es noch keinen activeRecord, weil er theoretisch (beim Anlegen eines neuen Datensatzes) noch gar nicht existiert.
    Contao Core-Entwickler @terminal42 gmbh
    Wir sind Contao Premium-Partner!
    Für Individuallösungen kannst du uns gerne kontaktieren.
    PS: Heute schon getrakked?

  9. #9
    Contao-Nutzer
    Registriert seit
    25.08.2011.
    Beiträge
    59

    Standard

    Hallo Toflar,
    Beim onload_callback gibt es noch keinen activeRecord, weil er theoretisch (beim Anlegen eines neuen Datensatzes) noch gar nicht existiert.
    , okay, muss man so nehmen, wie es ist.

    Habe mein Problem jetzt so gelöst:
    - onload_callback wieder rausgenommen
    - beim load_callback des Feldes (wo mir die Infos des Eltern-Elementes zur Verfügung stehen) die Options desselben entsprechend nachgeladen
    - und für alle Zustände des Feldes eigene Paletten angelegt

    Nun läuft es (wie gewünscht)!

    Ein schönes Beispiel, um die Funktionalität der Paletten im Zusammenwirken mit Callbacks zu verstehen.

    Dir jetzt nochmal ein wirklich abschliessendes, grosses Dankeschön für Deine steten Anmerkungen.
    Gruß
    Bees2

  10. #10
    Gesperrt
    Registriert seit
    20.10.2011.
    Beiträge
    163

    Standard

    Genau vor diesem Problem stehe ich auch gerade...

    Ich habe deine Lösung zwar verstanden, würde aber gerne einen Beispiel Code haben, damit ich es wirklich nachvollziehen kann.

    Könntest du dein DCA bzw. gerade die Palletes und den CallBack posten?

    Danke dir.

  11. #11
    Contao-Nutzer
    Registriert seit
    25.08.2011.
    Beiträge
    59

    Standard

    Hallo Chris,
    Zitat Zitat von c.romeni
    Moin Moin...

    Ich wollte fragen ob du mir einen Beispiel Code für dieses Problem schicken könntest:
    hier mal ein auf's Wesentliche reduzierter Versuch:

    PHP-Code:
    <?php if (!defined('TL_ROOT')) die('You can not access this file directly!');
     
    /**
    * Table tl_km_dokumente
    */
    $GLOBALS['TL_DCA']['tl_km_dokumente'] = array
    (
        
        
    // Config
        
    'config' => array
        (
            
    'dataContainer'               => 'Table',
            
    'ptable'                      => 'tl_km_tops',
            
    'onsubmit_callback'              => array(array('tl_km_dokumente','aendernDateiname'))
        ),
        
        
    // List
        
    'list' => array
        (
            
    'sorting' => array
            (
                
    'mode'                    => 4,
                
    'fields'                  => array('typ'),
                
    'flag'                    => 12,
                
    'headerFields'            => array('pid','top_nr'),
                
    'panelLayout'             => 'search,limit',
                
    'disableGrouping'         => true,
                
    'child_record_callback'   => array('tl_km_dokumente''listDoks')
            ),
            
    'operations' => array
            (
                
    'edit' => array
                (
                    
    'label'               => &$GLOBALS['TL_LANG']['tl_km_dokumente']['edit'],
                    
    'href'                => 'act=edit',
                    
    'icon'                => 'edit.gif',
                ),
                
    'copy' => array
                (
                    
    'label'               => &$GLOBALS['TL_LANG']['tl_km_dokumente']['copy'],
                    
    'href'                => 'act=copy',
                    
    'icon'                => 'copy.gif',
                ),
                
    'delete' => array
                (
                    
    'label'               => &$GLOBALS['TL_LANG']['tl_km_dokumente']['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_km_dokumente']['show'],
                    
    'href'                => 'act=show',
                    
    'icon'                => 'show.gif'
                
    )
            )
        ),
        
        
    // Palettes
        
    'palettes' => array
        (
            
    '__selector__'      => array('typ'),
            
    'default'           => 'datei,typ',
            
    //s. Funktion getTypes: $types = ModuleSitzungen::$types[$objResult->datcont];
            //$objResult->datcont = Value des Eltern-Elementes (0 oder 1)
            
            /*$types = array(
                                '0'    =>array(
                                                    'TO-Entwurf'     => 'TO-Entwurf',
                                                    'Sachstand'     => 'Sachstand',
                                                    'Anlage'         => 'Anlage',
                                                    'Anhang'         => 'Anhang',
                                                    'Präsentation'     => 'Präsentation'
                                                    ),
                                '1'    =>array(
                                                    'Prot_VS'        => 'Protokoll - Entwurf abgestimmt mit Vorsitz',
                                                    'Prot_TN'        => 'Protokoll - Entwurf abgestimmt mit TeilnehmerInnen',
                                                    'Prot'           => 'Protokoll - vollabgestimmter Entwurf ',
                                                    'Prot_final'     => 'Protokoll - endgültige Version',
                                                    'ZIP-Archiv'    => 'ZIP-Archiv'
                                                    )
                            );*/
            
            
            
    'Prot_final'        => 'datei,typ,datname,published',
            
    'Sachstand'            => 'datei,typ,published,up_datname'
        
    ),
        
        
    // Fields
        
    'fields' => array
        (
            
    'typ' => array
            (
                
    'label'                   => &$GLOBALS['TL_LANG']['tl_km_dokumente']['typ'],
                
    'inputType'               => 'radio',
                
    'eval'                     => array('mandatory'=>true'submitOnChange' => true),
                
    'exclude'                 => true,
                
    'options_callback'          => array('tl_km_dokumente','getTypes')    
            ),
            
    'datname' => array
            (
                
    'label'                   => &$GLOBALS['TL_LANG']['tl_km_dokumente']['datname'],
                
    'exclude'                 => true,
                
    'inputType'               => 'text',
                
    'eval'                    => array('maxlength'=>255'tl_class'=>'long')
            ),
            
    'published' => array
            (
                
    'label'                   => &$GLOBALS['TL_LANG']['tl_km_dokumente']['published'],
                
    'default'                  => true,
                
    'exclude'                 => true,
                
    'inputType'               => 'checkbox'
            
    ),
            
    'up_datname' => array
            (
                
    'label'                   => &$GLOBALS['TL_LANG']['tl_km_dokumente']['up_datname'],
                
    'exclude'                 => true,
                
    'inputType'               => 'text',
                
    'eval'                    => array('maxlength'=>255)
            ),
        )
    );


    class 
    tl_km_dokumente extends Backend 

        
    /** 
         * Import the back end user object 
         */ 
        
    public function __construct() 
        { 
            
    parent::__construct(); 
            
    $this->import('BackendUser''User'); 
        } 
     
        
    /** 
         * Ändern des Dateinamens
         */ 
        
    public function aendernDateiname(DataContainer $dc
        {
            
    // hier hat viel Programmtext gestanden. Gelöscht, weil für Problemstellung nicht relevant
            
    return true;
        } 
        

        
    /** 
         * Übergeben der Optionen für Feld "typ" 
         */ 
        
    public function getTypes(DataContainer $dc
        { 
            
    $objResult $this->Database->prepare("SELECT datcont FROM tl_km_tops WHERE id=?")
                                            ->
    execute($dc->activeRecord->pid);

            
    $types ModuleSitzungen::$types[$objResult->datcont];
            
            return 
    $types
        }    
     
        
    /**
         * Listet alle Dokumente eines TOPs
         * @param array
         * @return string
         */
        
    public function listDoks($arrRow)
        {
            
    $datname substr (strrchr ($arrRow['datei'], "/"), 1);
            
            return 
    '<div class="limit_height block"> <p><span style="display:block; float:left; font-weight: bold; width:90px;"  class="top_nr">' $arrRow['typ'] .':</span><span class="top_thema">'$datname '</span></p></div>' "\n";
        }
    }
    ?>
    in der Funktion "getTypes" werden die Options für das Feld "typ" entsprechend des Eltern-Elementes gesetzt und anhand der Auswahl im Feld "typ" werden die Paletten dann angezeigt. Wichtig ist auf jeden Fall auch, dass die default-Palette existiert und das Feld "typ" ein 'submitOnChange' => true erhält.

    Hoffe, Dir hiermit weitergeholfen zu haben.
    Gruß
    Bees2

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
  •