Ergebnis 1 bis 12 von 12

Thema: Wie kann ich den Togglebutton im Mitgliederbereich in meiner Erweiterung abfragen?

  1. #1
    Contao-Nutzer Avatar von Jürgen
    Registriert seit
    24.06.2009.
    Ort
    Mühlheim
    Beiträge
    40

    Standard Wie kann ich den Togglebutton im Mitgliederbereich in meiner Erweiterung abfragen?

    Hallo Community,

    ich arbeite für unsere Orchesterhomepage an einem Besetzungsmodul. Jetzt möchte ich gerne, dass sobald ein Mitglied im Memberbereich inaktiv gestellt wird diese auch im Besetzungsmodul inaktiv wird. Das konnte ich auch in soweit realisieren das ich über ein save_callback beim speichern des entsprechenden Mitglieds dies auch in der Besetzungsliste inaktiv bekomme. Das funktioniert natürlich nicht wenn ich den Togglebutton benutze. Leider habe ich keine Ahnung wie ich dies angehen soll. Gibt es da auch ein callback? Hier den Code den ich in meinem Code nutze.
    PHP-Code:
    $GLOBALS['TL_DCA']['tl_member']['fields']['disable']['save_callback'][] = array('tl_member_orchester''memberAktiv');

    class 
    tl_member_orchester extends Backend {
        public function 
    memberAktiv($varAktiv$dc) {

            if (
    $varAktiv) {
                
    $this->Database->prepare("UPDATE tl_orch_besetzung SET aktiv = '' WHERE musiker=?")->execute($dc->id);
                
    $this->Database->prepare("UPDATE tl_member SET disable = 1 WHERE id=?")->execute($dc->id);
            } else {
                
    $this->Database->prepare("UPDATE tl_orch_besetzung SET aktiv = 1 WHERE musiker=?")->execute($dc->id);
                
    $this->Database->prepare("UPDATE tl_member SET disable = '' WHERE id=?")->execute($dc->id);
            }
        }

    Schon mal vielen Dank
    LG Jürgen

  2. #2
    Contao-Urgestein Avatar von cliffparnitzky
    Registriert seit
    08.10.2010.
    Ort
    Lüneburg
    Beiträge
    2.452
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Moin Jürgen,

    tolle Frage. Hatte irgendwo auch schon mal interessiert.
    Hätte da ne Lösung. Baue die mal in deinem Code ein.

    PHP-Code:
    $GLOBALS['TL_DCA']['tl_member']['fields']['disable']['save_callback'][] = array('tl_member_orchester''memberAktiv');

    // change button_callback for toogle icon to overwritten function
    $GLOBALS['TL_DCA']['tl_member']['list']['operations']['toggle']['button_callback'] = array("tl_member_orchester""toggleIcon");

    class 
    tl_member_orchester extends tl_member
    {
        public function 
    memberAktiv($varAktiv$dc) {
            
    $this->toggleOrchBesetzung (varAktiv$dc->id)
        }
        
        
    /**
         * Overwritten function tl_member.toggleIcon(...)
         */
        
    public function toggleIcon($row$href$label$title$icon$attributes)
        {
            
    // do special actions here, e.g. activate/deactivate member in "Besetzung"
            
    $this->toggleOrchBesetzung ($row['disable'], $row['id'])

            return 
    parent::toggleIcon($row$href$label$title$icon$attributes);
        }
        
        private function 
    toggleOrchBesetzung ($active$memberId) {
            if (
    $active) {
                
    $this->Database->prepare("UPDATE tl_orch_besetzung SET aktiv = 1 WHERE musiker=?")->execute($memberId);
            } else {
                
    $this->Database->prepare("UPDATE tl_orch_besetzung SET aktiv = '' WHERE musiker=?")->execute($memberId);
            }
        }

    Also zuerst den button_callback auf die eigene Methode umhängen und darin dann die Aktivierung/Deaktivierung durchführen. Die Id des Mitglieds steht im Array $row.

    Noch ein paar Anmerkungen:

    (1) Ggf. musst du in toogleIcon eine Rechteprüfung vorziehen (gemäß Original, siehe system/modules/backend/dca/tl_member.php)

    (2) Das Auslagern des Statusumsetzen in eine eigene Funktion macht den Code ein wenig hübscher und besser wartbar.

    (3) Würde beim Callback auch nur das tun, was zusätzlich gemacht werden muss. Das Speichern des Wertes für "disable" passiert ja automatisch (nicht wie in der urspünglichen Version der FunktionmemberAktiv(...)).

    (4) Das Überschreiben und tooglen hab ich getestet. Die Datenbankupdates nicht. Das muss du machen.

    Grüße, Cliff

  3. #3
    Contao-Nutzer Avatar von Jürgen
    Registriert seit
    24.06.2009.
    Ort
    Mühlheim
    Beiträge
    40

    Standard

    Hallo Cliff,

    danke für die Info werd ich doch gleich mal testen.

    Grüße Jürgen

  4. #4
    Contao-Urgestein Avatar von cliffparnitzky
    Registriert seit
    08.10.2010.
    Ort
    Lüneburg
    Beiträge
    2.452
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Bitte, gern geschehen.

    Gib Feedback ob alles klappt.

    Gruß, cliff

  5. #5
    Contao-Nutzer Avatar von Jürgen
    Registriert seit
    24.06.2009.
    Ort
    Mühlheim
    Beiträge
    40

    Standard

    Ich hab deinen Code versucht einzubauen. Leider bekomme ich das mit meinen bescheidenen Programmierkenntnissen nicht wirklich zum laufen. Wahrscheinlich muss ich noch irgendwo irgendwas ergänzen Da muss ich wohl noch ein wenig knobeln.

    LG
    Jürgen

  6. #6
    Contao-Nutzer Avatar von Jürgen
    Registriert seit
    24.06.2009.
    Ort
    Mühlheim
    Beiträge
    40

    Standard

    So ein kleiner Zwischenbericht. Anscheinend muss doch das tl_member-Feld gesetzt werden. Dann jedenfalls klappt es bei mir.
    Einziges Problem das ich nun noch habe ist, dass das Deaktivieren eines Mitglieds über das Toggleicon funktioniert das Aktivieren allerdings nicht. Das klappt nur wenn ich das Mitglied editiere.
    Kannst du dir vorstellen woran das liegen kann?
    PHP-Code:
    <?php

    if (!defined('TL_ROOT'))
        die(
    'You can not access this file directly!');

    /**
     * Fields
     */
    $GLOBALS['TL_DCA']['tl_member']['config']['ondelete_callback'] = array(array('tl_member_orchester''deleteMember'));
    $GLOBALS['TL_DCA']['tl_member']['fields']['disable']['save_callback'][] = array('tl_member_orchester''memberAktiv');
    $GLOBALS['TL_DCA']['tl_member']['list']['operations']['toggle']['button_callback'] = array('tl_member_orchester''toggleIcon');

    class 
    tl_member_orchester extends tl_member 
    {
        public function 
    memberAktiv($varAktiv$dc)
        {
            
    $this->toggleOrchBesetzung ($varAktiv$dc->id);
        }
        
        
    /**
         * Overwritten function tl_member.toggleIcon(...)
         */
        
    public function toggleIcon($row$href$label$title$icon$attributes)
        {
            
    // do special actions here, e.g. activate/deactivate member in "Besetzung"
            
    $this->toggleOrchBesetzung ($row['disable'], $row['id']);
            return 
    parent::toggleIcon($row$href$label$title$icon$attributes);
        }

        private function 
    toggleOrchBesetzung ($aktiv$memberId)
        {
            if (
    $aktiv) {
                
    $this->Database->prepare("UPDATE tl_orch_besetzung SET aktiv = '' WHERE musiker=?")->execute($memberId);
                
    $this->Database->prepare("UPDATE tl_member SET disable = 1 WHERE id=?")->execute($memberId);

            } else {
                
    $this->Database->prepare("UPDATE tl_orch_besetzung SET aktiv = 1 WHERE musiker=?")->execute($memberId);
                
    $this->Database->prepare("UPDATE tl_member SET disable = '' WHERE id=?")->execute($memberId);
            }
        }

        public function 
    deleteMember(DataContainer $dc)
        {
            
    $this->Database->prepare("DELETE FROM tl_orch_besetzung WHERE musiker=?")->execute($dc->activeRecord->id);
        }
    }
    ?>

  7. #7
    Contao-Nutzer Avatar von Jürgen
    Registriert seit
    24.06.2009.
    Ort
    Mühlheim
    Beiträge
    40

    Standard

    Hallo Cliff,

    ich hab's nun doch gefunden. Das Problem wird vom save_callback verursacht. Wenn ich diesen rausnehme, funktioniert es bei mir wie gewünscht. Finde es allerdings sehr komisch, dass das save_callback anscheinend diese Probleme verursacht:-?. Hier mein Code.
    PHP-Code:
    <?php

    if (!defined('TL_ROOT'))
        die(
    'You can not access this file directly!');

    /**
     * Fields
     */
    $GLOBALS['TL_DCA']['tl_member']['config']['ondelete_callback'] = array(array('tl_member_orchester''deleteMember'));
    $GLOBALS['TL_DCA']['tl_member']['list']['operations']['toggle']['button_callback'] = array('tl_member_orchester''toggleIcon');

    class 
    tl_member_orchester extends tl_member
    {
         
        
    /**
         * Overwritten function tl_member.toggleIcon(...)
         */
        
    public function toggleIcon($row$href$label$title$icon$attributes)
        {
            
    // do special actions here, e.g. activate/deactivate member in "Besetzung"
            
    $this->toggleOrchBesetzung ($row['disable'], $row['id']);
            return 
    parent::toggleIcon($row$href$label$title$icon$attributes);
        }

        private function 
    toggleOrchBesetzung ($aktiv$memberId)
        {
            if (
    $aktiv) {
                
    $this->Database->prepare("UPDATE tl_orch_besetzung SET aktiv = '' WHERE musiker=?")->execute($memberId);

            } else {
                
    $this->Database->prepare("UPDATE tl_orch_besetzung SET aktiv = 1 WHERE musiker=?")->execute($memberId);
            }
        }

        public function 
    deleteMember(DataContainer $dc)
        {
            
    $this->Database->prepare("DELETE FROM tl_orch_besetzung WHERE musiker=?")->execute($dc->activeRecord->id);
        }
    }
    ?>
    Danke nochmal für die Hilfe :-)

    LG
    Jürgen

  8. #8
    Contao-Urgestein Avatar von cliffparnitzky
    Registriert seit
    08.10.2010.
    Ort
    Lüneburg
    Beiträge
    2.452
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Moin Jürgen,

    ja da bist ja schon ziemlich weit.

    Im save_callback fehlte noch was (hab ich vollkommen überlesen --> siehe API)

    Und zwar muss der einen Wert zurückgeben ... dann geht das sicher auch alles zusätzliche DB Anweisung ... nehme mal den vorletzten Codeblock:

    PHP-Code:
    <?php

    if (!defined('TL_ROOT'))
        die(
    'You can not access this file directly!');

    /**
     * Fields
     */
    $GLOBALS['TL_DCA']['tl_member']['config']['ondelete_callback'] = array(array('tl_member_orchester''deleteMember'));
    $GLOBALS['TL_DCA']['tl_member']['fields']['disable']['save_callback'][] = array('tl_member_orchester''memberAktiv');
    $GLOBALS['TL_DCA']['tl_member']['list']['operations']['toggle']['button_callback'] = array('tl_member_orchester''toggleIcon');

    class 
    tl_member_orchester extends tl_member 
    {
        public function 
    memberAktiv($varAktiv$dc)
        {
            
    $this->toggleOrchBesetzung ($varAktiv$dc->id);
            return 
    $varAktiv;
        }
        
        
    /**
         * Overwritten function tl_member.toggleIcon(...)
         */
        
    public function toggleIcon($row$href$label$title$icon$attributes)
        {
            
    // do special actions here, e.g. activate/deactivate member in "Besetzung"
            
    $this->toggleOrchBesetzung ($row['disable'], $row['id']);
            return 
    parent::toggleIcon($row$href$label$title$icon$attributes);
        }

        private function 
    toggleOrchBesetzung ($aktiv$memberId)
        {
            if (
    $aktiv) {
                
    $this->Database->prepare("UPDATE tl_orch_besetzung SET aktiv = '' WHERE musiker=?")->execute($memberId);
            } else {
                
    $this->Database->prepare("UPDATE tl_orch_besetzung SET aktiv = 1 WHERE musiker=?")->execute($memberId);
            }
        }

        public function 
    deleteMember(DataContainer $dc)
        {
            
    $this->Database->prepare("DELETE FROM tl_orch_besetzung WHERE musiker=?")->execute($dc->activeRecord->id);
        }
    }
    ?>
    So sollte es gehen, sowohl beim Toggeln als auch beim Editieren.

    Gruß, Cliff

  9. #9
    Contao-Nutzer Avatar von Jürgen
    Registriert seit
    24.06.2009.
    Ort
    Mühlheim
    Beiträge
    40

    Standard

    Hi Cliff,

    jetzt klappt's.

    Merci für die Hilfe.

  10. #10
    Contao-Urgestein Avatar von cliffparnitzky
    Registriert seit
    08.10.2010.
    Ort
    Lüneburg
    Beiträge
    2.452
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Super, freu mich.
    Hab auch noch nie so blind programmiert ;-)

    Grüße, Cliff

  11. #11
    Contao-Nutzer Avatar von sebi
    Registriert seit
    17.03.2012.
    Ort
    Kiel
    Beiträge
    154

    Standard

    Hallo,

    ich versuche gerade etwas sehr ähnliches und bin daher auf dieses Thema gestoßen.
    Und zwar versuche ich, ebenfalls ein mitglied über den toggle-Button zu de/aktivieren und es dann aus einer weiteren Tabelle zu löschen/hinzuzufügen.
    Das klappt aber nicht so richtig mit dem Code von weiter oben... Dabei sollte er doch genau dies tun?
    Habe den Code eigentlich nur an meine Erweiterung von den Begrifflichkeiten angepasst.

    PHP-Code:

    public function al_memberDisable($varAktiv$dc)
        {
            
    $this->toggleAttendance ($varAktiv$dc->id);
            return 
    $varAktiv;
        }
        
        
    /**
         * Overwritten function tl_member.toggleIcon(...)
         */
        
    public function toggleIcon($row$href$label$title$icon$attributes)
        {
            
    // do special actions here, e.g. activate/deactivate member in "Besetzung"
            
    $this->toggleAttendance ($row['disable'], $row['id']);        
            return 
    parent::toggleIcon($row$href$label$title$icon$attributes);
        }

        private function 
    toggleAttendance ($inaktiv$memberId)
        {
            if (
    $inaktiv) {
                
    $this->Database->prepare("UPDATE tl_attendance SET attendance = 1 WHERE m_id=?")->execute($memberId);
            } else {
                
    $this->Database->prepare("UPDATE tl_attendance SET attendance = 0 WHERE m_id=?")->execute($memberId);
            }
        } 
    Die Angaben innerhalb der if-else Bedingung sind bislang nur Ausgaben um zu sehen, was ausgelöst wurde. Die Werte für disable in tl_member werden korrekt gesetzt. Allerdings werden die Änderungen in tl_attendance scheinbar völlig wirr übernommen.

    Aus dem Editieren eines Mitgliedes funktioniert es wunderbar. Nur über den toggler nicht.
    Was mache ich falsch?

    Besten Dank und Gruß,
    Sebi
    Geändert von sebi (19.12.2013 um 17:20 Uhr)

  12. #12
    Contao-Nutzer Avatar von sebi
    Registriert seit
    17.03.2012.
    Ort
    Kiel
    Beiträge
    154

    Standard

    Hallo nochmal,

    das Problem hat mir keine Ruhe gelassen und ich habe es jetzt FAST.

    PHP-Code:
    $GLOBALS['TL_DCA']['tl_member']['list']['operations']['toggle']['button_callback'] = array('tl_attendanceMember''toggleIcon'); 
    PHP-Code:
    public function al_memberDisable($varAktiv$dc)
                {
                    
    $this->toggleAttendance ($varAktiv$dc->id);
                    return 
    $varAktiv;
                }
                
                
    /**
                 * Overwritten function tl_member.toggleIcon(...)
                 */
                
    public function toggleIcon($row$href$label$title$icon$attributes)
                {        
                    
    $this->toggleAttendance ($row['disable'], $row['id']);        
                    return 
    parent::toggleIcon($row$href$label$title$icon$attributes);
                }

                private function 
    toggleAttendance ($inaktiv$memberId)
                {        
                    if (
    $inaktiv
                    {
                        
    $objUser $this->Database->prepare("DELETE FROM tl_attendance WHERE m_id=?")                                  
                                      ->
    execute($memberId);                    
                    } 
                    else 
                    {
                        
                        
    // User-ID holen
                        
    $result Database::getInstance()->prepare('SELECT id FROM tl_member WHERE id=?')->execute($memberId);;
                        
    $members $result->fetchAllAssoc();
                        
                        
    // Events-IDs holen
                        
    $result Database::getInstance()->prepare('SELECT id FROM tl_calendar_events ORDER BY id')->execute();        
                        
    $events $result->fetchAllAssoc();
                        
                        
    // Beides in tl_attendance eintragen
                        
    foreach ($members as $member)
                        {
                            
    $arrNewData['m_id'] = $member['id'];
                            foreach (
    $events as $event)
                            {
                                
    $arrNewData['e_id'] = $event['id'];
                                
    $objData $this->Database->prepare("INSERT IGNORE INTO tl_attendance %s")->set($arrNewData)->execute();
                            }            
                        }
                    }
                    
                } 
    Wenn ich nun über Editieren ein Mitglied Deaktiviere, werden die Einträge in tl_attendance gelöscht. Alles gut!
    Wenn ich über den toggler das Mitglied deaktiviere, wird der disable-Wert richtig gesetzt, aber die Einträge nicht aus der Tabelle tl_attendance gelöscht. Wenn ich nun aber die Mitglieder-Seite im BE (Übersicht) neulade, werden die Einträge korrekt gelöscht.

    Woran liegt das noch?

    Besten Dank,
    Sebi
    Geändert von sebi (20.12.2013 um 12:13 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
  •