Ergebnis 1 bis 8 von 8

Thema: getContentElement HOOK

  1. #1
    Contao-Fan Avatar von dhe
    Registriert seit
    25.10.2010.
    Ort
    Esslingen a.N.
    Beiträge
    657

    Standard getContentElement HOOK

    Hallo Community,
    ich möchte per getContentElement HOOK die CSS Klassen eines Inhaltselement beeinflussen. Also das man per Checkbox die CSS Klassen erweitern kann.
    Meine config.php sieht so aus:
    PHP-Code:
    $GLOBALS['TL_HOOKS']['getContentElement'][]        = array('npgridtools''gridSettings'); 
    Die entsprechende PHP Datei so:
    PHP-Code:
    class npgridtools extends Controller {
        
        private function 
    tplObj($objRow) {
            
    $strClass = \ContentElement::findClass($objRow->type);    
            return new 
    $strClass($objRow);
        }

        public function 
    gridSettings($objRow$strBuffer) {
            if(
    TL_MODE == 'BE') return $strBuffer;    
            
            
    $objElement $this->tplObj($objRow);
            
            
    $classes $objElement->cssID;
                
            if(
    $objElement->hlSettings$classes[1] .= ' '.$objElement->hlSettings;
            if(
    $objElement->toClear$classes[1] .= ' clear';
            if(
    $objElement->noMaxWidth$classes[1] .= ' noMax';
            if(
    $objElement->hrColor$classes[1] .= ' '.$objElement->hrColor;
            if(
    $objElement->viewMode$classes[1] .= ' '.$objElement->viewMode;
                    
            
    $classes[1] = trim($classes[1]);
            
    $objElement->cssID $classes;    
            
            
    $strBuffer $objElement->generate();        
            
            return 
    $strBuffer;
        }

    Das klappt soweit auch alles, allerdings funktioniert dann die Newsletterregistrierung nicht mehr. Wenn ich auf den Bestätigungslink in der E-Mail klicke, erhalte ich den Fehler "Der Aktivierungslink ist ungültig oder veraltet."

    Wenn ich meiner Erweiterung das "$strBuffer = $objElement->generate(); " entferne, funktioniert alles.

    Irgendwie wird durch die generate() Funktion der Token gelöscht oder so ähnlich.

    Hat jemand einen Tipp?

    grüße

  2. #2
    Contao-Fan Avatar von dhe
    Registriert seit
    25.10.2010.
    Ort
    Esslingen a.N.
    Beiträge
    657

    Standard

    Hab glaub die Lösung gefunden, wobei ich nicht verstehe, warum es jetzt geht

    Ich habe
    PHP-Code:
    class npgridtools extends Controller {...} 
    durch
    PHP-Code:
    class npgridtools extends Frontend {...} 
    ersetzt.

    Jetzt geht es...

  3. #3
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.141
    Partner-ID
    10107

    Standard

    Hm, interessant. Vermutlich funktioniert es auch, wenn du dir deinen eigenen Constructor definierst und in diesem Constructor den Parent Constructor nicht aufrufst.

  4. #4
    Contao-Fan Avatar von dhe
    Registriert seit
    25.10.2010.
    Ort
    Esslingen a.N.
    Beiträge
    657

    Standard

    Ok, Kommando zurück. Funktioniert doch nicht.
    PHP-Code:
    $objElement->generate(); 
    wird nicht ausgeführt.

    Leider bin ich noch nicht so tief in der Materie von OOP drin. Was genau meinst du mit eigenem Konstruktor? einfach
    PHP-Code:
    public function __construct(){ } 
    in meine Klasse einfügen?

    Grüße
    OK, ich bin einfach zu doof, den richtigen $strBuffer zurückgeben.
    Funktioniert alles wunderbar...

    *brauchemehrkaffee*
    Geändert von dhe (07.10.2015 um 09:18 Uhr)

  5. #5
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.141
    Partner-ID
    10107

    Standard

    Yep, aber wer weiß ob es auch überhaupt mit einem leeren Constructor funktioniert.

  6. #6
    Contao-Fan Avatar von Zero
    Registriert seit
    25.05.2010.
    Ort
    Korntal
    Beiträge
    520
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von dhe Beitrag anzeigen
    Hallo Community,
    ich möchte per getContentElement HOOK die CSS Klassen eines Inhaltselement beeinflussen. Also das man per Checkbox die CSS Klassen erweitern kann.
    Meine config.php sieht so aus:
    PHP-Code:
    $GLOBALS['TL_HOOKS']['getContentElement'][]        = array('npgridtools''gridSettings'); 
    Die entsprechende PHP Datei so:
    PHP-Code:
    class npgridtools extends Controller {
        
        private function 
    tplObj($objRow) {
            
    $strClass = \ContentElement::findClass($objRow->type);    
            return new 
    $strClass($objRow);
        }

        public function 
    gridSettings($objRow$strBuffer) {
            if(
    TL_MODE == 'BE') return $strBuffer;    
            
            
    $objElement $this->tplObj($objRow);
            
            
    $classes $objElement->cssID;
                
            if(
    $objElement->hlSettings$classes[1] .= ' '.$objElement->hlSettings;
            if(
    $objElement->toClear$classes[1] .= ' clear';
            if(
    $objElement->noMaxWidth$classes[1] .= ' noMax';
            if(
    $objElement->hrColor$classes[1] .= ' '.$objElement->hrColor;
            if(
    $objElement->viewMode$classes[1] .= ' '.$objElement->viewMode;
                    
            
    $classes[1] = trim($classes[1]);
            
    $objElement->cssID $classes;    
            
            
    $strBuffer $objElement->generate();        
            
            return 
    $strBuffer;
        }

    Das klappt soweit auch alles, allerdings funktioniert dann die Newsletterregistrierung nicht mehr. Wenn ich auf den Bestätigungslink in der E-Mail klicke, erhalte ich den Fehler "Der Aktivierungslink ist ungültig oder veraltet."

    Wenn ich meiner Erweiterung das "$strBuffer = $objElement->generate(); " entferne, funktioniert alles.

    Irgendwie wird durch die generate() Funktion der Token gelöscht oder so ähnlich.

    Hat jemand einen Tipp?

    grüße
    Das ist deine Klasse? Dann lass das "extends Controller" oder "extends Frontend" komplett weg. Das brauchst du nicht.

    In erster Linie muss deine Hook Klasse gar nichts erweitern mit extend. Du kannst, wenn du Methoden vom Parent aufrufen willst, was aber soweit ich das sehe nicht der Fall ist.
    Mein Blog -> brothers-project.de

  7. #7
    Contao-Fan Avatar von dhe
    Registriert seit
    25.10.2010.
    Ort
    Esslingen a.N.
    Beiträge
    657

    Standard

    Hallo Freunde,
    ich habe doch weiterhin ein Problem mit meinem Script. Es blockiert doch weiterhin die korrekte Anzeige des Newsletterregistrierung.
    Es scheint mir, dass in der SESSION der Confirmation Status nicht korrekt übergeben. bzw. gelöscht wird.
    Der Abonnent wird korrekt aktiviert, wenn ich auf den Link in der Mail klicke, jedoch wird weiterhin der Fehler angezeigt.
    Deaktiviere ich mein Script, funktioniert alles tadellos. D.h. ich hab' einen Fehler darin, habe aber keine Ahnung, was falsch ist.
    Hat jemand einen Tipp?

    PHP-Code:
    <?php if (!defined('TL_ROOT')) die('You cannot access this file directly!');

    class 
    npgrids  {
        

        private function 
    tplObj($objRow) {
            
    $strClass = \ContentElement::findClass($objRow->type);
            return new 
    $strClass($objRow);
        }

        public function 
    gridSettings($objRow$strBuffer) {
            
            if(
    TL_MODE == 'BE') return $strBuffer;
            
            
    // GET CTE
            
    $objElement $this->tplObj($objRow);

            
    $classes $objElement->cssID;
            
            
    // SET CLASSES TO CT
            
    if($objElement->hlSettings$classes[1] .= ' '.$objElement->hlSettings;
            if(
    $objElement->toClear$classes[1] .= ' clear';
            if(
    $objElement->noMaxWidth$classes[1] .= ' noMax';
            if(
    $objElement->halfTopMargin$classes[1] .= ' halfTop';
            if(
    $objElement->hrColor$classes[1] .= ' '.$objElement->hrColor;
            if(
    $objElement->viewMode$classes[1] .= ' '.$objElement->viewMode;
            
            
    // REMOVE EMPTY SPACES
            
    $classes[1] = trim($classes[1]);

            
    // SET NEW ARRAY
            
    $objElement->cssID $classes;

            
    // GENERATE NEW HTML
            
    $strBufferNew $objElement->generate();
            return 
    $strBufferNew;
        }
        
    }

    ?>

  8. #8
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.141
    Partner-ID
    10107

    Standard

    Ich glaube das Problem ist, dass du in deinem Hook das Element nochmal generierst. Und das noch dazu für jedes Inhaltselement - verschlechtert auch die Performance der Website. Probiere es mal so:
    PHP-Code:
    <?php

    class npgrids
    {
        public function 
    gridSettings$objRow$strBuffer, \ContentElement $objElement )
        {
            if(
    TL_MODE == 'BE'
                return 
    $strBuffer;

            
    $classes '';
                    
            if(
    $objElement->hlSettings$classes .= ' '.$objElement->hlSettings;
            if(
    $objElement->toClear$classes .= ' clear';
            if(
    $objElement->noMaxWidth$classes .= ' noMax';
            if(
    $objElement->halfTopMargin$classes .= ' halfTop';
            if(
    $objElement->hrColor$classes .= ' '.$objElement->hrColor;
            if(
    $objElement->viewMode$classes .= ' '.$objElement->viewMode;

            if( 
    $classes )
                
    $strBuffer str_replace'class="ce_' $objElement->type'class="ce_' $objElement->type $classes$strBuffer );

            return 
    $strBufferNew;
        }
    }
    Dieses string replacement ist ein wenig problematisch, besser wäre es wohl per regex das erste 'class="' zu finden und zu ersetzen.

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
  •