CONTAO 3 ERWEITERUNG NACH CONTAO 4 BUNDLE · 1 . 1 CONTAO 3 ERWEITERUNG NACH CONTAO 4 BUNDLE C om p...
Transcript of CONTAO 3 ERWEITERUNG NACH CONTAO 4 BUNDLE · 1 . 1 CONTAO 3 ERWEITERUNG NACH CONTAO 4 BUNDLE C om p...
1 . 1
CONTAO 3 ERWEITERUNG NACHCONTAO 4 BUNDLE
Composer -> Packagist -> Contao ManagerGlen Langer
Contao Stammtisch Berlin (09.07.2017)
Version: 1.2.0 vom 23.08.2017
Slides erstellt mit der Erweiterung "contao-reveal-js-theme" von BugBuster
2 . 1
QuellenOnline Doku von Contao / Quellcode ContaoErfahrung durch Ausprobieren
Lizenz
Dieses Werk ist lizenziert unter einer
.
Creative CommonsNamensnennung - Weitergabe unter gleichen Bedingungen 3.0
Deutschland Lizenz
4 . 1
WORUM GEHT ES?Composer Konzept, Grundlage für:
Contao 3 Erweiterung kompatibel für Contao 4 (nur kurz und warum wir das nicht wollen sollen)
Contao 3 Erweiterung nach Contao 4 Bundle
Praxis, BackupDB Bundle
5 . 1
COMPOSER KONZEPTNamespace: Vendor\ErweiterungsnameAutoloadingAbhängigkeitenVersion (Tag, Semantische Versionierung) => Branch VersionInstallationsziel der Erweiterung durch Composer
5 . 2
Semantische VersionierungBeginnend mit Contao 4 wird die verwendet. Das ist auch bei Erweiterungen sehr wichtig.
semantische Versionierung
4 . 0 . 0 - RC1 Major Minor Bugfix Pre-Release
RegelnBug�x-Releases dürfen nur rückwärts kompatible FixesenthaltenMinor-Releases können rückwärts kompatible neue FeaturesenthaltenJede inkompatible API-Änderung muss als neue Major-Versionveröffentlicht werden
5 . 3
Semantische VersionierungAPI-Änderungen
Nicht jede rückwärts inkompatible Änderung ist auch eine API-Änderung!
APIAls "public" oder "protected" deklarierte Methoden in PHP-KlassenAusgenommen Methoden, die als @internal gekennzeichnetsind
Templates sind explizit nicht Teil der API und können sich daherauch in Minor- oder Bug�x-Versionen ändern, selbst wenndadurch Stylesheet-Anpassungen notwendig werden.
6 . 1
GITHUB NAME, PACKAGIST NAMEDie Account Namen und Namen einer Erweiterung bei
GitHub, Packagist und in der composer.json
6 . 2
Beispiel für easyupdate3GitHub Account: BugBuster1701GitHub URL: .../BugBuster1701/contao-easyupdate3Packagist Account: BugBuster , verbunden mit dem GitHubAccount, dort freigegebencomposer.json Eintrag "name": bugbuster/easyupdate3ergibt: composer require bugbuster/easyupdate3
Achtung: keine Großbuchstaben im composer.json Eintrag"name" verwenden, das akzeptiert Packagist.org nicht!
7 . 1
TYPE EINER ERWEITERUNGcontao-modulecontao-bundlecontao-componentsymfony-bundle
composer.json Auszug der eigenen Erweiterung:
{ "name":"bugbuster/contao-statistic_group-bundle", "type":"contao-bundle", ...
8 . 1
VERZEICHNISSTRUKTURContao 3
src/ assets/ config/ classes/ dca/ languages/ de/ en/ models/ modules/ templates/ tests/ composer.json README.md CHANGELOG.md .gitignore
Hier würde der Inhalt von "src" installiert werden nachsystem/modules/erweiterung/
8 . 2
Contao 4 Standard-Editionsrc/ Resources/ contao/ <-- Bisherige Contao-Dateien config/ classes/ dca/ languages/ de/ en/ models/ modules/ templates/ public/ <-- Öffentliche Ressourcen DemoBundle.php <-- Bundle-Klasse für manuelle Registrierung tests/ composer.json README.md CHANGELOG.md .gitignore
Hier würde "src" installiert werden nachvendor/DeinVendorName/Erweiterungsname/src/
8 . 3
Contao 4 Managed-Editionsrc/ ContaoManager/ Plugin.php <-- Contao Manager Plugin für automatische Registrierung Resources/ contao/ config/ classes/ dca/ languages/ de/ en/ models/ modules/ templates/ public/ DemoBundle.php tests/ composer.json <-- zusätzlicher Eintrag README.md CHANGELOG.md .gitignore
Hier würde "src" installiert werden nachvendor/DeinVendorName/Erweiterungsname/src/
8 . 4
Contao 4 Managed-Edition ++src/ ContaoManager/ Plugin.php Controller/ <-- Routing Controller Resources/ config/ routing.yml <-- Routing Definition contao/ config/ classes/ dca/ languages/ de/ en/ models/ modules/ templates/ public/ DemoBundle.php tests/ composer.json README.md CHANGELOG.md .gitignore
Hier würde "src" installiert werden nachvendor/DeinVendorName/Erweiterungsname/src/
9 . 1
ERWEITERUNG FÜR CONTAO 3 UND 4composer.json deiner Erweiterung nur Contao 3, Auszug
"require": { "contao/core": ">=3.2", "contao-community-alliance/composer-plugin": "*" },
wird nun zu:
9 . 2
ERWEITERUNG FÜR CONTAO 3 UND 4composer.json deiner Erweiterung Contao 3 und 4, Auszug "require": { "contao/core-bundle":"~3.2 || ~4.2", "contao-community-alliance/composer-plugin":"~2.4 || ~3.0" },
10 . 1
ERWEITERUNG NUR FÜR CONTAO 4composer.json deiner Erweiterung nur Contao 4, Auszug
"require": { "php": ">=5.6.0", "contao/core-bundle":"~4.4" },
PHP ab 5.6.0, Contao ab 4.4.0 und <5.0.0. Da "composer-plugin"hier nicht mehr angegeben, vom type: contao-bundle, auch wenn
das hier nicht steht.
10 . 2
Contao 3 Erweiterung als Contao 4 Bundleumbauen
Änderungen außer an composer.json
verschieben der Dateien in neue DateistrukturAnpassungen von wenigen vorhandene DateienNeue Klasse je für Standard und Managed Edition
11 . 1
ANPASSUNG AUTOLOAD(ER)autoload.php: löschen, Ersatz: composer.jsonautoload.ini: löschen, Ersatz: Contao Manager Plugin bzw. Handarbeit bei Standard Edition
11 . 2
autoload.php Ersatz für KlassenAuszug aus composer.json der eigenen Erweiterung
"autoload": { "psr-4": { "Vendor\\DemoBundle\\": "src/" }, "classmap": [ "src/Resources/contao/" ], "exclude-from-classmap": [ "src/Resources/contao/config/", "src/Resources/contao/dca/", "src/Resources/contao/languages/", "src/Resources/contao/templates/" ] },
Hier: "psr-4" für die neuen Symfony Klassen, "classmap" für diealten Contao Klassen.
11 . 3
autoload.ini ErsatzAngabe der Ladereihenfolge über requires in der autoload.ini,"default" war:requires[] = "core"
Standard Edition über Eintragungen in der AppKernel.php.Managed Edition über Manager Plugin, mittels De�nition(en).
Auszug daraus, die Erläuterung zum Plugin selbst folgt:... ->setLoadAfter(['Contao\CoreBundle\ContaoCoreBundle']) ...
Auch hier die Default Angabe, nach dem Contao Core (Bundle).
11 . 4
Und die Template Pfadangaben?Durch die Dateistruktur:
Resources/contao/templates
werden Templates vom Contao Core dort gesucht und gefunden.
12 . 1
Anpassung config.phpAngaben zu Klassen absolut angeben
$GLOBALS['FE_MOD']['miscellaneous']['demo'] = 'Demo\Module';
nun:
$GLOBALS['FE_MOD']['miscellaneous']['demo'] = 'Vendor\Demo\Module';
12 . 2
Anpassung config.phpAngaben CSS/JS/Bilder aus dem public Verzeichnis
$GLOBALS['BE_MOD']['content']['demo'] = array ( 'tables' => array('tl_demo'), 'stylesheet' => 'bundles/vendordemo/meine.css' );
Name der Bundle-Klasse "VendorDemoBundle" de�niert denVerzeichnisname.Name ohne "Bundle" , Rest in Kleinbuchstaben.Pfad unterhalb von web/http://domain.de/bundles/vendordemo/meine.css
13 . 1
Neue Klasse für Standard EditionBundle Klasse für "Vendor\DemoBundle": src/VendorDemoBundle.php
<?php namespace Vendor\DemoBundle; use Symfony\Component\HttpKernel\Bundle\Bundle; class VendorDemoBundle extends Bundle { }
13 . 2
Bundle Klasse registrierenEinfügen in app/AppKernel.php folgende Zeile am Ende des Array
$bundles:
new Vendor\DemoBundle\VendorDemoBundle(),
Cache leeren, neu anlegen lassen
bin/console cache:clear --env=prod --no-warmup bin/console cache:warmup --env=prod
Aufruf https://deinedomain/contao/install Datenbank Update durchführen
14 . 1
Neue Klasse für Managed EditionPlugin Klasse für den Contao Manager, Variante 1: src/ContaoManager/Plugin.php
<?php namespace Vendor\DemoBundle\ContaoManager; use Contao\ManagerPlugin\Bundle\Config\BundleConfig; use Contao\ManagerPlugin\Bundle\BundlePluginInterface; use Contao\ManagerPlugin\Bundle\Parser\ParserInterface; class Plugin implements BundlePluginInterface { public function getBundles(ParserInterface $parser) { return [ BundleConfig::create('Vendor\DemoBundle\VendorDemoBundle') ->setLoadAfter(['Contao\CoreBundle\ContaoCoreBundle']) ->setReplace(['demo']), ]; } }
14 . 2
Neue Klasse für Managed EditionPlugin Klasse für den Contao Manager, Variante 2:
<?php namespace Vendor\DemoBundle\ContaoManager; use Contao\ManagerPlugin\Bundle\Config\BundleConfig; use Contao\ManagerPlugin\Bundle\BundlePluginInterface; use Contao\ManagerPlugin\Bundle\Parser\ParserInterface; use Vendor\DemoBundle\VendorDemoBundle; use Contao\CoreBundle\ContaoCoreBundle; class Plugin implements BundlePluginInterface { public function getBundles(ParserInterface $parser) { return [ BundleConfig::create(VendorDemoBundle::class) ->setLoadAfter([ContaoCoreBundle::class]) ->setReplace(['demo']) ]; } }
14 . 3
Bundle Klasse registrierenAuszug composer.json, eigene Erweiterung, Autoload und Plugin:
"autoload":{ "psr-4": { "Vendor\\DemoBundle\\": "src/" } }, "extra":{ "contao-manager-plugin": "Vendor\\DemoBundle\\ContaoManager\\Plugin" }
15 . 1
PRAXISBeispiele anschauen,
Vergleich: (Contao 3) mit
(Contao 4 Bundle)contao_xingcontao-xing-bundle
Routing: Visitors mit FE und BE Route contao-visitors-bundle
16 . 1
UMBAU BACKUPDBAus Zeitgründen erfolgte der Umbau durch einen Pull-Requesteiner vorbereiteten Version.
17 . 1
Tipp: Installation direkt von GitHubBei Neuentwicklung, wenn kein Sync zu Packagist, Installationdirekt von GitHub. Dazu in composer.json der Contao Installationeinfügen:
"repositories": [ { "type": "vcs", "url": "https://github.com/VendorName/demo-bundle" } ], "require": { "vendor/demo-bundle": "dev-develop" },
Bedeutet: Installation der Erweiterung "vendor/demo-bundle", des GitHub Users VendorName, desssen Repository "demo-bundle", aus dem Branch "develop".
17 . 2
Tipp: Installation direkt von FestplatteBei Neuentwicklung, bei keiner Nutzung von GitHub, incomposer.json der Contao Installation einfügen:
"repositories": [ { "type": "path", "url": "../../contao_entwicklung/demo-bundle" } ], "require": { "vendor/demo-bundle": "*" },
Bedeutet: Installation der Erweiterung "vendor/demo-bundle",Source ist der relativer Pfad aus Sicht der Contao composer.json.Composer legt wenn möglich Symlinks dabei an, wenn man dasnicht will, nach der "url" Zeile einfügen:
...demo-bundle", "options": { "symlink": false }
18 . 1
EXTENSION FROM SCRATCHAlternative zur schrittweisen Umwandlung:
komplett neu direkt als Symfony Bundle
Quellen dazu:
(Video) Contao Nordtag 2017, Christian Schif�er
Extension from scratch in Contao 4
19 . 1
FRAGEN?PSR Autoloading?
Tilde ~ und Caret ^ bei Versionsangaben?
Angabe "::class"?
19 . 2
PHP Standards Recommendationshttp://www.php-�g.org/
PSR-0: alter Autoloading Standard, deprecated
PSR-4: erweiterter Autoloading Standard
Beispiel:
Class.php mit "namespace Vendor\Demo\test;":
psr-0: { "Vendor\\Demo" : src/" } : src/Vendor/Name/test/Class.php
psr-4: { "Vendor\\Demo" : src/" } : src/test/Class.php
19 . 3
Tilde and caret version constraints in ComposerTilde (~)
bedeutet >=4.1.3,<4.2.0, bedeutet >=4.1.0,<5.0.0 (oft genutzt), bedeutet >=0.4.0,<1.0.0,
bedeutet >=4.0.0,<5.0.0.
~4.1.3~4.1~0.4~4
19 . 4
Tilde and caret version constraints in ComposerCaret (^)
bedeutet >=4.1.3,<5.0.0, (oft genutzt) bedeutet >=4.1.0,<5.0.0, genauso wie ~4.1 aber: bedeutet >=0.4.0,<0.5.0, unterschiedlich zu ~0.4
nützlich für abwärtskompatiblen Bereich bedeutet >=4.0.0,<5.0.0 genauso wie ~4 und 4.*
^4.1.3^4.1^0.4
^4
19 . 5
Class name resolution via ::classClassName::class - vollständig quali�zierter Namen der KlasseClassName. Beispiel:
<?php namespace Name\Space; class ClassName {} echo ClassName::class;
Ausgabe:Name\Space\ClassName
20 . 1
HAPPY CODING!
Aktuelle Version dieser Folien auf: docs.contao.ninja
(auch als PDF und später auch als Video)