Contao-Summit 2026

Ankündigung

Collapse
No announcement yet.

4.13.29: Controller\ContentElement

Collapse
X
 
  • Filter
  • Zeit
  • Show
Clear All
new posts

    4.13.29: Controller\ContentElement

    Hi,
    ich versuche eine vorhandene Extension auf 4.x umzustellen und habe ein Problem mit dem ContentElement:

    PHP-Code:
    src/ContaoManager
    src
    /Controller
    src
    /DependencyInjection
    src
    /Module
    src
    /Resources
    src
    /Resources/config
    src
    /Resources/contao
    src
    /Resources/contao/config
    src
    /Resources/contao/dca
    src
    /Resources/contaolanguages
    src
    /Resources/contao/languages/en
    src
    /Resources/contao/models
    src
    /Resources/contao/templates
    src
    /Resources/public
    src/Resources/public/images 
    src/Controller/VoteController.php
    PHP-Code:
    <?php
    declare(strict_types=1);

    /*
     *     Vote Bundle
     *
     *    @copyright    (c) 2023 - 2023 Florian Daeumling, Germany. All right reserved
     *     @license     https://github.com/toteph42/vote/blob/master/LICENSE
     */

    namespace VoteBundle\Controller\ContentElement;

    use 
    Contao\CoreBundle\Controller\ContentElement\AbstractContentElementController;
    use 
    Contao\ContentModel;
    use 
    Contao\Template;
    use 
    Symfony\Component\HttpFoundation\Request;
    use 
    Symfony\Component\HttpFoundation\Response;

    /**
     *  @ContentElement("vote", category="texts", template="ce_votes")
     */
    class VoteController extends AbstractContentElementController {

        public const 
    TYPE = 'vote';

         protected function 
    getResponse(Template $template, ContentModel $model, Request $request): Response {

             
    $template->text = $model->text;

            return 
    $template->getResponse();
        }

    }

    ?>
    src/Resources/config/services.yaml
    PHP-Code:
    services:
        
    _defaults:
            
    autoconfigure: true
            
        VoteBundle\Controller\ContentElement\VoteController
    :
            
    tags:
                -
                    
    name: contao.content_element
                    category
    : texts 
    src/Resources/contao/dca/
    PHP-Code:
    <?php
    declare(strict_types=1);

    /*
     *     Vote Bundle
     *
     *    @copyright    (c) 2023 - 2023 Florian Daeumling, Germany. All right reserved
     *     @license     https://github.com/toteph42/vote/blob/master/LICENSE
     */

    /**
     * Add a palette to tl_content
     */
    use Contao\Backend;
    use 
    VoteBundle\Controller\ContentElement\VoteController;

    $GLOBALS['TL_DCA']['tl_content']['palettes'][VoteController::TYPE] = '{type_legend},type,headline;{include_legend},'.
            
    'vote,vote_current;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID,space';

    /**
     * Add a field to tl_content
     */
    $GLOBALS['TL_DCA']['tl_content']['fields']['vote'] = [
        
    'label'                   => &$GLOBALS['TL_LANG']['tl_content']['vote'],
        
    'exclude'                 => true,
        
    'inputType'               => 'select',
        
    'options_callback'        => [ 'tl_content_class', 'getVotes' ],
        
    'eval'                    => [ 'includeBlankOption' => true, 'chosen' => true, 'tl_class' => 'w50' ],
        
    'sql'                     => "int(10) unsigned NOT NULL default '0'"
    ];

    $GLOBALS['TL_DCA']['tl_content']['fields']['vote_current'] = [
        
    'label'                   => &$GLOBALS['TL_LANG']['tl_content']['vote_current'],
        
    'exclude'                 => true,
        
    'inputType'               => 'checkbox',
        
    'eval'                    => [ 'tl_class' => 'w50 m12' ],
        
    'sql'                     => "char(1) NOT NULL default ''"
    ];

    /**
     * Provide miscellaneous methods that are used by the data configuration array.
     */
    class tl_content_class extends Backend {

        
    /**
         * Get all votes and return them as array
         * @return array
         */
        
    public function getVotes(): array {

            
    $arr = [];

            
    $obj= $this->Database->execute("SELECT id, title FROM tl_vote ORDER BY title");

            while (
    $obj->next())
                
    $arr[$obj->id] = $obj->title;

            return 
    $arr;
        }

    }

    ?>
    src/Resources/contao/languages/en/default.php
    PHP-Code:
    <?php

    /*
     *     Vote Bundle
     *
     *    @copyright    (c) 2023 - 2023 Florian Daeumling, Germany. All right reserved
     *     @license     https://github.com/toteph42/vote/blob/master/LICENSE
     */

    use VoteBundle\Controller\ContentElement\VoteController;

    // Content elements
    $GLOBALS['TL_LANG']['CTE'][VoteController::TYPE] = [ 'Vote', 'Displays a voting.' ];
    src/Resources/contao/templates/ce_votes.html5
    PHP-Code:
    <div class="<?php echo $this->class; ?><?php if ($this->featured): ?> featured<?php endif; ?> block"<?php echo $this->cssID; ?><?php if ($this->style): ?> style="<?php echo $this->style; ?>"<?php endif; ?>>
    <?php if ($this->headline): ?>

    <<?php echo $this->hl; ?>><?php echo $this->headline; ?></<?php echo $this->hl; ?>>
    <?php endif; ?>

    <?php echo $this->vote; ?>

    </div>
    Code:
    composer install
    php.exe vendor/bin/contao-console debug:fragment
    content_element wird nicht angezeigt. Im Debug Modus kommt dann die Meldung:

    Content element class "" (content element "vote") does not exist

    Kann mir bitte jemand helfen?
    Last edited by toteph42; 04.08.2023, 15:57.
    __________________________________________
    Live long and prosper
    Florian

    Spenden GitHub

    #2
    Zitat von toteph42 Beitrag anzeigen
    Hi,
    ich versuche eine vorhandene Extension auf 4.x umzustellen und habe ein Problem mit dem ContentElement:
    Gibt es einen Link zum Repo, damit man es selbst mal versuchen könnte?
    Jetzt einen Code-Review ohne alle Dateien
    - in einem unbekannten System...
    - könnte dauern
    - kostet viel Zeit
    - müsste man erstmal alles selbst einrichten

    Einfacher wäre es natürlich eine dev-develop bereitzustellen
    Contao-Association unterstützen

    Comment


      #3
      Hallo,
      ja gerne: https://github.com/toteph42/vote

      Mir würde ja auch ein Hinweis auf ein - nach neuesten Regeln gebautes - und BE Elemente nutzende Erweiterung schon weiter helfen.... Da könnte ich ja selbst vergleichen, was dort anders ist. Habe aber bisher kein Bundle gefunden.
      Last edited by toteph42; 05.08.2023, 10:39.
      __________________________________________
      Live long and prosper
      Florian

      Spenden GitHub

      Comment


        #4
        Zitat von toteph42 Beitrag anzeigen
        Hallo,
        ja gerne: https://github.com/toteph42/vote

        Mir würde ja auch ein Hinweis auf ein - nach neuesten Regeln gebautes - und BE Elemente nutzende Erweiterung schon weiter helfen.... Da könnte ich ja selbst vergleichen, was dort anders ist. Habe aber bisher kein Bundle gefunden.
        https://docs.contao.org/dev/framework/content-elements/

        Mit Attributen (Ab PHP 8.0 und Contao 4.13) habe ich schon einige programmiert, schau mal hier:




        Habe deinen Fehler gefunden

        - Dein Bundle heißt "VoteBundle" - Deine DependencyInjection-Datei heißt VotingExtension.php, muss aber VoteExtension.php heißen

        - In deiner DependencyInjection lädst du eine services.yml, deine Datei heißt aber services.yaml.

        - Deine services.yaml sollte so aussehen (/app gibt es nicht):
        Code:
        services:
            _defaults:
                autoconfigure: true
        
            VoteBundle\Controller\ContentElement\VoteController:
                tags:
                    -
                        name: contao.content_element
                        category: texts
        In deinem VoteController kannst du auch das use Statement für die ServiceAnnotation hinzufügen:
        PHP-Code:
        use Contao\CoreBundle\ServiceAnnotation\ContentElement; 
        Last edited by zoglo; 05.08.2023, 11:43.
        Contao-Association unterstützen

        Comment


          #5
          Vielen Dank - ich werde es ausprobieren!
          __________________________________________
          Live long and prosper
          Florian

          Spenden GitHub

          Comment


            #6
            Hallo Zogglo,

            erst einmal habe ich die Erweiterung noch mehr an die neuen Standards angepasst (language und weitere Kleinigkeiten) und dann umbenannt: https://github.com/toteph42/votes

            Im Backend erscheint jetzt nicht wie gewünscht ##VOTES##, sondern nur die Nummer des Datensatzes in der 'tl_votes'. Im Frontend erscheint auch nur die Datensatznummer. Da helfen auch leider die Links auf deine Erweiterungen nicht weiter....

            Würdest du freundlicher Weise nochmal schauen, was ich falsch mache?
            __________________________________________
            Live long and prosper
            Florian

            Spenden GitHub

            Comment


              #7
              Zitat von toteph42 Beitrag anzeigen
              Im Backend erscheint jetzt nicht wie gewünscht ##VOTES##, sondern nur die Nummer des Datensatzes in der 'tl_votes'. Im Frontend erscheint auch nur die Datensatznummer.
              Was genau meinst du damit? Zeige Screenshots.
              » sponsor me via GitHub or Revolut

              Comment


                #8
                Unabhängig von deinem aktuellen Problem: dein contao Ordner ist am falschen Ort. Entweder du nutzt src/Resources/contao/ - oder contao/ im Root, wenn du dem aktuellen Symfony Standard folgst: https://github.com/inspiredminds/con...le.php#L19-L22
                » sponsor me via GitHub or Revolut

                Comment


                  #9
                  Darüberhinaus stimmt die Registrierung deiner Frontendmodule nicht. Du hast den falschen FQCN angegeben: https://github.com/toteph42/votes/bl...ig.php#L34-L35
                  » sponsor me via GitHub or Revolut

                  Comment


                    #10
                    Die schließenden ?> solltest du auch aus PHP Dateien entfernen. Siehe https://www.php-fig.org/psr/psr-2/#22-files
                    » sponsor me via GitHub or Revolut

                    Comment


                      #11
                      Hallo,
                      vielen Dank!

                      Ich habe alle Änderungen vorgenommen. Allerdings funktioniert es immer noch nicht. Im Anhang die Bildschirmfotos der Umfrage, des BE und des FE. Updates sind in Github verfügbar.
                      Angehängte Dateien
                      __________________________________________
                      Live long and prosper
                      Florian

                      Spenden GitHub

                      Comment


                        #12
                        Für die "ContentElement" Annotation hast du das use Statement vergessen: https://github.com/toteph42/votes/bl...roller.php#L20
                        Das kannst du danach löschen: https://github.com/toteph42/votes/bl...ig.php#L38-L41
                        » sponsor me via GitHub or Revolut

                        Comment


                          #13
                          Hallo,
                          habe alles eingebaut und geändert. Funktioniert immer noch nicht. Also alles auf Null setzen und Contao neu installieren. Geht immer noch nicht, aber jetzt bekomme ich die Meldung
                          Code:
                          Class Contao\ManagerPlugin\PluginLoader located in xxx/vendor/contao/manager-plugin/src\Resources\PluginLoader.php does not comply with psr-4 autoloading standard. Skipping.
                          Composer 2.5.8
                          __________________________________________
                          Live long and prosper
                          Florian

                          Spenden GitHub

                          Comment


                            #14
                            Zitat von toteph42 Beitrag anzeigen
                            Hallo Zogglo,

                            erst einmal habe ich die Erweiterung noch mehr an die neuen Standards angepasst (language und weitere Kleinigkeiten) und dann umbenannt: https://github.com/toteph42/votes

                            Im Backend erscheint jetzt nicht wie gewünscht ##VOTES##, sondern nur die Nummer des Datensatzes in der 'tl_votes'. Im Frontend erscheint auch nur die Datensatznummer. Da helfen auch leider die Links auf deine Erweiterungen nicht weiter....

                            Würdest du freundlicher Weise nochmal schauen, was ich falsch mache?

                            Wenn du etwas änderst, dann sind meine Erklärungen nicht mehr zu gebrauchen, da wie Spooky schon erwähnt hat, der FQCN nicht passt + du evtl. einem anderen PSR-Standard folgst.
                            Ein Code-Review kann ich dir hier nicht geben, die Symfony-Dokumentation und das Abschauen von anderen Plugins (Hier wurden schon 4 genannt) wird dir hier weiter helfen.
                            Contao-Association unterstützen

                            Comment


                              #15
                              Schade. Es ist wohl offensichtlich, dass ich kein Contao-/Symphony-Spezialist bin. Ich versuche trotzdem dem - an sich - tollen Projekt etwas beizutragen.
                              1. Es gibt keine Dokumentation, der ich folgen könnte, um die Erweiterung zum laufen zu bringen (zumindest nicht mit meinen Anforderungen).
                              2. Die erwähnten Beispiele implementieren leider nicht die von mir gewünschte Funktion.
                              3. Beim Contao Manager habe ich EXAKT mich an deinen Beispielen gehalten. Funktioniert aber trotzdem nicht.
                              4. Es ist toll, wenn ihr auf Regeln zu FQCN (https://www.php-fig.org/psr/psr-4/) verweist. Die Beschreibung des Standards habe ich ebenfalls versucht genau zu folgen. 'Toteph42\\VoteBundle\\ContaoManager\\Plugin' entspricht exakt dem 'namespace Toteph42\VoteBundle\ContaoManager;'. Was daran falsch ist, kann ich nicht mehr nachvollziehen...
                              5. Ich dachte das Forum wäre für "helping hand", aber wenn dem nicht so ist, dann tut es mir leid, Euch belästigt zu haben.


                              Ich erwarte keinen Code-Review. Ich dachte in meinem kleinen Hirn nur,, es gäbe jemanden, der mich auf Beispiele verweisen kann, anhand dessen ich das Bundle programmieren könnte. Dem scheint ja leider nicht so zu sein. Also alle Zeit, die ich investiert habe für die Tonne. Sehr schade. Ich dachte eigentlich Contao wäre ein tolles CMS. Wenn aber Erweiterungen so kompliziert zu programmieren sind, dann muss ich wohl nach den vielen Jahren,den ich Contao treu war, mich einem anderen CMS zu wenden. Das ist wirklich schade.

                              Einmal davon abgesehen, dass ihr durch die Verkomplizierung immer mehr Leute abschrecken werdet, die einen kleinen Beitrag liefern wollen...

                              Sorry Euch belästigt zu haben...
                              __________________________________________
                              Live long and prosper
                              Florian

                              Spenden GitHub

                              Comment

                              Working...
                              X