Drupal BasicsDrupal Basics
Vortrag von Peter MajmeskuVortrag von Peter Majmesku
„„Come for the software, stay for the community.“Come for the software, stay for the community.“
- Das Motto von Drupal.- Das Motto von Drupal.
Zur PersonZur Person
– Fachinformatiker für AnwendungsentwicklungFachinformatiker für Anwendungsentwicklung
– 5 Jahre und 8 Monate Drupal.org User5 Jahre und 8 Monate Drupal.org User
– Erstes Drupal Camp in Essen 2010Erstes Drupal Camp in Essen 2010
– DrupalCon London 2011, München 2012,DrupalCon London 2011, München 2012,
Amsterdam 2014 ...Amsterdam 2014 ...
– Habe mit dem Drupal Erfinder Dries Buytaert BierHabe mit dem Drupal Erfinder Dries Buytaert Bier
getrunken :)getrunken :)
– Erfahrung als Freelancer und AngestellterErfahrung als Freelancer und Angestellter
EntwicklerEntwickler
– Maintainer von Modulen auf Drupal.orgMaintainer von Modulen auf Drupal.org
FolieFolie 22 vonvon 8484
ReferenzenReferenzen
– Drupal:Drupal:
●
Als Externer beim Bravo.de Relaunch TeamAls Externer beim Bravo.de Relaunch Team
●
2 Jahre angestellt für Betrieb von PV.tv (ehemals bekanntes2 Jahre angestellt für Betrieb von PV.tv (ehemals bekanntes
Online-Portal im Solaranlagen-Sektor – Firma insolvent)Online-Portal im Solaranlagen-Sektor – Firma insolvent)
●
Eigenverantwortliche Umsetzung mit Design-Zuarbeit beiEigenverantwortliche Umsetzung mit Design-Zuarbeit bei
Agentur-Projekt: redner.jochen-schweizer.deAgentur-Projekt: redner.jochen-schweizer.de
●
OpenSource Aktivitäten mit Modulen auf Drupal.org:OpenSource Aktivitäten mit Modulen auf Drupal.org:
Permissions by Term, Auction, Ubercart AuctionPermissions by Term, Auction, Ubercart Auction
– PHP:PHP:
●
Webbasierter Passwort Manager „YiiPass“ auf GitHubWebbasierter Passwort Manager „YiiPass“ auf GitHub
●
Erfahrung als angestellter PHP-Softwareentwickler beimErfahrung als angestellter PHP-Softwareentwickler beim
Onlineshop Babymarkt.deOnlineshop Babymarkt.de
●
Refaktorierung von 10 Jahre alter Code-Basis beiRefaktorierung von 10 Jahre alter Code-Basis bei
Casamundo.de mit Yii2 Framework als ExternerCasamundo.de mit Yii2 Framework als Externer
FolieFolie 33 vonvon 8484
InhaltsübersichtInhaltsübersicht
●
AllgemeinesAllgemeines
●
InstallationInstallation
●
InhaltestrukturInhaltestruktur
●
BackendBackend
●
FrontendFrontend
FolieFolie 44 vonvon 8484
AllgemeinesAllgemeines
Drupal allgemeinDrupal allgemein
●
Content Management System und PHP-FrameworkContent Management System und PHP-Framework
●
Eignet sich gut als Community PlattformEignet sich gut als Community Plattform
●
Erste veröffentlichte Version 15. Januar 2001Erste veröffentlichte Version 15. Januar 2001
●
Motto: „Come for the software. Stay for the community.“Motto: „Come for the software. Stay for the community.“
●
●
●
●
Drupal 8 am 19. November 2015 veröffentlichtDrupal 8 am 19. November 2015 veröffentlicht
●
Alle Modul-Maintainer wurden geprüftAlle Modul-Maintainer wurden geprüft
●
Sehr viele freie Module und ThemesSehr viele freie Module und Themes
●
Komplex: Drupal ist Software für Agenturen und IT affine MenschenKomplex: Drupal ist Software für Agenturen und IT affine Menschen
FolieFolie 66 vonvon 8484
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
So viele OpenSource CMSSo viele OpenSource CMS
FolieFolie 77 vonvon 8484
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Welche Unternehmen stehenWelche Unternehmen stehen
dahinter?dahinter?
FolieFolie 88 vonvon 8484
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Wordpress ist doch viel beliebterWordpress ist doch viel beliebter
FolieFolie 99 vonvon 8484
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Darum Drupal: Drupal ist EnterpriseDarum Drupal: Drupal ist Enterprise
FolieFolie 1010 vonvon 8484
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Gründe für meine Entscheidung (2011)Gründe für meine Entscheidung (2011)
FolieFolie 1111 vonvon 8484
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
●
Wordpress konnte nicht:Wordpress konnte nicht:
●
Navigation mit unendlich vielen EbenenNavigation mit unendlich vielen Ebenen
●
Inhaltstypen und FelderInhaltstypen und Felder
●
CakePHP 2.x (Access Control Lists):CakePHP 2.x (Access Control Lists):
●
überschritt PHP Know-How Level und Zeitaufwandüberschritt PHP Know-How Level und Zeitaufwand
●
Feingranulares Berechtigungssystem bei Drupal bereits fertigFeingranulares Berechtigungssystem bei Drupal bereits fertig
und mit grafischer Oberflächeund mit grafischer Oberfläche
●
Typo3:Typo3:
●
Icons waren schwer zu verstehenIcons waren schwer zu verstehen
●
Bei Drupal Menüpunkte im Admin-Bereich in TextformBei Drupal Menüpunkte im Admin-Bereich in Textform
●
Community:Community:
●
Drupal User Group traf sich jeden Monat im essenerDrupal User Group traf sich jeden Monat im essener
UnperfekthausUnperfekthaus
●
Informative Camps und gesellige PartiesInformative Camps und gesellige Parties
●
Drupal Leute waren nett (die im PHP/HTML/CSS Forum nicht)Drupal Leute waren nett (die im PHP/HTML/CSS Forum nicht)
Weitere GründeWeitere Gründe
FolieFolie 1212 vonvon 8484
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Ich musste weniger Vertrieb machen und konnte größeren monetärenIch musste weniger Vertrieb machen und konnte größeren monetären
Gewinn machen, da ich umfangreichere Lösungen anbieten konnte.Gewinn machen, da ich umfangreichere Lösungen anbieten konnte.
●
CMS-Funktion: jaCMS-Funktion: ja
●
Community Funktion: jaCommunity Funktion: ja
●
Shopfunktion: jaShopfunktion: ja
●
Auktionsfunktion: jaAuktionsfunktion: ja
●
Forum: jaForum: ja
......
Das alles ging „überhaupt“, war erweiterbar (wenn auch schwer) undDas alles ging „überhaupt“, war erweiterbar (wenn auch schwer) und
alles unter einer System-Architektur.alles unter einer System-Architektur.
Wordpress Blog:Wordpress Blog: Umsetzungsdauer 2 WochenUmsetzungsdauer 2 Wochen
Gambio GX Fertigshop:Gambio GX Fertigshop: Umsetzungsdauer 1 MonatUmsetzungsdauer 1 Monat
Drupal Website:Drupal Website: Umsetzungsdauer halbes JahrUmsetzungsdauer halbes Jahr
Drupal war schon damals Update fähig.Drupal war schon damals Update fähig.
Drupal ist und war qualitativ besser zuDrupal ist und war qualitativ besser zu
programmieren als Wordpress undprogrammieren als Wordpress und
Gambio GX.Gambio GX.
InstallationInstallation
SystemvoraussetzungenSystemvoraussetzungen
FolieFolie 1414 vonvon 8484
●
Erfahrungsgemäß 256 MB PHPErfahrungsgemäß 256 MB PHP
Memory LimitMemory Limit
●
1 SQL kompatible Datenbank1 SQL kompatible Datenbank
(MySQL empfohlen)(MySQL empfohlen)
●
Min. PHP 5.5.9 (Drupal 8), min. PHP 5.2.5Min. PHP 5.5.9 (Drupal 8), min. PHP 5.2.5
(Drupal 7)(Drupal 7)
●
Drupal 8 funktioniert mit PHP 7Drupal 8 funktioniert mit PHP 7
●
Apache, Nginx oder IIS Webserver – einfachsteApache, Nginx oder IIS Webserver – einfachste
Konfiguration auf Apache WebserverKonfiguration auf Apache Webserver
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Vorab EinstellungenVorab Einstellungen
FolieFolie 1515 vonvon 8484
Vor Installation sites/default/default.settings.php Datei kopierenVor Installation sites/default/default.settings.php Datei kopieren
und als sites/default/settings.php Datei benennen.und als sites/default/settings.php Datei benennen.
Schreibrechte auf Linux (Unix kompatiblem)Schreibrechte auf Linux (Unix kompatiblem)
Dateisystem beim „sites“-Ordner einstellen:Dateisystem beim „sites“-Ordner einstellen:
●
sites --> 775sites --> 775
●
sites/default -->775sites/default -->775
●
sites/default/files --> 775sites/default/files --> 775
●
sites/default/settings.php --> vor Installation 777,sites/default/settings.php --> vor Installation 777,
danach aus Sicherheitsgründen 444danach aus Sicherheitsgründen 444
Hinweis:Hinweis: Unter Windows (zum Testen/Spielen) werden keineUnter Windows (zum Testen/Spielen) werden keine
Schreibrechte-Einstellungen benötigt.Schreibrechte-Einstellungen benötigt.
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Installationsprozedur im BrowserInstallationsprozedur im Browser
FolieFolie 1616 vonvon 8484
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Installationsprozedur mit „Drush“Installationsprozedur mit „Drush“
FolieFolie 1717 vonvon 8484
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Installationsvorgang wenn alles passtInstallationsvorgang wenn alles passt
FolieFolie 1818 vonvon 8484
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Installationsprofile für Shops,Installationsprofile für Shops,
Projektmanagement etc.Projektmanagement etc.
FolieFolie 1919 vonvon 8484
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Z.B. Shopsystem: Commerce Kickstart, Projektmanagement: Open AtriumZ.B. Shopsystem: Commerce Kickstart, Projektmanagement: Open Atrium
Zentrale Drupal Probleme-Anlaufstelle:Zentrale Drupal Probleme-Anlaufstelle:
http://drupal.org/project/issues:http://drupal.org/project/issues:
Folie 20 von 84
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
InhaltestrukturInhaltestruktur
FolieFolie 2121 vonvon 8484
Content Types (Inhaltstypen v. Nodes)Content Types (Inhaltstypen v. Nodes)
FolieFolie 2222 vonvon 8484
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Fields (Felder)Fields (Felder)
FolieFolie 2323 vonvon 8484
Felder Übersicht:Felder Übersicht: Feld Typen:Feld Typen:
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Views (Ansichten)Views (Ansichten)
FolieFolie 2424 vonvon 8484
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Blocks (Blöcke)Blocks (Blöcke)
FolieFolie 2525 vonvon 8484
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Taxonomy VocabulariesTaxonomy Vocabularies
(Taxonomie Vokabulare)(Taxonomie Vokabulare)
FolieFolie 2626 vonvon 8484
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Taxonomy TermsTaxonomy Terms
FolieFolie 2727 vonvon 8484
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
User (Benutzer)User (Benutzer)
FolieFolie 2828 vonvon 8484
Unterschiedliche
Benutzerrollen
Berechtigungen zusammengefasst nach
(Core)-Modul
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Backend für Redakteure erfordertBackend für Redakteure erfordert
EinstellungenEinstellungen
FolieFolie 2929 vonvon 8484
Tipps für Maßnahmen:Tipps für Maßnahmen:
●
Redakteure sind keine Admins:Redakteure sind keine Admins:
●
Benutzerrolle für Redakteure anlegen und BerechtigungenBenutzerrolle für Redakteure anlegen und Berechtigungen
zuweisenzuweisen
●
Toolbar ausblenden und eigenes Menü mit nur für RedakteureToolbar ausblenden und eigenes Menü mit nur für Redakteure
relevanten Menüpunkten anzeigenrelevanten Menüpunkten anzeigen
●
Bilder-Dateimanager installieren (IMCE)Bilder-Dateimanager installieren (IMCE)
●
WYSIWYG-Editor Buttons einschränken (z.B. nur fett, kursiv,WYSIWYG-Editor Buttons einschränken (z.B. nur fett, kursiv,
unterstrichen und Absätze)unterstrichen und Absätze)
●
Dashboard erstellen mit Content- und Nutzer-ÜbersichtDashboard erstellen mit Content- und Nutzer-Übersicht
●
Gebrauchsanleitung erstellen:Gebrauchsanleitung erstellen:
●
Screenshots und Beschreibungen anfertigenScreenshots und Beschreibungen anfertigen
●
Tour-Modul schreiben, welches dem Redakteur Einweisung gibt.Tour-Modul schreiben, welches dem Redakteur Einweisung gibt.
●
Alles was Redakteure nicht brauchen: ausblenden und ZugangAlles was Redakteure nicht brauchen: ausblenden und Zugang
verwehren.verwehren.
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
BackendBackend
DB-StrukturDB-Struktur
●
SQL DatenbanksystemeSQL Datenbanksysteme
●
Leicht zugänglicher DB AufbauLeicht zugänglicher DB Aufbau
– Keine SQL-Views oder Stored ProceduresKeine SQL-Views oder Stored Procedures
– Keine Primär- und FremdschlüsselKeine Primär- und Fremdschlüssel
●
Vorsicht vor nicht mehr referenzierbaren DatensätzenVorsicht vor nicht mehr referenzierbaren Datensätzen
●
Ab Drupal 7 Inno DB als DB-Engine (davor MyISAM)Ab Drupal 7 Inno DB als DB-Engine (davor MyISAM)
– Transaktionen, Fremdschlüssel, auf große Datenmengen optimiertTransaktionen, Fremdschlüssel, auf große Datenmengen optimiert
●
Caching in DatenbankCaching in Datenbank
●
Bis Drupal 7 Konfiguration hauptsächlich in DatenbankBis Drupal 7 Konfiguration hauptsächlich in Datenbank
●
Div. Module für Caching in NonSQL-DatenbankenDiv. Module für Caching in NonSQL-Datenbanken
FolieFolie 3232 vonvon 8484
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Ordner-StrukturOrdner-Struktur
●
Drupal 7:Drupal 7:
– /sites enthält Erweiterungen (eigene Module und Themes)/sites enthält Erweiterungen (eigene Module und Themes)
und Konfigurationund Konfiguration
– Alle anderen Ordner sind „core“Alle anderen Ordner sind „core“
●
Drupal 8:Drupal 8:
– /sites gibt es weiterhin/sites gibt es weiterhin
– /core enthält Core Module und Themes/core enthält Core Module und Themes
– /modules und /themes halten eigene Module und Themes/modules und /themes halten eigene Module und Themes
– /vendor enthält PHP-Libraries/vendor enthält PHP-Libraries
●
Details auf Drupal.org in Community DocumentationDetails auf Drupal.org in Community Documentation
Hinweis:Hinweis: Kopieren von eigenen Dateien oder Erweiterungen in Core-Kopieren von eigenen Dateien oder Erweiterungen in Core-
Ordner schafft Chaos und macht Update schwierigOrdner schafft Chaos und macht Update schwierig
FolieFolie 3333 vonvon 8484
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Warum /sites?Warum /sites?
●
Multi-Site FähigkeitMulti-Site Fähigkeit
– 1 Codebasis1 Codebasis
– Unendlich viele SeitenUnendlich viele Seiten
– Komfortables Zurückgreifen auf Stamm anKomfortables Zurückgreifen auf Stamm an
ErweiterungenErweiterungen
– Getrennte DatenbankenGetrennte Datenbanken
●
Multi-Site Fähigkeit ist zu unterscheiden vonMulti-Site Fähigkeit ist zu unterscheiden von
mehrsprachiger Seitemehrsprachiger Seite
FolieFolie 3434 vonvon 8484
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Eigenes Modul schreiben ist einfachEigenes Modul schreiben ist einfach
●
Unter /sites/all/modules und bestehend aus:Unter /sites/all/modules und bestehend aus:
– Ordner mit Maschinenname („mein_modul“)Ordner mit Maschinenname („mein_modul“)
– Info-Datei mit MaschinennameInfo-Datei mit Maschinenname
– Module-Datei mit MaschinennameModule-Datei mit Maschinenname
●
Zum Beispiel:Zum Beispiel:
– /myquiz/myquiz
– /myquiz/myquiz.info/myquiz/myquiz.info
– /myquiz/myquiz.module/myquiz/myquiz.module
FolieFolie 3535 vonvon 8484
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Hinweis: In Info- und Module-Datei können andere PHP-Dateien
wie Klassen und Autoloader (z.B. Composer) referenziert werden.
Beispiel für eigenes Drupal-ModulBeispiel für eigenes Drupal-Modul
Info-Datei registriert Modul im Drupal.Info-Datei registriert Modul im Drupal.
mygame.info:mygame.info:
FolieFolie 3636 vonvon 8484
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Hinweis zu Drupal-Hooks:Hinweis zu Drupal-Hooks: „hook“ in Drupal API-Funktion ist nur ein„hook“ in Drupal API-Funktion ist nur ein
Platzhalter für den Maschinennamen des Moduls oder Themes.Platzhalter für den Maschinennamen des Moduls oder Themes.
Hooks „haken“ sich in bestehenden Programmablauf ein.Hooks „haken“ sich in bestehenden Programmablauf ein.
Beispiel für eigenes Drupal-ModulBeispiel für eigenes Drupal-Modul
Module-Datei enthält Modul-Logik.Module-Datei enthält Modul-Logik.
mygame.module:mygame.module:
FolieFolie 3737 vonvon 8484
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Best PracticesBest Practices
●
Nutzung der Drupal APIsNutzung der Drupal APIs
– https://api.drupal.org/api/drupalhttps://api.drupal.org/api/drupal
●
Listen ErstellungListen Erstellung
– Views Modul (besonders gut für Frontend-Leute, da Klick-Oberfläche)Views Modul (besonders gut für Frontend-Leute, da Klick-Oberfläche)
– DB-Layer zur Datenbankabfrage mit Render-ArraysDB-Layer zur Datenbankabfrage mit Render-Arrays
●
Logik in Modul oder bei kleinen Template-Anpassungen inLogik in Modul oder bei kleinen Template-Anpassungen in
template.php ablegentemplate.php ablegen
●
Drupal Coding Standards (unterstützt PhpStorm IDE)Drupal Coding Standards (unterstützt PhpStorm IDE)
●
Nicht für alles ein Modul suchenNicht für alles ein Modul suchen
→→ Overhead bedenkenOverhead bedenken
●
Datenbank mit nützlichen Modulen in Wiki pflegenDatenbank mit nützlichen Modulen in Wiki pflegen
FolieFolie 3838 vonvon 8484
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
DB-Queries in D7 und D8DB-Queries in D7 und D8
FolieFolie 3939 vonvon 8484
Drupal 7 DB-Funktion basierend auf PDO:Drupal 7 DB-Funktion basierend auf PDO:
Drupal 8 Database Objekt mit Fluent Interface:Drupal 8 Database Objekt mit Fluent Interface:
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Drupal 8: schnellereDrupal 8: schnellere
ProgrammierungProgrammierung
FolieFolie 4040 vonvon 8484
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Drupal 8 Code TippsDrupal 8 Code Tipps
FolieFolie 4141 vonvon 8484
Entity Manager: Abfrage von Daten bereits im Drupal Kontext:Entity Manager: Abfrage von Daten bereits im Drupal Kontext:
Drupal 8 ist häufig abwärts kompatibel zu Drupal 7 Funktionen:Drupal 8 ist häufig abwärts kompatibel zu Drupal 7 Funktionen:
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Drupal Module: Projekte auf Drupal.orgDrupal Module: Projekte auf Drupal.org
Folie 42 von 84
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Drupal Module: Projekte auf Drupal.orgDrupal Module: Projekte auf Drupal.org
Folie 43 von 84
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Der Googler, der Programmierer,Der Googler, der Programmierer,
der Site-Builderder Site-Builder
Folie 44 von 84
●
Arbeite ich mit dem Framework oder schon dagegen?Arbeite ich mit dem Framework oder schon dagegen?
●
Wieviel Overhead habe ich?Wieviel Overhead habe ich?
●
Erfolg in kurzer Zeit gegen mittelfristige Probleme inErfolg in kurzer Zeit gegen mittelfristige Probleme in
Erweiter- und Anpassbarbarkeit?Erweiter- und Anpassbarbarkeit?
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Performance-TippsPerformance-Tipps
●
Caching in Standard Einstellungen einschalten:Caching in Standard Einstellungen einschalten:
– CSS/JavaScript KompressionCSS/JavaScript Kompression
– Blöcke + Pages KompressionBlöcke + Pages Kompression
●
PHP OPCode cachenPHP OPCode cachen
●
Unnötige SQL-Abfragen vermeiden (Achillesferse von Drupal)Unnötige SQL-Abfragen vermeiden (Achillesferse von Drupal)
– MySQL Slow LogMySQL Slow Log
– Überblick über Abfragen verschaffen und optimieren (Logging in MySQL einschalten bzw.Überblick über Abfragen verschaffen und optimieren (Logging in MySQL einschalten bzw.
Webprofiler Modul in D8 nutzen)Webprofiler Modul in D8 nutzen)
– Drupal 8 Webprofiler zeigt nur erfolgreiche AbfragenDrupal 8 Webprofiler zeigt nur erfolgreiche Abfragen
●
Xdebug Profiler nutzen und Cachegrind-Dateien auswerten (PHP Laufzeitdaten)Xdebug Profiler nutzen und Cachegrind-Dateien auswerten (PHP Laufzeitdaten)
●
Eine aktuelle PHP Version nutzenEine aktuelle PHP Version nutzen
●
Varnish CacheVarnish Cache
●
CDN für Bilder und Assets (CSS/JS)CDN für Bilder und Assets (CSS/JS)
FolieFolie 4545 vonvon 8484
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Drupal Module: Projekte auf Drupal.org
Folie 46 von 84
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Es gibt nicht nur Drupal Module:Es gibt nicht nur Drupal Module:
Composer Packages vonComposer Packages von
Packagist.comPackagist.com
FolieFolie 4747 vonvon 8484
●
PHP Pakete zur Installation über die KommandozeilePHP Pakete zur Installation über die Kommandozeile
●
Teils abstrakte Funktionsbibliotheken, teils bereits Bezug zuTeils abstrakte Funktionsbibliotheken, teils bereits Bezug zu
Anwendungszweck (z.B. Quiz)Anwendungszweck (z.B. Quiz)
●
Nutzungsdaten von Anwendern auf Packagist.com sichtbarNutzungsdaten von Anwendern auf Packagist.com sichtbar
●
Pakete haben Bezug zu Repository auf GitHub.comPakete haben Bezug zu Repository auf GitHub.com
●
Ab PHP 5.3.2 ist Composer verfügbarAb PHP 5.3.2 ist Composer verfügbar
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Verwaltung von KonfigurationVerwaltung von Konfiguration
in Drupal 7in Drupal 7●
settings.phpsettings.php
– Enthält z.B. DB-Verbindung, Überschreibt alle Variablen im Drupal KontextEnthält z.B. DB-Verbindung, Überschreibt alle Variablen im Drupal Kontext
●
Features ModulFeatures Modul
– Überträgt häufig genutzte Drupal Komponenten zwischen DatenbankenÜberträgt häufig genutzte Drupal Komponenten zwischen Datenbanken
– Erzeugt ModuleErzeugt Module
●
Configuration Management ModulConfiguration Management Modul
– Ähnlich Features ModulÄhnlich Features Modul
– Lässt sich nicht zur Modulerzeugung verwendenLässt sich nicht zur Modulerzeugung verwenden
●
Reduziert FehlerquelleReduziert Fehlerquelle
●
Manuelles Deployment per Copy, Click and PasteManuelles Deployment per Copy, Click and Paste
●
hook_update(); und hook_install();hook_update(); und hook_install();
Folie 48 von 84
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Verwaltung von KonfigurationVerwaltung von Konfiguration
in Drupal 8in Drupal 8●
settings.phpsettings.php
– Überschreibt weiterhin alle VariablenÜberschreibt weiterhin alle Variablen
●
Konfiguration kann nun in YML-Dateien exportiertKonfiguration kann nun in YML-Dateien exportiert
und daraus eingelesen werdenund daraus eingelesen werden
●
Konfiguration kann versioniert werdenKonfiguration kann versioniert werden
●
Kein Features Modul mehrKein Features Modul mehr
●
Achtung: Module können KonfigurationAchtung: Module können Konfiguration
überschreibenüberschreiben
●
Copy and Paste funktioniert weiterhinCopy and Paste funktioniert weiterhin
Folie 49 von 84
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
MehrsprachigkeitMehrsprachigkeit
●
Englisch ist Grundsprache in D7Englisch ist Grundsprache in D7
●
Pluralformen müssen getrennt übersetzt werdenPluralformen müssen getrennt übersetzt werden
●
Übersetzungen landen über t(); PHP-Funktion in Datenbank und gebenÜbersetzungen landen über t(); PHP-Funktion in Datenbank und geben
Übersetzungen ausÜbersetzungen aus
●
„„Localization update“ aktualisiert Übersetzungen von localize.drupal.org.Localization update“ aktualisiert Übersetzungen von localize.drupal.org.
●
Drupal 7 Core-Funktionalität reicht nicht für Mehrsprachigkeit: i18n ModulDrupal 7 Core-Funktionalität reicht nicht für Mehrsprachigkeit: i18n Modul
nötignötig
●
Drupal 8Drupal 8
– Core Umfang verspricht für vollständige MehrsprachigkeitCore Umfang verspricht für vollständige Mehrsprachigkeit
ausreichend zu seinausreichend zu sein
– Englisch kann als Sprache entfernt werdenEnglisch kann als Sprache entfernt werden
– Jede Sprache kann Grundsprache seinJede Sprache kann Grundsprache sein
Folie 50 von 84
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Drupal ist nicht abgeschottet:Drupal ist nicht abgeschottet:
oTranCe als ÜbersetzungstooloTranCe als Übersetzungstool
Folie 51 von 84
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Alle Texte können auf einer Seite
übersetzt werden.
oTranCeoTranCe
Folie 52 von 84
●
Keine Übersetzung von Text (Strings), es werdenKeine Übersetzung von Text (Strings), es werden
Schlüssel (Array-Keys) übersetztSchlüssel (Array-Keys) übersetzt
●
Einfach: Export der Übersetzungen als PHP-Einfach: Export der Übersetzungen als PHP-
Dateien mit Arrays zur WeiterverarbeitungDateien mit Arrays zur Weiterverarbeitung
●
Workflow für Übersetzer im Web-FrontendWorkflow für Übersetzer im Web-Frontend
einfach: Klick auf Text öffnet Formularfeld füreinfach: Klick auf Text öffnet Formularfeld für
die Übersetzungdie Übersetzung
●
Getrennt von HauptsystemGetrennt von Hauptsystem
●
Große Websites und Agenturen setzen es einGroße Websites und Agenturen setzen es ein
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
EntitiesEntities
●
Seit Drupal 7 ist „fast alles“ eine EntitätSeit Drupal 7 ist „fast alles“ eine Entität
●
Bei Drupal 8 allesBei Drupal 8 alles
●
Eine Entität ist ein eindeutig zu bestimmendesEine Entität ist ein eindeutig zu bestimmendes
Objekt:Objekt:
– UserUser
– TaxonomyTaxonomy
– ContentContent
– CommentsComments
– FilesFiles
●
Entity-Types ähneln Models aus ORM BibliothekenEntity-Types ähneln Models aus ORM Bibliotheken
Folie 53 von 84
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Zugriff auf Feldwert:Zugriff auf Feldwert:
Entity Metadata WrapperEntity Metadata Wrapper
Folie 54 von 84
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Beispiel aus Drupal 7:Beispiel aus Drupal 7:
Module: Devel + Krumo SearchModule: Devel + Krumo Search
Folie 55 von 84
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Der Objekte-/Array-Stack kann durchsucht werden.
Mit Mausklicks können die Dimensionen
aufgeklappt werden.
Wert-Pfad kann kopiert werden. Den aber bitte
nicht benutzen! Entity Metadata Wrapper nutzen.
In Objekte Stacks navigieren/debuggenIn Objekte Stacks navigieren/debuggen
●
Devel + Search Krumo Modul:Devel + Search Krumo Modul:
– dpm() PHP-Funktion gibt Stack als klickbares Objekt imdpm() PHP-Funktion gibt Stack als klickbares Objekt im
Browser aus, welches durchsucht werden kannBrowser aus, welches durchsucht werden kann
– SeiteSeite http://DOMAIN/devel/phphttp://DOMAIN/devel/php erlaubt PHP Eingabe fürerlaubt PHP Eingabe für
EntwicklerEntwickler
– SeiteSeite http://DOMAIN/devel/phpinfohttp://DOMAIN/devel/phpinfo zeigt phpinfo() Ausgabezeigt phpinfo() Ausgabe
●
Xdebug (Erweiterung für PHP):Xdebug (Erweiterung für PHP):
– Stack kann in IDE (z.B. PhpStorm) durchsucht werdenStack kann in IDE (z.B. PhpStorm) durchsucht werden
– Objekte können zur Laufzeit evaluiert werdenObjekte können zur Laufzeit evaluiert werden
●
Devel, Krumo Search und XDebug sparen Zeit undDevel, Krumo Search und XDebug sparen Zeit und
NervenNerven
Folie 56 von 84
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Funktionsstack zur PHP-LaufzeitFunktionsstack zur PHP-Laufzeit
inspizieren: XDebug + PhpStorminspizieren: XDebug + PhpStorm
Folie 57 von 84
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Xdebug mit IDE UnterstützungXdebug mit IDE Unterstützung
●
var_dump() und print_r() zu schreiben ist oftvar_dump() und print_r() zu schreiben ist oft
langsamlangsam
●
Beim Aufruf einer Seite kann der PHP-Beim Aufruf einer Seite kann der PHP-
Programmablauf mit dem Debugger durchgestepptProgrammablauf mit dem Debugger durchgesteppt
werden (jemand nannte das mal „richtig Debuggen“)werden (jemand nannte das mal „richtig Debuggen“)
●
Während der Programmlaufzeit können MethodenWährend der Programmlaufzeit können Methoden
und Funktionen mit Parametern „ausprobiert“ werdenund Funktionen mit Parametern „ausprobiert“ werden
●
Nachteil: manchmal stürzt der Debugging-VorgangNachteil: manchmal stürzt der Debugging-Vorgang
plötzlich ab. PHP OPCode Cache Ausschalten kannplötzlich ab. PHP OPCode Cache Ausschalten kann
helfen.helfen.
Folie 58 von 84
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Funktionsstack zur PHP-LaufzeitFunktionsstack zur PHP-Laufzeit
inspizieren: XDebug + PhpStorminspizieren: XDebug + PhpStorm
Folie 59 von 84
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
PHP-Profiling: Xdebug + QCachegrindPHP-Profiling: Xdebug + QCachegrind
Folie 60 von 84
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Suche
●
Drupal Standard Suche funktionsarm und langsamDrupal Standard Suche funktionsarm und langsam
●
Search API ModulSearch API Modul
●
TeilwortsucheTeilwortsuche
●
Apache Solr und Elasticsearch SchnellstartmodulApache Solr und Elasticsearch Schnellstartmodul
●
Gibt Suchergebnisseiten als Views ausGibt Suchergebnisseiten als Views aus
●
Bei Performance-Bedarf kann einfach von MySQL-DB Index aufBei Performance-Bedarf kann einfach von MySQL-DB Index auf
Apache Solr Index umgeschaltet werdenApache Solr Index umgeschaltet werden
●
Custom LösungCustom Lösung
– Elasticsearch ist einfacher als Apache Solr zu handhabenElasticsearch ist einfacher als Apache Solr zu handhaben
●
Google Page SearchGoogle Page Search
Folie 61 von 84
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
TestingTesting
●
PHPUnit für Unit TestsPHPUnit für Unit Tests
– Ideal um eigene Code-Bibliotheken zu testenIdeal um eigene Code-Bibliotheken zu testen
– Der Schlüssel ist die eigenen Algorithmen zu testenDer Schlüssel ist die eigenen Algorithmen zu testen
– MockingMocking
– DatasourcesDatasources
●
Simple Test für Funktionale TestsSimple Test für Funktionale Tests
– Ohne Browser verschiedene Interaktionen ausführen (z.B. einloggen und ausloggen)Ohne Browser verschiedene Interaktionen ausführen (z.B. einloggen und ausloggen)
●
Codeception für AkzeptanztestsCodeception für Akzeptanztests
– Praktisch für das Testen eines Projektes im BrowserPraktisch für das Testen eines Projektes im Browser
– Headless Browser simuliert den KundenHeadless Browser simuliert den Kunden
– Screenshots mit Slideshow bei FehlernScreenshots mit Slideshow bei Fehlern
●
Mit meiner Vagrant Box GaiaVagrant könnt ihr sofort loslegen:Mit meiner Vagrant Box GaiaVagrant könnt ihr sofort loslegen:
https://github.com/jepster/GaiaVagranthttps://github.com/jepster/GaiaVagrant + https://github.com/jepster/GaiaD8+ https://github.com/jepster/GaiaD8
Folie 62 von 84
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
PHP-Unit Testlauf in IDEPHP-Unit Testlauf in IDE
Folie 63 von 84
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
PHPUnit BeispielePHPUnit Beispiele
●
Mein Drupal 8 Modul Permissions by Term:Mein Drupal 8 Modul Permissions by Term:
– https://www.drupal.org/project/permissions_by_termhttps://www.drupal.org/project/permissions_by_term
●
PHPUnit ist gut dokumentiert:PHPUnit ist gut dokumentiert:
– https://phpunit.de/manual/current/en/index.htmlhttps://phpunit.de/manual/current/en/index.html
Folie 64 von 84
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Codeception + PhantomJSCodeception + PhantomJS
Folie 65 von 84
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Simple Syntax, schnelles Test-
Schreiben
Folie 66 von 84
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
ThemingTheming
Theming Guide auf drupal.orgTheming Guide auf drupal.org
FolieFolie 6868 vonvon 8484
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Entwickler-Themes auf Drupal.orgEntwickler-Themes auf Drupal.org
FolieFolie 6969 vonvon 8484
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Premium Themes auf ThemeforestPremium Themes auf Themeforest
FolieFolie 7070 vonvon 8484
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Themes und Sub-ThemesThemes und Sub-Themes
FolieFolie 7171 vonvon 8484
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Eigenes Theme erstellenEigenes Theme erstellen
●
Einen Theme Maschinen-Namen festlegen (z.B. kernpunkt)Einen Theme Maschinen-Namen festlegen (z.B. kernpunkt)
●
Theme Ordner in sites/all/themes anlegenTheme Ordner in sites/all/themes anlegen
●
Wenige Konfigurationsdateien damit Theme einschaltbar istWenige Konfigurationsdateien damit Theme einschaltbar ist
●
Template-Dateien werden aus Core kopiert (Core istTemplate-Dateien werden aus Core kopiert (Core ist
Haupttheme)Haupttheme)
●
Vorteil: weniger OverheadVorteil: weniger Overhead
●
Nachteil: Template-Dateien müssen gesucht werdenNachteil: Template-Dateien müssen gesucht werden
FolieFolie 7272 vonvon 8484
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Drupal 7 Theming MerklisteDrupal 7 Theming Merkliste
Folie 73 von 84
●
Bereiche (Sidebar, Content-Bereich etc.) sindBereiche (Sidebar, Content-Bereich etc.) sind
RegionenRegionen
●
template.php Datei enthält Theme-Logiktemplate.php Datei enthält Theme-Logik
●
Module + Views bringen eigenes Markup mitModule + Views bringen eigenes Markup mit
●
Drupal bringt eigene jQuery Version mitDrupal bringt eigene jQuery Version mit
●
Für alle Bereiche auf der Seite gibt es .tpl-DateienFür alle Bereiche auf der Seite gibt es .tpl-Dateien
●
Keine Datenbankabfragen in Template-DateienKeine Datenbankabfragen in Template-Dateien
●
PHP-Klassen haben nichts im Theme-OrdnerPHP-Klassen haben nichts im Theme-Ordner
verloren – Drupal Modul erstellenverloren – Drupal Modul erstellen
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Drupal 7 Theme StrukturDrupal 7 Theme Struktur
Folie 74 von 84
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Drupal 7 Mothership Theme -Drupal 7 Mothership Theme -
weniger ist mehrweniger ist mehr
Folie 75 von 84
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
hook_theme();hook_theme();
Folie 76 von 84
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Zur Trennung von Logik von HTML-Markup mittels Template
Dateien bei Drupal 7 + 8.
Kann in Modul und template.php Datei des Themes benutzt
werden.
Vorgang besteht aus:
● Template Datei enthält HTML-Markup und Variablen
● hook_theme(); enthält Definition der Template-Funktion
● Aufruf der Template-Funktion. Sie nimmt Parameter-Variablen
an und setzt sie in HTML-Markup ein
Hinweis: Bei Drupal 7 enthalten die Template-Dateien neben HTML
auch PHP wegen der PhpTemplate Engine. Bei Drupal 8 ist in den
Template-Dateien kein PHP mehr enthalten. Da ist es Twig-Markup.
Beispiel für Einsatz vonBeispiel für Einsatz von
hook_theme(); in Drupal 7hook_theme(); in Drupal 7
Folie 77 von 84
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Das HTML-Markup mit Variablen unter
templates/timer_and_points.tpl.php:
Beispiel hook_theme(); (D7)Beispiel hook_theme(); (D7)
Folie 78 von 84
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Defintion der Template-Funktion.
Beispiel hook_theme(); (D7)Beispiel hook_theme(); (D7)
Folie 79 von 84
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Aufruf eigener Template-Funktion für HTML-Markup
mit Werten (Themed Output).
theme() gibt HTML-Markup mit
Variablen-Werten aus.
Twig – Drupal 8 Theme EngineTwig – Drupal 8 Theme Engine
Folie 80 von 84
●
Kein PHP Code mehr imKein PHP Code mehr im
TemplateTemplate
●
Entwickler/Themer könnenEntwickler/Themer können
nicht mehr so gut böse Dingenicht mehr so gut böse Dinge
tuntun
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Twig BasicsTwig Basics
●
Ausgaben mit {{ }} (z.B. {{ dump(variable) }})Ausgaben mit {{ }} (z.B. {{ dump(variable) }})
●
Kommandos (z.B. Schleifen) mit {% %}Kommandos (z.B. Schleifen) mit {% %}
●
Kommentare mit {# #}Kommentare mit {# #}
●
Keine gemischten Datentypen mehr (Objekte, Strings, Array)Keine gemischten Datentypen mehr (Objekte, Strings, Array)
●
Keine Theme Funktionen mehrKeine Theme Funktionen mehr
●
Twig Dateien werden nur einmal gelesen und dann in denTwig Dateien werden nur einmal gelesen und dann in den
Dateisystem-Cache kompiliertDateisystem-Cache kompiliert
●
Twig wird in vielen PHP-Projekten eingesetzt; nicht nur DrupalTwig wird in vielen PHP-Projekten eingesetzt; nicht nur Drupal
●
Twig ist eine Symfony Component und unabhängig vomTwig ist eine Symfony Component und unabhängig vom
Symfony Full Stack Framework nutzbarSymfony Full Stack Framework nutzbar
Folie 81 von 84
AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
Vielen Dank für Eure Aufmerksamkeit!Vielen Dank für Eure Aufmerksamkeit!
QuellenQuellen
●
Blonde Frau auf der Suche:Blonde Frau auf der Suche:
http://www.alleycatdigitaldesigns.com/wp-content/uploads/2015/06/arizona-search-http://www.alleycatdigitaldesigns.com/wp-content/uploads/2015/06/arizona-search-
engine-marketing.jpgengine-marketing.jpg
●
CMS Übersicht:CMS Übersicht: http://cms-garden.orghttp://cms-garden.org
●
Drupal Facts:Drupal Facts: http://www.drupal.orghttp://www.drupal.org
●
Bild mit modularem Aufbau:Bild mit modularem Aufbau:
http://www.bhkw-beispiele.de/projekt/bhkw-beispieldatenbank_modularer_aufbau.hhttp://www.bhkw-beispiele.de/projekt/bhkw-beispieldatenbank_modularer_aufbau.h
tmltml
●
Composer Logo:Composer Logo: https://getcomposer.org/https://getcomposer.org/
●
Drupal 7 Theme Struktur:Drupal 7 Theme Struktur: https://www.drupal.org/node/171194https://www.drupal.org/node/171194
●
Drupal, Wordpress, Joomla Vortrag Hagen Graf:Drupal, Wordpress, Joomla Vortrag Hagen Graf: http://goo.gl/3S58WVhttp://goo.gl/3S58WV
●
Diskussionsbild – Wikipedia, Planung eines Dorfplans:Diskussionsbild – Wikipedia, Planung eines Dorfplans: http://goo.gl/8dhfKKhttp://goo.gl/8dhfKK
●
Don't Panic Drupal Bild:Don't Panic Drupal Bild:
http://aaronwinborn.com/sites/aaronwinborn.com/files/drupal-panic.jpghttp://aaronwinborn.com/sites/aaronwinborn.com/files/drupal-panic.jpg
●
Welcome to the Project Bild: http://marabesi.com/tag/legacy-code/Welcome to the Project Bild: http://marabesi.com/tag/legacy-code/
Folie 83 von 84
Diskussionsrunde

Drupal Basics (7-8) Vortrag (01.2016)

  • 1.
    Drupal BasicsDrupal Basics Vortragvon Peter MajmeskuVortrag von Peter Majmesku „„Come for the software, stay for the community.“Come for the software, stay for the community.“ - Das Motto von Drupal.- Das Motto von Drupal.
  • 2.
    Zur PersonZur Person –Fachinformatiker für AnwendungsentwicklungFachinformatiker für Anwendungsentwicklung – 5 Jahre und 8 Monate Drupal.org User5 Jahre und 8 Monate Drupal.org User – Erstes Drupal Camp in Essen 2010Erstes Drupal Camp in Essen 2010 – DrupalCon London 2011, München 2012,DrupalCon London 2011, München 2012, Amsterdam 2014 ...Amsterdam 2014 ... – Habe mit dem Drupal Erfinder Dries Buytaert BierHabe mit dem Drupal Erfinder Dries Buytaert Bier getrunken :)getrunken :) – Erfahrung als Freelancer und AngestellterErfahrung als Freelancer und Angestellter EntwicklerEntwickler – Maintainer von Modulen auf Drupal.orgMaintainer von Modulen auf Drupal.org FolieFolie 22 vonvon 8484
  • 3.
    ReferenzenReferenzen – Drupal:Drupal: ● Als Externerbeim Bravo.de Relaunch TeamAls Externer beim Bravo.de Relaunch Team ● 2 Jahre angestellt für Betrieb von PV.tv (ehemals bekanntes2 Jahre angestellt für Betrieb von PV.tv (ehemals bekanntes Online-Portal im Solaranlagen-Sektor – Firma insolvent)Online-Portal im Solaranlagen-Sektor – Firma insolvent) ● Eigenverantwortliche Umsetzung mit Design-Zuarbeit beiEigenverantwortliche Umsetzung mit Design-Zuarbeit bei Agentur-Projekt: redner.jochen-schweizer.deAgentur-Projekt: redner.jochen-schweizer.de ● OpenSource Aktivitäten mit Modulen auf Drupal.org:OpenSource Aktivitäten mit Modulen auf Drupal.org: Permissions by Term, Auction, Ubercart AuctionPermissions by Term, Auction, Ubercart Auction – PHP:PHP: ● Webbasierter Passwort Manager „YiiPass“ auf GitHubWebbasierter Passwort Manager „YiiPass“ auf GitHub ● Erfahrung als angestellter PHP-Softwareentwickler beimErfahrung als angestellter PHP-Softwareentwickler beim Onlineshop Babymarkt.deOnlineshop Babymarkt.de ● Refaktorierung von 10 Jahre alter Code-Basis beiRefaktorierung von 10 Jahre alter Code-Basis bei Casamundo.de mit Yii2 Framework als ExternerCasamundo.de mit Yii2 Framework als Externer FolieFolie 33 vonvon 8484
  • 4.
  • 5.
  • 6.
    Drupal allgemeinDrupal allgemein ● ContentManagement System und PHP-FrameworkContent Management System und PHP-Framework ● Eignet sich gut als Community PlattformEignet sich gut als Community Plattform ● Erste veröffentlichte Version 15. Januar 2001Erste veröffentlichte Version 15. Januar 2001 ● Motto: „Come for the software. Stay for the community.“Motto: „Come for the software. Stay for the community.“ ● ● ● ● Drupal 8 am 19. November 2015 veröffentlichtDrupal 8 am 19. November 2015 veröffentlicht ● Alle Modul-Maintainer wurden geprüftAlle Modul-Maintainer wurden geprüft ● Sehr viele freie Module und ThemesSehr viele freie Module und Themes ● Komplex: Drupal ist Software für Agenturen und IT affine MenschenKomplex: Drupal ist Software für Agenturen und IT affine Menschen FolieFolie 66 vonvon 8484 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 7.
    So viele OpenSourceCMSSo viele OpenSource CMS FolieFolie 77 vonvon 8484 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 8.
    Welche Unternehmen stehenWelcheUnternehmen stehen dahinter?dahinter? FolieFolie 88 vonvon 8484 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 9.
    Wordpress ist dochviel beliebterWordpress ist doch viel beliebter FolieFolie 99 vonvon 8484 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 10.
    Darum Drupal: Drupalist EnterpriseDarum Drupal: Drupal ist Enterprise FolieFolie 1010 vonvon 8484 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 11.
    Gründe für meineEntscheidung (2011)Gründe für meine Entscheidung (2011) FolieFolie 1111 vonvon 8484 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation ● Wordpress konnte nicht:Wordpress konnte nicht: ● Navigation mit unendlich vielen EbenenNavigation mit unendlich vielen Ebenen ● Inhaltstypen und FelderInhaltstypen und Felder ● CakePHP 2.x (Access Control Lists):CakePHP 2.x (Access Control Lists): ● überschritt PHP Know-How Level und Zeitaufwandüberschritt PHP Know-How Level und Zeitaufwand ● Feingranulares Berechtigungssystem bei Drupal bereits fertigFeingranulares Berechtigungssystem bei Drupal bereits fertig und mit grafischer Oberflächeund mit grafischer Oberfläche ● Typo3:Typo3: ● Icons waren schwer zu verstehenIcons waren schwer zu verstehen ● Bei Drupal Menüpunkte im Admin-Bereich in TextformBei Drupal Menüpunkte im Admin-Bereich in Textform ● Community:Community: ● Drupal User Group traf sich jeden Monat im essenerDrupal User Group traf sich jeden Monat im essener UnperfekthausUnperfekthaus ● Informative Camps und gesellige PartiesInformative Camps und gesellige Parties ● Drupal Leute waren nett (die im PHP/HTML/CSS Forum nicht)Drupal Leute waren nett (die im PHP/HTML/CSS Forum nicht)
  • 12.
    Weitere GründeWeitere Gründe FolieFolie1212 vonvon 8484 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation Ich musste weniger Vertrieb machen und konnte größeren monetärenIch musste weniger Vertrieb machen und konnte größeren monetären Gewinn machen, da ich umfangreichere Lösungen anbieten konnte.Gewinn machen, da ich umfangreichere Lösungen anbieten konnte. ● CMS-Funktion: jaCMS-Funktion: ja ● Community Funktion: jaCommunity Funktion: ja ● Shopfunktion: jaShopfunktion: ja ● Auktionsfunktion: jaAuktionsfunktion: ja ● Forum: jaForum: ja ...... Das alles ging „überhaupt“, war erweiterbar (wenn auch schwer) undDas alles ging „überhaupt“, war erweiterbar (wenn auch schwer) und alles unter einer System-Architektur.alles unter einer System-Architektur. Wordpress Blog:Wordpress Blog: Umsetzungsdauer 2 WochenUmsetzungsdauer 2 Wochen Gambio GX Fertigshop:Gambio GX Fertigshop: Umsetzungsdauer 1 MonatUmsetzungsdauer 1 Monat Drupal Website:Drupal Website: Umsetzungsdauer halbes JahrUmsetzungsdauer halbes Jahr Drupal war schon damals Update fähig.Drupal war schon damals Update fähig. Drupal ist und war qualitativ besser zuDrupal ist und war qualitativ besser zu programmieren als Wordpress undprogrammieren als Wordpress und Gambio GX.Gambio GX.
  • 13.
  • 14.
    SystemvoraussetzungenSystemvoraussetzungen FolieFolie 1414 vonvon8484 ● Erfahrungsgemäß 256 MB PHPErfahrungsgemäß 256 MB PHP Memory LimitMemory Limit ● 1 SQL kompatible Datenbank1 SQL kompatible Datenbank (MySQL empfohlen)(MySQL empfohlen) ● Min. PHP 5.5.9 (Drupal 8), min. PHP 5.2.5Min. PHP 5.5.9 (Drupal 8), min. PHP 5.2.5 (Drupal 7)(Drupal 7) ● Drupal 8 funktioniert mit PHP 7Drupal 8 funktioniert mit PHP 7 ● Apache, Nginx oder IIS Webserver – einfachsteApache, Nginx oder IIS Webserver – einfachste Konfiguration auf Apache WebserverKonfiguration auf Apache Webserver AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 15.
    Vorab EinstellungenVorab Einstellungen FolieFolie1515 vonvon 8484 Vor Installation sites/default/default.settings.php Datei kopierenVor Installation sites/default/default.settings.php Datei kopieren und als sites/default/settings.php Datei benennen.und als sites/default/settings.php Datei benennen. Schreibrechte auf Linux (Unix kompatiblem)Schreibrechte auf Linux (Unix kompatiblem) Dateisystem beim „sites“-Ordner einstellen:Dateisystem beim „sites“-Ordner einstellen: ● sites --> 775sites --> 775 ● sites/default -->775sites/default -->775 ● sites/default/files --> 775sites/default/files --> 775 ● sites/default/settings.php --> vor Installation 777,sites/default/settings.php --> vor Installation 777, danach aus Sicherheitsgründen 444danach aus Sicherheitsgründen 444 Hinweis:Hinweis: Unter Windows (zum Testen/Spielen) werden keineUnter Windows (zum Testen/Spielen) werden keine Schreibrechte-Einstellungen benötigt.Schreibrechte-Einstellungen benötigt. AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 16.
    Installationsprozedur im BrowserInstallationsprozedurim Browser FolieFolie 1616 vonvon 8484 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 17.
    Installationsprozedur mit „Drush“Installationsprozedurmit „Drush“ FolieFolie 1717 vonvon 8484 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 18.
    Installationsvorgang wenn allespasstInstallationsvorgang wenn alles passt FolieFolie 1818 vonvon 8484 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 19.
    Installationsprofile für Shops,Installationsprofilefür Shops, Projektmanagement etc.Projektmanagement etc. FolieFolie 1919 vonvon 8484 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation Z.B. Shopsystem: Commerce Kickstart, Projektmanagement: Open AtriumZ.B. Shopsystem: Commerce Kickstart, Projektmanagement: Open Atrium
  • 20.
    Zentrale Drupal Probleme-Anlaufstelle:ZentraleDrupal Probleme-Anlaufstelle: http://drupal.org/project/issues:http://drupal.org/project/issues: Folie 20 von 84 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 21.
  • 22.
    Content Types (Inhaltstypenv. Nodes)Content Types (Inhaltstypen v. Nodes) FolieFolie 2222 vonvon 8484 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 23.
    Fields (Felder)Fields (Felder) FolieFolie2323 vonvon 8484 Felder Übersicht:Felder Übersicht: Feld Typen:Feld Typen: AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 24.
    Views (Ansichten)Views (Ansichten) FolieFolie2424 vonvon 8484 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 25.
    Blocks (Blöcke)Blocks (Blöcke) FolieFolie2525 vonvon 8484 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 26.
    Taxonomy VocabulariesTaxonomy Vocabularies (TaxonomieVokabulare)(Taxonomie Vokabulare) FolieFolie 2626 vonvon 8484 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 27.
    Taxonomy TermsTaxonomy Terms FolieFolie2727 vonvon 8484 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 28.
    User (Benutzer)User (Benutzer) FolieFolie2828 vonvon 8484 Unterschiedliche Benutzerrollen Berechtigungen zusammengefasst nach (Core)-Modul AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 29.
    Backend für RedakteureerfordertBackend für Redakteure erfordert EinstellungenEinstellungen FolieFolie 2929 vonvon 8484 Tipps für Maßnahmen:Tipps für Maßnahmen: ● Redakteure sind keine Admins:Redakteure sind keine Admins: ● Benutzerrolle für Redakteure anlegen und BerechtigungenBenutzerrolle für Redakteure anlegen und Berechtigungen zuweisenzuweisen ● Toolbar ausblenden und eigenes Menü mit nur für RedakteureToolbar ausblenden und eigenes Menü mit nur für Redakteure relevanten Menüpunkten anzeigenrelevanten Menüpunkten anzeigen ● Bilder-Dateimanager installieren (IMCE)Bilder-Dateimanager installieren (IMCE) ● WYSIWYG-Editor Buttons einschränken (z.B. nur fett, kursiv,WYSIWYG-Editor Buttons einschränken (z.B. nur fett, kursiv, unterstrichen und Absätze)unterstrichen und Absätze) ● Dashboard erstellen mit Content- und Nutzer-ÜbersichtDashboard erstellen mit Content- und Nutzer-Übersicht ● Gebrauchsanleitung erstellen:Gebrauchsanleitung erstellen: ● Screenshots und Beschreibungen anfertigenScreenshots und Beschreibungen anfertigen ● Tour-Modul schreiben, welches dem Redakteur Einweisung gibt.Tour-Modul schreiben, welches dem Redakteur Einweisung gibt. ● Alles was Redakteure nicht brauchen: ausblenden und ZugangAlles was Redakteure nicht brauchen: ausblenden und Zugang verwehren.verwehren. AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 30.
  • 32.
    DB-StrukturDB-Struktur ● SQL DatenbanksystemeSQL Datenbanksysteme ● Leichtzugänglicher DB AufbauLeicht zugänglicher DB Aufbau – Keine SQL-Views oder Stored ProceduresKeine SQL-Views oder Stored Procedures – Keine Primär- und FremdschlüsselKeine Primär- und Fremdschlüssel ● Vorsicht vor nicht mehr referenzierbaren DatensätzenVorsicht vor nicht mehr referenzierbaren Datensätzen ● Ab Drupal 7 Inno DB als DB-Engine (davor MyISAM)Ab Drupal 7 Inno DB als DB-Engine (davor MyISAM) – Transaktionen, Fremdschlüssel, auf große Datenmengen optimiertTransaktionen, Fremdschlüssel, auf große Datenmengen optimiert ● Caching in DatenbankCaching in Datenbank ● Bis Drupal 7 Konfiguration hauptsächlich in DatenbankBis Drupal 7 Konfiguration hauptsächlich in Datenbank ● Div. Module für Caching in NonSQL-DatenbankenDiv. Module für Caching in NonSQL-Datenbanken FolieFolie 3232 vonvon 8484 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 33.
    Ordner-StrukturOrdner-Struktur ● Drupal 7:Drupal 7: –/sites enthält Erweiterungen (eigene Module und Themes)/sites enthält Erweiterungen (eigene Module und Themes) und Konfigurationund Konfiguration – Alle anderen Ordner sind „core“Alle anderen Ordner sind „core“ ● Drupal 8:Drupal 8: – /sites gibt es weiterhin/sites gibt es weiterhin – /core enthält Core Module und Themes/core enthält Core Module und Themes – /modules und /themes halten eigene Module und Themes/modules und /themes halten eigene Module und Themes – /vendor enthält PHP-Libraries/vendor enthält PHP-Libraries ● Details auf Drupal.org in Community DocumentationDetails auf Drupal.org in Community Documentation Hinweis:Hinweis: Kopieren von eigenen Dateien oder Erweiterungen in Core-Kopieren von eigenen Dateien oder Erweiterungen in Core- Ordner schafft Chaos und macht Update schwierigOrdner schafft Chaos und macht Update schwierig FolieFolie 3333 vonvon 8484 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 34.
    Warum /sites?Warum /sites? ● Multi-SiteFähigkeitMulti-Site Fähigkeit – 1 Codebasis1 Codebasis – Unendlich viele SeitenUnendlich viele Seiten – Komfortables Zurückgreifen auf Stamm anKomfortables Zurückgreifen auf Stamm an ErweiterungenErweiterungen – Getrennte DatenbankenGetrennte Datenbanken ● Multi-Site Fähigkeit ist zu unterscheiden vonMulti-Site Fähigkeit ist zu unterscheiden von mehrsprachiger Seitemehrsprachiger Seite FolieFolie 3434 vonvon 8484 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 35.
    Eigenes Modul schreibenist einfachEigenes Modul schreiben ist einfach ● Unter /sites/all/modules und bestehend aus:Unter /sites/all/modules und bestehend aus: – Ordner mit Maschinenname („mein_modul“)Ordner mit Maschinenname („mein_modul“) – Info-Datei mit MaschinennameInfo-Datei mit Maschinenname – Module-Datei mit MaschinennameModule-Datei mit Maschinenname ● Zum Beispiel:Zum Beispiel: – /myquiz/myquiz – /myquiz/myquiz.info/myquiz/myquiz.info – /myquiz/myquiz.module/myquiz/myquiz.module FolieFolie 3535 vonvon 8484 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation Hinweis: In Info- und Module-Datei können andere PHP-Dateien wie Klassen und Autoloader (z.B. Composer) referenziert werden.
  • 36.
    Beispiel für eigenesDrupal-ModulBeispiel für eigenes Drupal-Modul Info-Datei registriert Modul im Drupal.Info-Datei registriert Modul im Drupal. mygame.info:mygame.info: FolieFolie 3636 vonvon 8484 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation Hinweis zu Drupal-Hooks:Hinweis zu Drupal-Hooks: „hook“ in Drupal API-Funktion ist nur ein„hook“ in Drupal API-Funktion ist nur ein Platzhalter für den Maschinennamen des Moduls oder Themes.Platzhalter für den Maschinennamen des Moduls oder Themes. Hooks „haken“ sich in bestehenden Programmablauf ein.Hooks „haken“ sich in bestehenden Programmablauf ein.
  • 37.
    Beispiel für eigenesDrupal-ModulBeispiel für eigenes Drupal-Modul Module-Datei enthält Modul-Logik.Module-Datei enthält Modul-Logik. mygame.module:mygame.module: FolieFolie 3737 vonvon 8484 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 38.
    Best PracticesBest Practices ● Nutzungder Drupal APIsNutzung der Drupal APIs – https://api.drupal.org/api/drupalhttps://api.drupal.org/api/drupal ● Listen ErstellungListen Erstellung – Views Modul (besonders gut für Frontend-Leute, da Klick-Oberfläche)Views Modul (besonders gut für Frontend-Leute, da Klick-Oberfläche) – DB-Layer zur Datenbankabfrage mit Render-ArraysDB-Layer zur Datenbankabfrage mit Render-Arrays ● Logik in Modul oder bei kleinen Template-Anpassungen inLogik in Modul oder bei kleinen Template-Anpassungen in template.php ablegentemplate.php ablegen ● Drupal Coding Standards (unterstützt PhpStorm IDE)Drupal Coding Standards (unterstützt PhpStorm IDE) ● Nicht für alles ein Modul suchenNicht für alles ein Modul suchen →→ Overhead bedenkenOverhead bedenken ● Datenbank mit nützlichen Modulen in Wiki pflegenDatenbank mit nützlichen Modulen in Wiki pflegen FolieFolie 3838 vonvon 8484 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 39.
    DB-Queries in D7und D8DB-Queries in D7 und D8 FolieFolie 3939 vonvon 8484 Drupal 7 DB-Funktion basierend auf PDO:Drupal 7 DB-Funktion basierend auf PDO: Drupal 8 Database Objekt mit Fluent Interface:Drupal 8 Database Objekt mit Fluent Interface: AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 40.
    Drupal 8: schnellereDrupal8: schnellere ProgrammierungProgrammierung FolieFolie 4040 vonvon 8484 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 41.
    Drupal 8 CodeTippsDrupal 8 Code Tipps FolieFolie 4141 vonvon 8484 Entity Manager: Abfrage von Daten bereits im Drupal Kontext:Entity Manager: Abfrage von Daten bereits im Drupal Kontext: Drupal 8 ist häufig abwärts kompatibel zu Drupal 7 Funktionen:Drupal 8 ist häufig abwärts kompatibel zu Drupal 7 Funktionen: AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 42.
    Drupal Module: Projekteauf Drupal.orgDrupal Module: Projekte auf Drupal.org Folie 42 von 84 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 43.
    Drupal Module: Projekteauf Drupal.orgDrupal Module: Projekte auf Drupal.org Folie 43 von 84 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 44.
    Der Googler, derProgrammierer,Der Googler, der Programmierer, der Site-Builderder Site-Builder Folie 44 von 84 ● Arbeite ich mit dem Framework oder schon dagegen?Arbeite ich mit dem Framework oder schon dagegen? ● Wieviel Overhead habe ich?Wieviel Overhead habe ich? ● Erfolg in kurzer Zeit gegen mittelfristige Probleme inErfolg in kurzer Zeit gegen mittelfristige Probleme in Erweiter- und Anpassbarbarkeit?Erweiter- und Anpassbarbarkeit? AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 45.
    Performance-TippsPerformance-Tipps ● Caching in StandardEinstellungen einschalten:Caching in Standard Einstellungen einschalten: – CSS/JavaScript KompressionCSS/JavaScript Kompression – Blöcke + Pages KompressionBlöcke + Pages Kompression ● PHP OPCode cachenPHP OPCode cachen ● Unnötige SQL-Abfragen vermeiden (Achillesferse von Drupal)Unnötige SQL-Abfragen vermeiden (Achillesferse von Drupal) – MySQL Slow LogMySQL Slow Log – Überblick über Abfragen verschaffen und optimieren (Logging in MySQL einschalten bzw.Überblick über Abfragen verschaffen und optimieren (Logging in MySQL einschalten bzw. Webprofiler Modul in D8 nutzen)Webprofiler Modul in D8 nutzen) – Drupal 8 Webprofiler zeigt nur erfolgreiche AbfragenDrupal 8 Webprofiler zeigt nur erfolgreiche Abfragen ● Xdebug Profiler nutzen und Cachegrind-Dateien auswerten (PHP Laufzeitdaten)Xdebug Profiler nutzen und Cachegrind-Dateien auswerten (PHP Laufzeitdaten) ● Eine aktuelle PHP Version nutzenEine aktuelle PHP Version nutzen ● Varnish CacheVarnish Cache ● CDN für Bilder und Assets (CSS/JS)CDN für Bilder und Assets (CSS/JS) FolieFolie 4545 vonvon 8484 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 46.
    Drupal Module: Projekteauf Drupal.org Folie 46 von 84 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 47.
    Es gibt nichtnur Drupal Module:Es gibt nicht nur Drupal Module: Composer Packages vonComposer Packages von Packagist.comPackagist.com FolieFolie 4747 vonvon 8484 ● PHP Pakete zur Installation über die KommandozeilePHP Pakete zur Installation über die Kommandozeile ● Teils abstrakte Funktionsbibliotheken, teils bereits Bezug zuTeils abstrakte Funktionsbibliotheken, teils bereits Bezug zu Anwendungszweck (z.B. Quiz)Anwendungszweck (z.B. Quiz) ● Nutzungsdaten von Anwendern auf Packagist.com sichtbarNutzungsdaten von Anwendern auf Packagist.com sichtbar ● Pakete haben Bezug zu Repository auf GitHub.comPakete haben Bezug zu Repository auf GitHub.com ● Ab PHP 5.3.2 ist Composer verfügbarAb PHP 5.3.2 ist Composer verfügbar AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 48.
    Verwaltung von KonfigurationVerwaltungvon Konfiguration in Drupal 7in Drupal 7● settings.phpsettings.php – Enthält z.B. DB-Verbindung, Überschreibt alle Variablen im Drupal KontextEnthält z.B. DB-Verbindung, Überschreibt alle Variablen im Drupal Kontext ● Features ModulFeatures Modul – Überträgt häufig genutzte Drupal Komponenten zwischen DatenbankenÜberträgt häufig genutzte Drupal Komponenten zwischen Datenbanken – Erzeugt ModuleErzeugt Module ● Configuration Management ModulConfiguration Management Modul – Ähnlich Features ModulÄhnlich Features Modul – Lässt sich nicht zur Modulerzeugung verwendenLässt sich nicht zur Modulerzeugung verwenden ● Reduziert FehlerquelleReduziert Fehlerquelle ● Manuelles Deployment per Copy, Click and PasteManuelles Deployment per Copy, Click and Paste ● hook_update(); und hook_install();hook_update(); und hook_install(); Folie 48 von 84 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 49.
    Verwaltung von KonfigurationVerwaltungvon Konfiguration in Drupal 8in Drupal 8● settings.phpsettings.php – Überschreibt weiterhin alle VariablenÜberschreibt weiterhin alle Variablen ● Konfiguration kann nun in YML-Dateien exportiertKonfiguration kann nun in YML-Dateien exportiert und daraus eingelesen werdenund daraus eingelesen werden ● Konfiguration kann versioniert werdenKonfiguration kann versioniert werden ● Kein Features Modul mehrKein Features Modul mehr ● Achtung: Module können KonfigurationAchtung: Module können Konfiguration überschreibenüberschreiben ● Copy and Paste funktioniert weiterhinCopy and Paste funktioniert weiterhin Folie 49 von 84 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 50.
    MehrsprachigkeitMehrsprachigkeit ● Englisch ist Grundsprachein D7Englisch ist Grundsprache in D7 ● Pluralformen müssen getrennt übersetzt werdenPluralformen müssen getrennt übersetzt werden ● Übersetzungen landen über t(); PHP-Funktion in Datenbank und gebenÜbersetzungen landen über t(); PHP-Funktion in Datenbank und geben Übersetzungen ausÜbersetzungen aus ● „„Localization update“ aktualisiert Übersetzungen von localize.drupal.org.Localization update“ aktualisiert Übersetzungen von localize.drupal.org. ● Drupal 7 Core-Funktionalität reicht nicht für Mehrsprachigkeit: i18n ModulDrupal 7 Core-Funktionalität reicht nicht für Mehrsprachigkeit: i18n Modul nötignötig ● Drupal 8Drupal 8 – Core Umfang verspricht für vollständige MehrsprachigkeitCore Umfang verspricht für vollständige Mehrsprachigkeit ausreichend zu seinausreichend zu sein – Englisch kann als Sprache entfernt werdenEnglisch kann als Sprache entfernt werden – Jede Sprache kann Grundsprache seinJede Sprache kann Grundsprache sein Folie 50 von 84 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 51.
    Drupal ist nichtabgeschottet:Drupal ist nicht abgeschottet: oTranCe als ÜbersetzungstooloTranCe als Übersetzungstool Folie 51 von 84 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation Alle Texte können auf einer Seite übersetzt werden.
  • 52.
    oTranCeoTranCe Folie 52 von84 ● Keine Übersetzung von Text (Strings), es werdenKeine Übersetzung von Text (Strings), es werden Schlüssel (Array-Keys) übersetztSchlüssel (Array-Keys) übersetzt ● Einfach: Export der Übersetzungen als PHP-Einfach: Export der Übersetzungen als PHP- Dateien mit Arrays zur WeiterverarbeitungDateien mit Arrays zur Weiterverarbeitung ● Workflow für Übersetzer im Web-FrontendWorkflow für Übersetzer im Web-Frontend einfach: Klick auf Text öffnet Formularfeld füreinfach: Klick auf Text öffnet Formularfeld für die Übersetzungdie Übersetzung ● Getrennt von HauptsystemGetrennt von Hauptsystem ● Große Websites und Agenturen setzen es einGroße Websites und Agenturen setzen es ein AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 53.
    EntitiesEntities ● Seit Drupal 7ist „fast alles“ eine EntitätSeit Drupal 7 ist „fast alles“ eine Entität ● Bei Drupal 8 allesBei Drupal 8 alles ● Eine Entität ist ein eindeutig zu bestimmendesEine Entität ist ein eindeutig zu bestimmendes Objekt:Objekt: – UserUser – TaxonomyTaxonomy – ContentContent – CommentsComments – FilesFiles ● Entity-Types ähneln Models aus ORM BibliothekenEntity-Types ähneln Models aus ORM Bibliotheken Folie 53 von 84 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 54.
    Zugriff auf Feldwert:Zugriffauf Feldwert: Entity Metadata WrapperEntity Metadata Wrapper Folie 54 von 84 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation Beispiel aus Drupal 7:Beispiel aus Drupal 7:
  • 55.
    Module: Devel +Krumo SearchModule: Devel + Krumo Search Folie 55 von 84 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation Der Objekte-/Array-Stack kann durchsucht werden. Mit Mausklicks können die Dimensionen aufgeklappt werden. Wert-Pfad kann kopiert werden. Den aber bitte nicht benutzen! Entity Metadata Wrapper nutzen.
  • 56.
    In Objekte Stacksnavigieren/debuggenIn Objekte Stacks navigieren/debuggen ● Devel + Search Krumo Modul:Devel + Search Krumo Modul: – dpm() PHP-Funktion gibt Stack als klickbares Objekt imdpm() PHP-Funktion gibt Stack als klickbares Objekt im Browser aus, welches durchsucht werden kannBrowser aus, welches durchsucht werden kann – SeiteSeite http://DOMAIN/devel/phphttp://DOMAIN/devel/php erlaubt PHP Eingabe fürerlaubt PHP Eingabe für EntwicklerEntwickler – SeiteSeite http://DOMAIN/devel/phpinfohttp://DOMAIN/devel/phpinfo zeigt phpinfo() Ausgabezeigt phpinfo() Ausgabe ● Xdebug (Erweiterung für PHP):Xdebug (Erweiterung für PHP): – Stack kann in IDE (z.B. PhpStorm) durchsucht werdenStack kann in IDE (z.B. PhpStorm) durchsucht werden – Objekte können zur Laufzeit evaluiert werdenObjekte können zur Laufzeit evaluiert werden ● Devel, Krumo Search und XDebug sparen Zeit undDevel, Krumo Search und XDebug sparen Zeit und NervenNerven Folie 56 von 84 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 57.
    Funktionsstack zur PHP-LaufzeitFunktionsstackzur PHP-Laufzeit inspizieren: XDebug + PhpStorminspizieren: XDebug + PhpStorm Folie 57 von 84 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 58.
    Xdebug mit IDEUnterstützungXdebug mit IDE Unterstützung ● var_dump() und print_r() zu schreiben ist oftvar_dump() und print_r() zu schreiben ist oft langsamlangsam ● Beim Aufruf einer Seite kann der PHP-Beim Aufruf einer Seite kann der PHP- Programmablauf mit dem Debugger durchgestepptProgrammablauf mit dem Debugger durchgesteppt werden (jemand nannte das mal „richtig Debuggen“)werden (jemand nannte das mal „richtig Debuggen“) ● Während der Programmlaufzeit können MethodenWährend der Programmlaufzeit können Methoden und Funktionen mit Parametern „ausprobiert“ werdenund Funktionen mit Parametern „ausprobiert“ werden ● Nachteil: manchmal stürzt der Debugging-VorgangNachteil: manchmal stürzt der Debugging-Vorgang plötzlich ab. PHP OPCode Cache Ausschalten kannplötzlich ab. PHP OPCode Cache Ausschalten kann helfen.helfen. Folie 58 von 84 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 59.
    Funktionsstack zur PHP-LaufzeitFunktionsstackzur PHP-Laufzeit inspizieren: XDebug + PhpStorminspizieren: XDebug + PhpStorm Folie 59 von 84 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 60.
    PHP-Profiling: Xdebug +QCachegrindPHP-Profiling: Xdebug + QCachegrind Folie 60 von 84 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 61.
    Suche ● Drupal Standard Suchefunktionsarm und langsamDrupal Standard Suche funktionsarm und langsam ● Search API ModulSearch API Modul ● TeilwortsucheTeilwortsuche ● Apache Solr und Elasticsearch SchnellstartmodulApache Solr und Elasticsearch Schnellstartmodul ● Gibt Suchergebnisseiten als Views ausGibt Suchergebnisseiten als Views aus ● Bei Performance-Bedarf kann einfach von MySQL-DB Index aufBei Performance-Bedarf kann einfach von MySQL-DB Index auf Apache Solr Index umgeschaltet werdenApache Solr Index umgeschaltet werden ● Custom LösungCustom Lösung – Elasticsearch ist einfacher als Apache Solr zu handhabenElasticsearch ist einfacher als Apache Solr zu handhaben ● Google Page SearchGoogle Page Search Folie 61 von 84 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 62.
    TestingTesting ● PHPUnit für UnitTestsPHPUnit für Unit Tests – Ideal um eigene Code-Bibliotheken zu testenIdeal um eigene Code-Bibliotheken zu testen – Der Schlüssel ist die eigenen Algorithmen zu testenDer Schlüssel ist die eigenen Algorithmen zu testen – MockingMocking – DatasourcesDatasources ● Simple Test für Funktionale TestsSimple Test für Funktionale Tests – Ohne Browser verschiedene Interaktionen ausführen (z.B. einloggen und ausloggen)Ohne Browser verschiedene Interaktionen ausführen (z.B. einloggen und ausloggen) ● Codeception für AkzeptanztestsCodeception für Akzeptanztests – Praktisch für das Testen eines Projektes im BrowserPraktisch für das Testen eines Projektes im Browser – Headless Browser simuliert den KundenHeadless Browser simuliert den Kunden – Screenshots mit Slideshow bei FehlernScreenshots mit Slideshow bei Fehlern ● Mit meiner Vagrant Box GaiaVagrant könnt ihr sofort loslegen:Mit meiner Vagrant Box GaiaVagrant könnt ihr sofort loslegen: https://github.com/jepster/GaiaVagranthttps://github.com/jepster/GaiaVagrant + https://github.com/jepster/GaiaD8+ https://github.com/jepster/GaiaD8 Folie 62 von 84 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 63.
    PHP-Unit Testlauf inIDEPHP-Unit Testlauf in IDE Folie 63 von 84 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 64.
    PHPUnit BeispielePHPUnit Beispiele ● MeinDrupal 8 Modul Permissions by Term:Mein Drupal 8 Modul Permissions by Term: – https://www.drupal.org/project/permissions_by_termhttps://www.drupal.org/project/permissions_by_term ● PHPUnit ist gut dokumentiert:PHPUnit ist gut dokumentiert: – https://phpunit.de/manual/current/en/index.htmlhttps://phpunit.de/manual/current/en/index.html Folie 64 von 84 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 65.
    Codeception + PhantomJSCodeception+ PhantomJS Folie 65 von 84 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 66.
    Simple Syntax, schnellesTest- Schreiben Folie 66 von 84 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 67.
  • 68.
    Theming Guide aufdrupal.orgTheming Guide auf drupal.org FolieFolie 6868 vonvon 8484 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 69.
    Entwickler-Themes auf Drupal.orgEntwickler-Themesauf Drupal.org FolieFolie 6969 vonvon 8484 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 70.
    Premium Themes aufThemeforestPremium Themes auf Themeforest FolieFolie 7070 vonvon 8484 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 71.
    Themes und Sub-ThemesThemesund Sub-Themes FolieFolie 7171 vonvon 8484 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 72.
    Eigenes Theme erstellenEigenesTheme erstellen ● Einen Theme Maschinen-Namen festlegen (z.B. kernpunkt)Einen Theme Maschinen-Namen festlegen (z.B. kernpunkt) ● Theme Ordner in sites/all/themes anlegenTheme Ordner in sites/all/themes anlegen ● Wenige Konfigurationsdateien damit Theme einschaltbar istWenige Konfigurationsdateien damit Theme einschaltbar ist ● Template-Dateien werden aus Core kopiert (Core istTemplate-Dateien werden aus Core kopiert (Core ist Haupttheme)Haupttheme) ● Vorteil: weniger OverheadVorteil: weniger Overhead ● Nachteil: Template-Dateien müssen gesucht werdenNachteil: Template-Dateien müssen gesucht werden FolieFolie 7272 vonvon 8484 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 73.
    Drupal 7 ThemingMerklisteDrupal 7 Theming Merkliste Folie 73 von 84 ● Bereiche (Sidebar, Content-Bereich etc.) sindBereiche (Sidebar, Content-Bereich etc.) sind RegionenRegionen ● template.php Datei enthält Theme-Logiktemplate.php Datei enthält Theme-Logik ● Module + Views bringen eigenes Markup mitModule + Views bringen eigenes Markup mit ● Drupal bringt eigene jQuery Version mitDrupal bringt eigene jQuery Version mit ● Für alle Bereiche auf der Seite gibt es .tpl-DateienFür alle Bereiche auf der Seite gibt es .tpl-Dateien ● Keine Datenbankabfragen in Template-DateienKeine Datenbankabfragen in Template-Dateien ● PHP-Klassen haben nichts im Theme-OrdnerPHP-Klassen haben nichts im Theme-Ordner verloren – Drupal Modul erstellenverloren – Drupal Modul erstellen AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 74.
    Drupal 7 ThemeStrukturDrupal 7 Theme Struktur Folie 74 von 84 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 75.
    Drupal 7 MothershipTheme -Drupal 7 Mothership Theme - weniger ist mehrweniger ist mehr Folie 75 von 84 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 76.
    hook_theme();hook_theme(); Folie 76 von84 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation Zur Trennung von Logik von HTML-Markup mittels Template Dateien bei Drupal 7 + 8. Kann in Modul und template.php Datei des Themes benutzt werden. Vorgang besteht aus: ● Template Datei enthält HTML-Markup und Variablen ● hook_theme(); enthält Definition der Template-Funktion ● Aufruf der Template-Funktion. Sie nimmt Parameter-Variablen an und setzt sie in HTML-Markup ein Hinweis: Bei Drupal 7 enthalten die Template-Dateien neben HTML auch PHP wegen der PhpTemplate Engine. Bei Drupal 8 ist in den Template-Dateien kein PHP mehr enthalten. Da ist es Twig-Markup.
  • 77.
    Beispiel für EinsatzvonBeispiel für Einsatz von hook_theme(); in Drupal 7hook_theme(); in Drupal 7 Folie 77 von 84 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation Das HTML-Markup mit Variablen unter templates/timer_and_points.tpl.php:
  • 78.
    Beispiel hook_theme(); (D7)Beispielhook_theme(); (D7) Folie 78 von 84 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation Defintion der Template-Funktion.
  • 79.
    Beispiel hook_theme(); (D7)Beispielhook_theme(); (D7) Folie 79 von 84 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation Aufruf eigener Template-Funktion für HTML-Markup mit Werten (Themed Output). theme() gibt HTML-Markup mit Variablen-Werten aus.
  • 80.
    Twig – Drupal8 Theme EngineTwig – Drupal 8 Theme Engine Folie 80 von 84 ● Kein PHP Code mehr imKein PHP Code mehr im TemplateTemplate ● Entwickler/Themer könnenEntwickler/Themer können nicht mehr so gut böse Dingenicht mehr so gut böse Dinge tuntun AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 81.
    Twig BasicsTwig Basics ● Ausgabenmit {{ }} (z.B. {{ dump(variable) }})Ausgaben mit {{ }} (z.B. {{ dump(variable) }}) ● Kommandos (z.B. Schleifen) mit {% %}Kommandos (z.B. Schleifen) mit {% %} ● Kommentare mit {# #}Kommentare mit {# #} ● Keine gemischten Datentypen mehr (Objekte, Strings, Array)Keine gemischten Datentypen mehr (Objekte, Strings, Array) ● Keine Theme Funktionen mehrKeine Theme Funktionen mehr ● Twig Dateien werden nur einmal gelesen und dann in denTwig Dateien werden nur einmal gelesen und dann in den Dateisystem-Cache kompiliertDateisystem-Cache kompiliert ● Twig wird in vielen PHP-Projekten eingesetzt; nicht nur DrupalTwig wird in vielen PHP-Projekten eingesetzt; nicht nur Drupal ● Twig ist eine Symfony Component und unabhängig vomTwig ist eine Symfony Component und unabhängig vom Symfony Full Stack Framework nutzbarSymfony Full Stack Framework nutzbar Folie 81 von 84 AllgemeinesAllgemeines InhaltestrukturInhaltestruktur BackendBackend FrontendFrontendInstallationInstallation
  • 82.
    Vielen Dank fürEure Aufmerksamkeit!Vielen Dank für Eure Aufmerksamkeit!
  • 83.
    QuellenQuellen ● Blonde Frau aufder Suche:Blonde Frau auf der Suche: http://www.alleycatdigitaldesigns.com/wp-content/uploads/2015/06/arizona-search-http://www.alleycatdigitaldesigns.com/wp-content/uploads/2015/06/arizona-search- engine-marketing.jpgengine-marketing.jpg ● CMS Übersicht:CMS Übersicht: http://cms-garden.orghttp://cms-garden.org ● Drupal Facts:Drupal Facts: http://www.drupal.orghttp://www.drupal.org ● Bild mit modularem Aufbau:Bild mit modularem Aufbau: http://www.bhkw-beispiele.de/projekt/bhkw-beispieldatenbank_modularer_aufbau.hhttp://www.bhkw-beispiele.de/projekt/bhkw-beispieldatenbank_modularer_aufbau.h tmltml ● Composer Logo:Composer Logo: https://getcomposer.org/https://getcomposer.org/ ● Drupal 7 Theme Struktur:Drupal 7 Theme Struktur: https://www.drupal.org/node/171194https://www.drupal.org/node/171194 ● Drupal, Wordpress, Joomla Vortrag Hagen Graf:Drupal, Wordpress, Joomla Vortrag Hagen Graf: http://goo.gl/3S58WVhttp://goo.gl/3S58WV ● Diskussionsbild – Wikipedia, Planung eines Dorfplans:Diskussionsbild – Wikipedia, Planung eines Dorfplans: http://goo.gl/8dhfKKhttp://goo.gl/8dhfKK ● Don't Panic Drupal Bild:Don't Panic Drupal Bild: http://aaronwinborn.com/sites/aaronwinborn.com/files/drupal-panic.jpghttp://aaronwinborn.com/sites/aaronwinborn.com/files/drupal-panic.jpg ● Welcome to the Project Bild: http://marabesi.com/tag/legacy-code/Welcome to the Project Bild: http://marabesi.com/tag/legacy-code/ Folie 83 von 84
  • 84.