catalog_select_member - ein zusätzlicher Feld-Typ

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • Hendriks
    Contao-Fan
    • 28.08.2009
    • 275

    #1

    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?
    Zuletzt geändert von Hendriks; 13.09.2013, 12:25.
  • Tim G
    Contao-Urgestein
    • 13.02.2010
    • 2212

    #2
    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.

    Kommentar

    • Hendriks
      Contao-Fan
      • 28.08.2009
      • 275

      #3
      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?

      Kommentar

      • Tim G
        Contao-Urgestein
        • 13.02.2010
        • 2212

        #4
        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.

        Kommentar

        Lädt...