Keine Lust auf türkis?

Thomas Aull :: Design + Code

5

Mein Staging-Production-Workflow mit ExpressionEngine

Artikel vom 2. Oktober 2011, von Thomas Aull in der Kategorie ExpressionEngine

In einem vergangenen Artikel habe ich es schon mal erwähnt: Meinen Webentwicklungs-Workflow habe ich so eingerichtet, dass ich meinen Kram erst mal lokal entwickle und später auf den Server schiebe. Nachdem ein Projekt dort liegt ist es aber selten abgeschlossen – oft muss man noch was ändern oder anpassen. Deshalb habe ich mal etwas recherchiert, wie man mit ExpressionEngine diese lokal-online-Workflow beibehalten kann ohne verrückt zu werden – das Ergebnis gebe ich natürlich gerne weiter.

Das Ziel ist, mit möglichst wenig manueller Anpassung eine komplette EE-Installation von der einen Umgebung (Lokal) in die andere (Server) verschieben zu können. Eine Ausnahme mache ich dabei normalerweise bei der Datenbank: Die verschiebe ich immer nur von Server zu Lokal weil ich Sachen direkt online einpflege und außerdem Inhalte von Nutzern (Kommentare, ...) verloren gehen könnten.

Also, an folgenden Stellen müssen wir Anpassungen vornehmen:

1. config.php

Pfad zur Datei: system/expressionengine/config/config.php

Geändert werden müssen hier alle Angaben, die irgendwelche Pfade angeben. Die meisten Änderungen kann man zwar auch direkt im CMS machen, aber genau das raubt uns dann wieder unsere gewünsche Flexibilität :-)

Mit folgenden Codezeilen erfragen wir uns beim Server unsere URL:

php
$base_url = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 
'https' : 'http');
$base_url .= '://'.$_SERVER['HTTP_HOST'];
$system_folder = 'system';

In der ersten Zeile wird erst mal gecheckt ob eine http:// oder eine https:// Verbindung besteht, in der zweiten Zeile wird dann die eigentliche URL zusammengebaut. In der Variable $system_folder steht dann noch der Name unseres Systemordners, der lautet normalerweise „system“, sollte aber aus Sicherheitsgründen angepasst werden (Näheres dazu steht in der UserGuide).

Mit den Variablen $base_url und $system_folder können wir dann arbeiten:

php
// URLs anhand der $base_url konfigurieren
$config['site_url'] = $base_url;
$config['cp_url'] = $base_url . '/' . $system_folder;
$config['server_path'] = $_SERVER['DOCUMENT_ROOT'];
$config['theme_folder_url'] = $base_url . '/themes/';
$config['theme_folder_path'] = $base_url . '/themes/';
$config['tmpl_file_basepath'] = $config['server_path'] . '/' . $system_folder . 
"/expressionengine/templates/";

$config['avatar_url'] = $base_url.'/images/avatars/';
$config['avatar_path'] = $config['server_path'].'/images/avatars/';
$config['photo_url'] = $base_url.'/images/member_photos/';
$config['photo_path'] = $config['server_path'].'/images/member_photos/';
$config['sig_img_url'] = $base_url.'/images/signature_attachments/';
$config['sig_img_path'] = $config['server_path'].'/images/signature_attachments/';
$config['prv_msg_upload_path'] = $config['server_path'].'/images/pm_attachments/';

Damit hätten wir alle URLs, die ExpressionEngine braucht variabel in der config hinterlegt – außer die Pfade zu unseren Bildupload-Ordnern. Dazu aber später.

2. database.php

Pfad zur Datei: system/expressionengine/config/database.php

Zwei Umgebungen – zwei Datenbanken. Da nicht davon auszugehen ist, dass für beide Datenbanken auch die gleichen Zugangsdaten verwendet werden, müssen wir hier auch flexibel auf die Umgebung reagieren:

Anhand dieser Zeile...

php
$lokal = ($_SERVER['SERVER_ADDR'] == '127.0.0.1') ? true : false;

fragen wir zuerst mal ab, auf welchem Server wir gerade sind (der lokale Server hat immer die localhost-IP 127.0.0.1). Dann können wir mit einer simplen if-Abfrage für die unterschiedlichen Umgebungen unterschiedliche Zugangsdaten hinterlegen:

php
// Lokal oder Server:
if($lokal)
{
	$db['expressionengine']['username'] = "username_lokal";
	$db['expressionengine']['password'] = "passwort_lokal";
	$db['expressionengine']['database'] = "datenbankname_lokal";
} else 
{
	$db['expressionengine']['username'] = "username_online";
	$db['expressionengine']['password'] = "passwort_online";
	$db['expressionengine']['database'] = "datenbankname_online";
}

3. Pfade für Bildupload-Ordner

Wie oben schon erwähnt, sind die Pfade zu unseren Bilderordnern leider fest in der Datenbank verankert, wir können sie nicht über die config.php beeinflussen. Die Lösung hier ist, diese Pfade einfach relativ anzugeben.

bei mir stehen die beispielsweise so drin:

../images/uploads/bildordner/

Die zwei Punkte springen erst mal ein Verzeichnis höher (ausgehend von der CP-URL http://www.domain.de/system) und dann in den entsprechenden Ordner.

Das war's an sich auch schon. Einmal eingebaut, sollte jetzt man problemlos seine Installation verschieben können.

5 Kommentare

Kommentar schreiben Kommentare als RSS-Feed

Thomas Aull schreibt am 2. Oktober 2011 um 11:30 Uhr:

Ach so: Falls es bei euch bei der Umsetzung noch irgendwelche Schwierigkeiten gibt könnt ihr hier natürlich gerne nachfragen!

#1

David Hellmann schreibt am 2. Oktober 2011 um 11:59 Uhr:

Cool :) Aber ich weiß schon warum ich online das ganze mache :D Viel zu viel stress :D

Ach ja, mach mal beim Kommentarfeld das on Focus oder so der Beispieltext verschwindet :D

#2

Thomas Sausen schreibt am 2. Oktober 2011 um 12:46 Uhr:

Du nutzt den Bildordner? Ich habe ja ne MSM-Installation und selbst bei Kunden wo ich nur ne normale Installatin habe, nutze ich den Bildordner nie.

Habe immer aufm Server einen “assets”-Ordner, dort liegen dann die Templates als Dateien, CSS, JS, Bilder des Templates und auch Blog- und Portfolio- oder andere Bilder die hochgeladen werden.

War für mich so am einfachsten, da ich immer nur den Assets-Ordner sichern muss und da alle wichtigsten Dateien habe, außer DB-Backup

Müsste ich also bei Deiner Lösung jetzt einfach nur die ganzen Pfade der jeweiligen assets-Ordner eingeben? Und derzeit überlege ich noch, wie Deine Lösung bei MSM-Sachen funktioniert.

#3

Thomas Aull schreibt am 2. Oktober 2011 um 14:09 Uhr:

Also ich mache immer ein komplettes Backup. Das mit dem assets-Ordner ist eigentlich aber ein guter Ansatz. Im Moment habe ich einen img (Bilder fürs Layout), js, css Ordner in der obersten Ebene für solche Sachen. Die Inhaltsbilder eben im images Ordner. Aber im Endeffekt isses ja wurscht wo was liegt, das Grundproblem is ja das gleiche :-)

Du müsstest dann die Pfade natürlich entsprechend anpassen. Worauf man jetzt beim MSM noch achten muss weiß ich nicht – kenn ich mich nicht aus…

@David: Hab das mit dem Kommentarfeld angepasst!

#4

Frank Waive schreibt am 27. Dezember 2012 um 6:33 Uhr:

I have a similar workflow, but i’ve also made design mistakes with this making migration a little complex (Do not directly link any of your files if your’e doing this). I’ve never design on a live server, i wonder how that would feel like…

#5