Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?

Contao 4 Lokales Bundle

Mit der folgenden Anleitung wird ein lokales Contao 4 Bundle angelegt, das ein Inhaltselement mit der Ausgabe "Hello World" erzeugt.

Das Bundle wird nicht über Composer installiert, sondern einfach in die Anwendung gelegt. Es wird nicht das AppBundle verwendet, sondern ein eigener Vendor und Bundle Name.

Der Vendor Name für das Beispiel ist "Acme" der Bundle Name "TestBundle". Diese Strings müssen bei einem eigenen Bundle entsprechend ersetzt werden.

Bundle Erstellung

Dateistruktur

  1. Im Root folgenden Ordner anlegen src/Acme/TestBundle.
  2. Dort folgende Ordner- und Dateistruktur anlegen
    • Elements
      • TestElement.php
    • Resources
      • contao
        • config
          • config.php
        • templates
          • elements
            • ce_testelement.html5
        • languages
          • de
            • default.php
    • AcmeTestBundle.php

Code

AcmeTestBundle.php

namespace Acme\TestBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class AcmeTestBundle extends Bundle
{
}

Elements/TestElement.php

namespace Acme\TestBundle\Elements;

class TestElement extends \ContentElement
{
    protected $strTemplate = 'ce_testelement';

    /**
     * Displays a wildcard in the back end.
     *
     * @return string
     */
    public function generate()
    {
        if (TL_MODE == 'BE') {
            $template = new \BackendTemplate('be_wildcard');
            $template->wildcard = '### '.utf8_strtoupper($GLOBALS['TL_LANG']['CTE']['testelement'][0]).' ###';

            return $template->parse();
        }

        return parent::generate();
    }

    /**
     * Generates the content element.
     */
    protected function compile()
    {
        // Do something
    }
}

Resources/contao/config/config.php

$GLOBALS['TL_CTE']['texts']['testelement'] = '\Acme\TestBundle\Elements\TestElement';

Resources/contao/templates/elements/ce_testelement.html5

<?php $this->extend('block_searchable'); ?>

<?php $this->block('content'); ?>

Hello World

<?php $this->endblock(); ?>

Resources/contao/languages/de/default.php

// Content elements
$GLOBALS['TL_LANG']['CTE']['testelement'] = ['Testelement', 'Gibt "Hello World" aus.'];

Bundle im System bekannt machen

Contao Manager Plugin

Im Ordner app die Datei ContaoManagerPlugin.php anlegen mit folgendem Inhalt.

use Contao\CoreBundle\ContaoCoreBundle;
use Contao\ManagerPlugin\Bundle\BundlePluginInterface;
use Contao\ManagerPlugin\Bundle\Parser\ParserInterface;
use Contao\ManagerPlugin\Bundle\Config\BundleConfig;
use Acme\TestBundle\AcmeTestBundle;

class ContaoManagerPlugin implements BundlePluginInterface
{
    /**
     * {@inheritdoc}
     */
    public function getBundles(ParserInterface $parser)
    {
        return [
            BundleConfig::create(AcmeTestBundle::class)->setLoadAfter([ContaoCoreBundle::class]),
        ];
    }
}

Composer

In der Datei composer.json folgendes ergänzen.

"autoload": {
    "classmap": [
        "app/ContaoManagerPlugin.php"
    ],
    "psr-4": {
        "Acme\\TestBundle\\": "src/Acme/TestBundle/"
    }
}

Danach Autoload Konfiguration aktualisieren mit folgendem Befehl.

composer install --optimize-autoloader

Nützliches während der Entwicklung

Cache deaktivieren

Website aufrufen mit /app_dev.php.

Weitere Konfiguration siehe Kommentar von @fritzmg.

Cache leeren

vendor/bin/contao-console cache:clear
@fritzmg

This comment has been minimized.

Copy link

commented Feb 18, 2018

Das:

TemplateLoader::addFiles([
    'ce_testelement' => 'src/Acme/TestBundle/Resources/contao/templates/elements'
]);

ist in Contao 4 nicht notwendig. Generell brauchst du in Contao 4 keine Resources/contao/config/autoload.php für ein Bundle (im Normalfall).

@fritzmg

This comment has been minimized.

Copy link

commented Feb 18, 2018

Nützliches während der Entwicklung

app_dev.php benutzen

Über die app_dev.php wird bspw. der interne Cache von Contao nicht benutzt. DCA Änderungen oder Änderungen in den Übersetzungen sind damit daher sofort sichtbar (wobei es bei den Übersetzungen einen Fallstrick gibt).

Um die app_dev.php auf dem Live Server benutzen zu können, muss zuvor über SSH ein Passwort festgelegt werden:

vendor/bin/contao-console contao:install-web-dir -p

Man kann das auch zuerst lokal machen und dann die generierte .env Datei auf den Server kopieren.

Konfiguration der Entwicklungsumgebung

Wenn man den Symfony Profiler nicht benötigt, kann man diesen auch deaktivieren (oder nur einzelne Features davon und somit die Performance im Entwicklungsmodus verbessern:

app/config/config_dev.yml

# Features des Profilers deaktiveren
web_profiler:
    toolbar: false
    intercept_redirects: false

# Den gesamten Profiler deaktivieren, obige Einstellungen sind dann obsolet
framework:
    profiler: false

# Die Ausgabe der Exception vereinfachen    
services:
    twig.exception_listener:
        class: stdObject

# Image Cache nicht umgehen
contao:
    image:
        bypass_cache: false

Hinweis: Manchmal ist es sinnvoll "Die Ausgabe der Exception vereinfachen" nicht zu verwenden, um genauere Informationen über den Stack Trace der Exception zu erhalten.

Die Konfiguration "Image Cache nicht umgehen" ist seit Contao 4.5 nicht mehr notwendig.

Hat man bereits eine config.yml im Einsatz, muss man die am Anfang inkludieren:

imports:
    - { resource: config.yml }
@stefansl

This comment has been minimized.

Copy link

commented Feb 19, 2018

Sehr schön! Hab's mal bei contao-awesome als PR angelegt. Du hast aber noch einen kleinen Rechtsschreibfehler drin -> Elements/TestElemnent.php

@joergmoldenhauer

This comment has been minimized.

Copy link
Owner Author

commented Feb 19, 2018

@stefansl Danke für den Hinweis. Ist jetzt korrigiert.

@joergmoldenhauer

This comment has been minimized.

Copy link
Owner Author

commented Feb 20, 2018

@fritzmg Es wäre auch möglich, das Contao Manager Plugin nicht unter "app" zu platzieren, sondern im eigenen Bundle Ordner. Also in "src/Acme/TestBundle/ContaoManager/Plugin.php". Was ist hier Best Practice?

@fiedsch

This comment has been minimized.

Copy link

commented Feb 25, 2018

Am häufigsten untegekommen ist mir diese Kosntruktion:

src/ContaoManager/Plugin.php

also ohne Acme/TestBundle/, denn das kann ja bereits im PSR4 Classloader spezifiziert werden:

"psr-4": {
        "Acme\\TestBundle\\": "src/"
    }

Vorteil aus meiner Sicht: Unterhalb von src/ hast Du in allen bundles die gleiche Struktur und musst nicht immer das Acme/TestBundle "mitschleifen".

@joergmoldenhauer

This comment has been minimized.

Copy link
Owner Author

commented Feb 25, 2018

@fiedsch: Ich glaube, du meinst die Struktur, wenn ich ein Bundle anlege, das über Composer installiert wird und dann in "vendor" liegt.

Mein Bundle liegt in "src" des Projekt Roots und hat keine eigene Composer JSON. Deshalb trage ich die Autoload Daten direkt in die composer.json im Root ein.

Meine Frage ist, wie ich es mit dem ContaoManger Plugin mache. Ein ContaoManager Plugin global unter "app" des Projekt Roots, in das ich alle Bundles eintrage, die ich für meine Applikation erstelle, oder für jedes Bundle ein eigenes ContaoManager Plugin im entsprechenden Bundle Ordner.

@is-shining

This comment has been minimized.

Copy link

commented Jan 25, 2019

src/Acme/TestBundle/Elements/TestElement.php sollte doch in src/Acme/TestBundle/Resources/contao/elements/TestElement.php sein, sodass der Ordner src/Acme/TestBundle/Elements wegfällt.

  • Resources
    • contao
      • config
        • config.php
      • elements
        • TestElement.php
      • templates
        • elements
          • ce_testelement.html5
      • languages
        • de
          • default.php
  • AcmeTestBundle.php
@fiedsch

This comment has been minimized.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.