Inhaltsverzeichnis

Symphony CMS

Ein gutes standardkonformes Content Management System ist Symphony CMS.

Demo-Pages

Installation

mysql

mysql> create database symphony;
mysql> grant all on symphony.* to symphony@localhost identified by 'P@ssw0rd';
mysql> flush privileges;

bash

mkdir -p /var/www/domains/ww1.tiri.de
cd !$

bash

git clone git://github.com/symphony/symphony-2.git html
Initialized empty Git repository in /data/var/www/domains/ww1.tiri.de/html/.git/
remote: Counting objects: 4699, done.
remote: Compressing objects: 100% (1258/1258), done.
remote: Total 4699 (delta 3496), reused 4611 (delta 3408)
Receiving objects: 100% (4699/4699), 928.27 KiB | 190 KiB/s, done.
Resolving deltas: 100% (3496/3496), done.

bash

cd !$
git submodule update --init
Submodule 'extensions/debugdevkit' (git://github.com/symphony/debugdevkit.git) registered for path 'extensions/debugdevkit'
Submodule 'extensions/export_ensemble' (git://github.com/pointybeard/export_ensemble.git) registered for path 'extensions/export_ensemble'
Submodule 'extensions/jit_image_manipulation' (git://github.com/pointybeard/jit_image_manipulation.git) registered for path 'extensions/jit_image_manipulation'
Submodule 'extensions/maintenance_mode' (git://github.com/pointybeard/maintenance_mode.git) registered for path 'extensions/maintenance_mode'
Submodule 'extensions/markdown' (git://github.com/pointybeard/markdown.git) registered for path 'extensions/markdown'
Submodule 'extensions/profiledevkit' (git://github.com/symphony/profiledevkit.git) registered for path 'extensions/profiledevkit'
Submodule 'extensions/selectbox_link_field' (git://github.com/pointybeard/selectbox_link_field.git) registered for path 'extensions/selectbox_link_field'
Initialized empty Git repository in /data/var/www/domains/ww1.tiri.de/html/extensions/debugdevkit/.git/
remote: Counting objects: 211, done.
remote: Compressing objects: 100% (188/188), done.
remote: g objects:  50% (106/211)    0 (delta 0)Receiving objects:  32% (68/211)   
Receiving objects: 100% (211/211), 44.27 KiB, done.
Resolving deltas: 100% (99/99), done.
Submodule path 'extensions/debugdevkit': checked out '89714d6ee918839fa6f8bad6bf9976ff54acc414'
Initialized empty Git repository in /data/var/www/domains/ww1.tiri.de/html/extensions/export_ensemble/.git/
remote: Counting objects: 90, done.
remote: Compressing objects: 100% (89/89), done.
remote: Total 90 (delta 36), reused 0 (delta 0)
Receiving objects: 100% (90/90), 18.33 KiB, done.
Resolving deltas: 100% (36/36), done.
Submodule path 'extensions/export_ensemble': checked out '766485eb43715ce6be19f5b58e018172c7e60656'
Initialized empty Git repository in /data/var/www/domains/ww1.tiri.de/html/extensions/jit_image_manipulation/.git/
remote: Counting objects: 87, done.
remote: Compressing objects: 100% (87/87), done.
remote: Total 87 (delta 40), reused 0 (delta 0)
Receiving objects: 100% (87/87), 18.27 KiB, done.
Resolving deltas: 100% (40/40), done.
Submodule path 'extensions/jit_image_manipulation': checked out 'ac8545df3ed29ef0549a87d043956fa6aa951da8'
Initialized empty Git repository in /data/var/www/domains/ww1.tiri.de/html/extensions/maintenance_mode/.git/
remote: Counting objects: 14, done.
remote: Compressing objects: 100% (14/14), done.
remote: Total 14 (delta 5), reused 0 (delta 0)
Receiving objects: 100% (14/14), done.
Resolving deltas: 100% (5/5), done.
Submodule path 'extensions/maintenance_mode': checked out '157d42f37588ea39515606694362281bab89ec9c'
Initialized empty Git repository in /data/var/www/domains/ww1.tiri.de/html/extensions/markdown/.git/
remote: Counting objects: 29, done.
remote: Compressing objects: 100% (29/29), done.
remote: Total 29 (delta 11), reused 0 (delta 0)
Receiving objects: 100% (29/29), 53.29 KiB | 70 KiB/s, done.
Resolving deltas: 100% (11/11), done.
Submodule path 'extensions/markdown': checked out '98683c3f56871b52a2d9dc42ceb7648f8f16a5c3'
Initialized empty Git repository in /data/var/www/domains/ww1.tiri.de/html/extensions/profiledevkit/.git/
remote: Counting objects: 16, done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 16 (delta 3), reused 0 (delta 0)
Receiving objects: 100% (16/16), done.
Resolving deltas: 100% (3/3), done.
Submodule path 'extensions/profiledevkit': checked out '7a723f2ae7431276de7ff8353beac70e8fe0cb57'
Initialized empty Git repository in /data/var/www/domains/ww1.tiri.de/html/extensions/selectbox_link_field/.git/
remote: Counting objects: 121, done.
remote: Compressing objects: 100% (120/120), done.
remote: Total 121 (delta 49), reused 0 (delta 0)
Receiving objects: 100% (121/121), 23.44 KiB, done.
Resolving deltas: 100% (49/49), done.
Submodule path 'extensions/selectbox_link_field': checked out 'd2787bb0ecafed7f446c62d3c562bd8c5b8f03ad'

Zur Installation empfiehlt es sich, Verzeichnisrechte freizügig zu gestalten.

bash

chmod 777 symphony .
chmod -R 777 workspace

Jetzt die Installation über die URL http://localhost/install.php durchführen.

Nach der Installation wieder etwas restriktiver.

bash

chmod 755 symphony .
rm install.php install.sql workspace/install.sql update.php

Ggf. müssen noch Verzeichnisse im workspace angelegt werden.

bash

mkdir -p workspace/{utilities,data-sources,events,pages}
mkdir -p workspace/{images,css,js}

Default User

Tutorial

Extensions

Zunächst sind alle Extensions zu aktivieren. Weitere Extensions können bei Bedarf nachinstalliert werden, eine sinnvolle zusätzliche Basis Extension ist das Filemanager Modul.

Initialized empty Git repository in /data/var/www/domains/ww1.tiri.de/html/extensions/filemanager/.git/
remote: Counting objects: 107, done.
remote: Compressing objects: 100% (106/106), done.
remote: Total 107 (delta 59), reused 0 (delta 0)
Receiving objects: 100% (107/107), 23.05 KiB, done.
Resolving deltas: 100% (59/59), done.
Initialized empty Git repository in /data/var/www/domains/ww1.tiri.de/html/extensions/order_entries/.git/
remote: Counting objects: 94, done.
remote: Compressing objects: 100% (82/82), done.
remote: Total 94 (delta 37), reused 0 (delta 0)
Receiving objects: 100% (94/94), 18.48 KiB, done.
Resolving deltas: 100% (37/37), done.

Database Manipulator

Initialized empty Git repository in /data/var/www/domains/ww1.tiri.de/html/extensions/databasemanipulator/.git/
remote: Counting objects: 16, done.
remote: Compressing objects: 100% (16/16), done.
remote: Total 16 (delta 3), reused 0 (delta 0)
Receiving objects: 100% (16/16), 5.08 KiB, done.
Resolving deltas: 100% (3/3), done.

Sections

Die Sektionen werden in der Administrationsoberfläche angezeigt und spiegeln einzelne Elemente der Website wieder.

Navigation Group erzeugt einen Menüpunkt in der Admin-GUI, der Name ist ein Untermenü davon. Symphony Sections

Components

Komponenten sind XSL Datenquellen, die die Daten für die einzelnen Seiten bereitstellen. Diese sind entsprechend zu erstellen. Data Sources sind PHP-Skripte, die im Dateisystem abgelegt sind und somit in Symphony CMS eingebunden werden können. Wichtig ist hierbei, dass gültiges XML zurückgegeben wird.

FIXME

Verknüpfung von Datenquellen

Möchte man beispielsweise nur die Artikel eines Hauptartikels anzeigen lassen, so sind zwei Data-Sources nötig.

Styles

Initialized empty Git repository in /data/var/www/domains/ww1.tiri.de/html/workspace/assets/.git/
remote: Counting objects: 211, done.
remote: Compressing objects: 100% (181/181), done.
remote: Total 211 (delta 105), reused 0 (delta 0)
Receiving objects: 100% (211/211), 194.44 KiB | 103 KiB/s, done.
Resolving deltas: 100% (105/105), done.

Tips & Tricks

XSL   ausgeben

xml

<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>

Artikel-Navigation

xml

<xsl:template name="article-items">
     <xsl:if test="$a = ./title/@handle">
        <div class="grid_12">
                <div class="box">
                        <h2><a><xsl:value-of select="title"/></a></h2>
                        <div id="paragraphs" class="block">
                        <p>...</p>
                            <p>
                            <a href="{$root}/{$current-page}/{./preceding-sibling::entry[1]/title/@handle}"><xsl:value-of select="./preceding-sibling::entry[1]/title"/></a> |
                            <a href="{$root}/{$current-page}/{./following-sibling::entry[1]/title/@handle}"><xsl:value-of select="./following-sibling::entry[1]/title"/></a>
                            </p>
                        </div>
                </div>
        </div>
     </xsl:if> 
</xsl:template>

Archive.XSL

xml

<xsl:template match="data">
	<div class="grid_12">
		<div class="box table">
			<h2><a>Entries Archive</a></h2>
			<div class="block">
				<table>
				<thead>
					<tr>
					<th><a>Date</a></th>
					<th><a>Section</a></th>
					<th><a>Title</a></th>
					<!-- th><a>Comments</a></th -->
					</tr>
				</thead>
				<tbody>
					<xsl:choose>
						<xsl:when test="$b">
							<xsl:for-each select="archive/year[@value = $a]/month[@value = $b]/entry">
								<xsl:call-template name="entries-archive-list"/>
							</xsl:for-each>
						</xsl:when>
						<xsl:when test="$a">
							<xsl:for-each select="archive/year[@value = $a]/month/entry">
								<xsl:call-template name="entries-archive-list"/>
							</xsl:for-each>
						</xsl:when>
						<xsl:otherwise>
							<xsl:for-each select="archive/year/month/entry">
								<xsl:call-template name="entries-archive-list"/>
							</xsl:for-each>
						</xsl:otherwise>
					</xsl:choose>
				</tbody>
				</table>
			</div>
		</div>
	</div>

	<div class="grid_4">
		<div class="box menu">
			<h2><a>Archive</a></h2>
			<div class="block">
				<ul class="section menu">
					<xsl:for-each select="archive/year">
						<xsl:call-template name="archive-by-date"/>
					</xsl:for-each>
				</ul>
			</div>
		</div>
	</div>
        <div class="clear" />
</xsl:template>

<xsl:template name="entries-archive-list">
	<tr>
		<td>
			<xsl:call-template name="format-date">
				<xsl:with-param name="date" select="date"/>
				<xsl:with-param name="format" select="'x m Y'"/>
			</xsl:call-template>
		</td>

		<td><xsl:value-of select="section/item"/></td>
		<td><a href="{$root}/{section/item/@handle}/{title/@handle}/"><xsl:value-of select="title"/></a></td>
		<!-- td><a href="{$root}/{../../@value}/{../@value}/{substring(date, 9, 2)}/{title/@handle}/"><xsl:value-of select="title"/></a></td -->
		<!-- td class="none">0</td -->
	</tr>
</xsl:template>
	
<xsl:template name="archive-by-date">
	<li>
		<a href="{$root}/{$current-page}/{@value}/"><xsl:value-of select="@value"/></a>

		<ul class="menu">
			<xsl:for-each select="month">
				<li>
					<a href="{$root}/{$current-page}/{../@value}/{@value}/">
						<xsl:call-template name="format-month">
							<xsl:with-param name="month" select="@value"/>
							<xsl:with-param name="format" select="'M'"/>
						</xsl:call-template>
						<xsl:text> </xsl:text>

						<xsl:value-of select="../@value"/>
					</a>
				</li>
			</xsl:for-each>
		</ul>
	</li>
</xsl:template>

substring-before/after

xml

<title>
    <xsl:choose>
        <xsl:when test="contains($page-title, '&amp;#38;')">
            <xsl:value-of select="substring-before($page-title, '&amp;#38;')" />
            <xsl:text>&#38;</xsl:text>
            <xsl:value-of select="substring-after($page-title, '&amp;#38;')" />
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$page-title" />
        </xsl:otherwise>
    </xsl:choose>
 </title>