Ergebnis 1 bis 3 von 3

Thema: mod_comments um ein Feld erweitern - extend-Klasse wird ignoriert

  1. #1
    Contao-Nutzer
    Registriert seit
    06.04.2011.
    Beiträge
    4

    Standard mod_comments um ein Feld erweitern - extend-Klasse wird ignoriert

    Hi zusammen,

    ich stehe gerade etwas auf dem Schlauch, und hoffe stark, dass ihr mir helfen könnt. Ich bin wahrlich kein Profi in Sachen PHP, deshalb vermute ich einen offensichtlichen Fehler als Ursache.

    Kernpunkt meines Anliegens ist, das Kommentar-Formular um ein zusätzliches Feld zu erweitern. Das Modul soll als eine Art Pinnwand in einem Intranet genutzt werden. Daher brauche ich - für den Start - ein zusätzliches Feld "Betreff". Felder wie "Email" und "Website" werden ausgeblendet bzw. als hidden fields übergeben. Die angemeldeten Mitglieder sollen also "Betreff" und "Nachricht" ausfüllen können, und die Nachricht wird an die Wand geheftet.

    Dazu habe ich mir unter contao/dca zunächst einen File "tl_comments.php" anlegt:

    PHP-Code:
    <?php

    $GLOBALS
    ['TL_DCA']['tl_comments']['palettes']['default'] = str_replace
    (
        
    'comment',
        
    'cf_subject, comment',
        
    $GLOBALS['TL_DCA']['tl_comments']['palettes']['default']
    );

    $GLOBALS['TL_DCA']['tl_comments']['fields']['cf_subject'] = array
    (
        
    'label'     => &$GLOBALS['TL_LANG']['tl_comments']['cf_subject'],
        
    'exclude'                 => true,
        
    'search'                  => true,
        
    'inputType' => 'text',
        
    'eval'      => array('maxlength'=>64),
        
    'sql'       => "varchar(64) NOT NULL default ''"
    );
    Unter contao/languages/de entsprechend eine default.php:

    PHP-Code:
    <?php
    $GLOBALS
    ['TL_LANG']['tl_comments']['cf_subject'] = [
        
    'Betreff',
        
    '...'
    ];
    Das funktioniert soweit auch alles wunderbar. Die Palette im BE sieht gut aus; alles ist da, wo es sein soll. Allerdings sollen die Angaben ja direkt im FE über das mod_comments-Formular erfasst werden (und dann bei Bedarf im Backend von einem Admin editierbar sein).

    Folgendes liegt unter src/CommentsExtended als "CommentsExtended.php":

    PHP-Code:
    <?php

    namespace App\CommentsExtended;

    class 
    CommentsExtended extends \Comments
    {

        protected function 
    renderCommentForm(FrontendTemplate $objTemplate, \stdClass $objConfig$strSource$intParent$varNotifies)
        {
            
    $arrFields = array
            (
                
    'name' => array
                (
                    
    'name'      => 'name',
                    
    'label'     => $GLOBALS['TL_LANG']['MSC']['com_name'],
                    
    'value'     => trim($this->User->firstname ' ' $this->User->lastname),
                    
    'inputType' => 'text',
                    
    'eval'      => array('mandatory'=>true'maxlength'=>64)
                ),
                
    'email' => array
                (
                    
    'name'      => 'email',
                    
    'label'     => $GLOBALS['TL_LANG']['MSC']['com_email'],
                    
    'value'     => $this->User->email,
                    
    'inputType' => 'text',
                    
    'eval'      => array('rgxp'=>'email''mandatory'=>true'maxlength'=>255'decodeEntities'=>true)
                ),
                
    'website' => array
                (
                    
    'name'      => 'website',
                    
    'label'     => $GLOBALS['TL_LANG']['MSC']['com_website'],
                    
    'inputType' => 'text',
                    
    'eval'      => array('rgxp'=>'url''maxlength'=>128'decodeEntities'=>true)
                ),
                
    'cf_subject' => array
                (
                    
    'name' => 'cf_subject',
                    
    'label' => &$GLOBALS['TL_LANG']['tl_comments']['cf_subject'],
                    
    'inputType' => 'text',
                    
    'eval' => array('maxlength' => 64)
                )
            );

            
    $arrSet = array
            (
                
    'tstamp'    => $time,
                
    'source'    => $strSource,
                
    'parent'    => $intParent,
                
    'name'      => $arrWidgets['name']->value,
                
    'email'     => $arrWidgets['email']->value,
                
    'website'   => $strWebsite,
                
    'member'    => $intMember,
                
    'comment'   => $this->convertLineFeeds($strComment),
                
    'ip'        => Environment::get('ip'),
                
    'date'      => $time,
                
    'published' => ($objConfig->moderate '' 1),
                
    'cf_subject' => $arrWidgets['cf_subject']->value
            
    );

        }
    }
    Wenn ich den Class Loader aktualisiere, sehe ich in der Console, dass die neue Klasse geladen wird.

    Lasse ich mir aber die Variablen im FE ausgeben, kommt das neue Feld nicht an:

    PHP-Code:
    ...
     
    "fields" => array:[
        
    "name" => Contao\FormTextField {#670}
        
    "email" => Contao\FormTextField {#648}
        
    "website" => Contao\FormTextField {#656}
        
    "comment" => Contao\FormTextArea {#672}
        
    "notify" => Contao\FormCheckBox {#673}
      
    ]
    ... 
    Erweitere ich $arrFields direkt in vendor/comments-bundle, stehen die neuen Felder über $this->showTemplateVars() wie gewünscht zur Verfügung.

    Irgendwie wird die angepasste renderCommentForm() also ignoriert.

    Hat jemand einen Tipp? Ich komme nach zig Ansätzen und ausgiebigem Querlesen echt nicht mehr weiter. Besten Dank vorab!
    Geändert von AshTheUgly (12.09.2020 um 09:59 Uhr)

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

    Standard

    Hier habe ich mal beschrieben, wie man die Comments Klasse "ersetzen" kann: https://github.com/contao/core-bundl...ment-387412382

    Evt. funktioniert es aber auch, wenn du folgendes machst:
    PHP-Code:
    <?php

    // src/CommentsExtended.php
    namespace App\CommentsExtended;

    use 
    Contao\Comments;

    class 
    CommentsExtended extends Comments
    {
        
    // …
    }

    class_alias(CommentsExtended::class, 'Comments');
    Das überschreibt evt. den Root Namespace Alias der ursprünglichen Comments Klasse und bei jedem $this->import('Comments') Aufruf innerhalb von Contao sollte dann deine Klasse benutzt werden. Ist halt nicht besonders sauber.

    Insgesamt ist es halt so, dass die Comments Klasse von Contao sehr starr ist.

  3. #3
    Contao-Nutzer
    Registriert seit
    06.04.2011.
    Beiträge
    4

    Standard

    Hi Spooky,

    erst mal besten Dank für den schnellen Support.

    Ich habe die src/CommentsExtended/CommentsExtended.php wie vorgeschlagen angepasst:

    PHP-Code:
    <?php

    // src/CommentsExtended.php
    namespace App\CommentsExtended;

    use 
    Contao\Comments;

    class 
    CommentsExtended extends Comments {

        protected function 
    renderCommentForm(FrontendTemplate $objTemplate, \stdClass $objConfig$strSource$intParent$varNotifies)
        {
            
    $arrFields = array
            (
                
    'name' => array
                (
                    
    'name'      => 'name',
                    
    'label'     => $GLOBALS['TL_LANG']['MSC']['com_name'],
                    
    'value'     => trim($this->User->firstname ' ' $this->User->lastname),
                    
    'inputType' => 'text',
                    
    'eval'      => array('mandatory'=>true'maxlength'=>64)
                ),
                
    'email' => array
                (
                    
    'name'      => 'email',
                    
    'label'     => $GLOBALS['TL_LANG']['MSC']['com_email'],
                    
    'value'     => $this->User->email,
                    
    'inputType' => 'text',
                    
    'eval'      => array('rgxp'=>'email''mandatory'=>true'maxlength'=>255'decodeEntities'=>true)
                ),
                
    'website' => array
                (
                    
    'name'      => 'website',
                    
    'label'     => $GLOBALS['TL_LANG']['MSC']['com_website'],
                    
    'inputType' => 'text',
                    
    'eval'      => array('rgxp'=>'url''maxlength'=>128'decodeEntities'=>true)
                ),
                
    'cf_subject' => array
                (
                    
    'name' => 'cf_subject',
                    
    'label' => &$GLOBALS['TL_LANG']['tl_comments']['cf_subject'],
                    
    'inputType' => 'text',
                    
    'eval' => array('maxlength' => 64)
                )
            );

            
    $arrSet = array
            (
                
    'tstamp'    => $time,
                
    'source'    => $strSource,
                
    'parent'    => $intParent,
                
    'name'      => $arrWidgets['name']->value,
                
    'email'     => $arrWidgets['email']->value,
                
    'website'   => $strWebsite,
                
    'member'    => $intMember,
                
    'comment'   => $this->convertLineFeeds($strComment),
                
    'ip'        => Environment::get('ip'),
                
    'date'      => $time,
                
    'published' => ($objConfig->moderate '' 1),
                
    'cf_subject' => $arrWidgets['cf_subject']->value
            
    );

        }
    }

    class_alias(CommentsExtended::class, 'Comments');
    Das läuft soweit - die Klasse wird geladen -, allerdings kommt das Feld cf_subject immer noch nicht im FE an:

    PHP-Code:
      "fields" => array:[
        
    "name" => Contao\FormTextField {#670}
        
    "email" => Contao\FormTextField {#648}
        
    "website" => Contao\FormTextField {#656}
        
    "comment" => Contao\FormTextArea {#672}
        
    "notify" => Contao\FormCheckBox {#673}
      

    Ich habe zusätzlich versucht, den Import $this->import('Comments') manuell per Template-Include anzustoßen, doch das bleibt sich gleich.

    Deinen Github-Post habe ich mir auch angesehen, doch da fehlt mir das Fachwissen, um gänzlich durchzusteigen. Könntest du mir einmal aufdröseln, was ich alternativ zum o. g. Ansatz machen kann? Vielleicht gibt es ja auch ganz andere Ideen oder Ansätze zu diesem Szenario ...

    Danke!

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
  •