Ergebnis 1 bis 4 von 4

Thema: catalog_select_member - ein zusätzlicher Feld-Typ

  1. #1
    Contao-Fan Avatar von Hendriks
    Registriert seit
    28.08.2009.
    Ort
    Stuttgart
    Beiträge
    275

    Frage catalog_select_member - ein zusätzlicher Feld-Typ

    Hallo allerseits,

    versuche gerade den Catalog um einen zusätzlichen Feld-Typ zu erweitern, welcher ein spezielles Select zur Auswahl eines Mitglieds einer bestimmten Gruppe bereitstellt:

    config.php

    PHP-Code:
    $GLOBALS['BE_MOD']['content']['catalog']['fieldTypes']['select_member'] = array
    (
        
    'typeimage'            => 'system/modules/catalog_select_member/html/icon.png',
        
    'fieldDef'             => array
        (
            
    'inputType'        => 'select',
            
    'options_callback' => array('CatalogSelectMember''generateOptions'),
            
    'eval'             => array('chosen'=>true'doNotCopy'=>true'alwaysSave'=>true'includeBlankOption'=> true)
        ),
        
    'sqlDefColumn'         => "int(10) NOT NULL default 0",
        
    'parseValue'           => array(array('CatalogSelectMember''parseValue'))
    );

    $GLOBALS['BE_MOD']['content']['catalog']['typesCatalogFields'][] = 'select_member'
    tl_catalog_fields.php

    PHP-Code:
    $GLOBALS['TL_DCA']['tl_catalog_fields']['fields']['memberGroup'] = array
    (
        
    'label'               => &$GLOBALS['TL_LANG']['tl_catalog_fields']['memberGroup'],
        
    'inputType'           => 'select',
        
    'foreignKey'          => "tl_member_group.name",
        
    'eval'                => array
        (
            
    'submitOnChange'      => false,
            
    'includeBlankOption'  => true,
            
    'chosen'              => true,
            
    'tl_class'            => 'w50'
        
    )
    ); 
    CatalogSelectMember.php

    PHP-Code:
    class CatalogSelectMember extends Backend
    {
        public function 
    __construct()
        {
            
    parent::__construct();
        }

        public function 
    generateOptions()
        {
            
    $arrOptions = array();

            
    $objOptions $this->Database->execute("SELECT id, firstname, lastname, email, groups FROM tl_member ORDER BY lastname, firstname, email");

            while (
    $objOptions->next())
            {
                
    $groups unserialize($objOptions->groups);

                if (
    in_array({{memberGroup}}, $groups))
                {
                    
    $arrOptions[$objOptions->id] = $objOptions->lastname .', '$objOptions->firstname .', '$objOptions->email;
                }
            }

            return 
    $arrOptions;
        }

    Dabei frage ich mich jetzt gerade, wie ich in meiner options_callback-Funktion generateOptions() nun den memberGroup-Wert (oben in geschweiften Klammern) reinbekomme, so dass die Auswahl-Optionen nach der festgelegten Gruppe gefiltert werden?
    Geändert von Hendriks (13.09.2013 um 11:25 Uhr)

  2. #2
    Contao-Urgestein Avatar von Tim G
    Registriert seit
    13.02.2010.
    Ort
    Lübeck
    Beiträge
    2.210
    User beschenken
    Wunschliste

    Standard

    Einfach den aktuelles Datensatz auslesen und entsprechend der selektierten Benutzergruppe (memberGroup Feld) filtern. Viele Erweiterungen haben ähnliche Funktionen. Da wirst Du bestimmt fündig.

    Das geht über mehrere Wege. Das DataContainer object, dass eigentlich in deiner options_callback Methode übergeben wird (hast Du hier nicht übernommen), oder einfach die aktuelle ID aus dem GET Parameter nehmen und via Datenbankabfrage den Feldwert holen. Das memberGroup Feld sollte ein onSubmitChange haben, sonst sieht man Filterungen erst nach dem neuladen / speichern.

    public function generateOptions(DataContainer $dc)
    {
    echo $dc->id;
    }

    Viel Erfolg
    http://www.tim-gatzky.de ˙ auch schon wieder 2 Jahre alt - wie die Zeit vergeht... muss mal umbauen.

  3. #3
    Contao-Fan Avatar von Hendriks
    Registriert seit
    28.08.2009.
    Ort
    Stuttgart
    Beiträge
    275

    Standard

    Hallo Tim, danke mal wieder für Deine praktischen Tipps!

    Habe ich das Prinzip richtig verstanden, dass hier der aktive Datensatz im DCA derjenige Datensatz ist, von dem aus der callback kommt. Bei mir müsste dass demnach (wie gewünscht) die Tabelle tl_catalog_fields sein... Offenbar reicht es aber nicht, wenn ich dann in der generateOptions-Funktion schreibe:

    $dc->activeRecord->memberGroup

    Oder was wird hier unter "aktiver Datensatz" verstanden? Aktiv zur Laufzeit? Oder wie baut sich dieser (vom Prinzip her dann natürlich super praktische) Array auf?

  4. #4
    Contao-Urgestein Avatar von Tim G
    Registriert seit
    13.02.2010.
    Ort
    Lübeck
    Beiträge
    2.210
    User beschenken
    Wunschliste

    Standard

    Da steht alles. Und Du hast es richtig verstanden.
    Falls das activeRecord Object nicht erstellt wird, oder noch nicht. Kannst Du Dir natürlich ein eigenes erstellen. Das ist nicht mehr als der aktuelle Datensatz als Database_Result Objekt.

    $objActiveRecord = $this->Database->execute("SELECT * FROM myTable WHERE id=".$dc->id);

    echo $objActiveRecord->myField;
    http://www.tim-gatzky.de ˙ auch schon wieder 2 Jahre alt - wie die Zeit vergeht... muss mal umbauen.

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
  •