Zur Agentur-Website
14.04.2011

TYPO3 Update ohne SSH

Oft kommt es vor, dass bei den Webhosting-Anbietern kein Shell-Zugang (SSH) vorhanden ist, und somit ein TYPO3-Update erschwert wird. Dieser Artikel zeigt zwei Möglichkeiten wie das Update einer TYPO3-Installation mittels PHP oder Perl möglich ist.

TYPO3 Update mit PHP

Ist am Webserver die Einstellung safe_mode auf Off gesetzt, können in der Regel über die PHP-Funktion system() Shell-Befehle ausgeführt werden. Ein TYPO3-Update würde daher mit folgendem Skript funktionieren:


system('wget http://prdownloads.sourceforge.net/typo3/typo3_src-4.5.2.tar.gz');
system('tar -xzf typo3_src-4.5.2.tar.gz');
system('rm typo3_src')
system ('ln -s typo3_src-4.5.2 typo3_src');
PHP-Code zur Durchführung eines TYPO3-Updates

In der ersten Zeile wird der aktuelle TYPO3-Sourcecode auf den Server geladen und in Zeile 2 anschließend entpackt. In Zeile 3 wird der Symlink typo3_src, der auf die momentane TYPO3-Installation zeigt, entfernt. Danach wird dieser Symlink wieder erstellt (Zeile 4), allerdings mit dem Verweis auf den neuen TYPO3-Sourcecode. Alternativ zur Funktion system() könnte auch exec() eingesetzt werden.

TYPO3-Update mit Perl

Ist die Ausführung der oben erwähnten PHP-Funktionen untersagt, kann man sich auch mit der Skript-Sprache Perl helfen, die häufig bei kleinen und billigen Webhosting-Angeboten verfügbar ist. Dazu muss in unserer Lösung vorher die entpackte TYPO3-Sourcedatei auf den Webserver per FTP hochgeladen werden. Da wir leider keine Perl-Profis sind, haben wir noch keine Lösung für das Entpacken von Dateien mit Perl gefunden. In den Kommentaren darf jedoch gerne ein Hinweis hinterlassen werden ;-)

Nachdem die TYPO3-Dateien am Server sind, wird die Datei remove.pl erstellt. Die Datei hat folgenden Inhalt:


#!/usr/bin/perl --

use strict;
use CGI::Carp qw(fatalsToBrowser);
use File::Path;

my $Ergebnis = rmtree("typo3_src");

print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
print "<html><head><title>Test-Ausgabe</title></head><body>\n";
if($Ergebnis == 1) {
  print "Verzeichnis gel&ouml;scht!";
}
else {
 print "$!";
}
print "</body></html>\n";
Symlink mit Perl entfernen

Das Skript macht nichts anderes, als den Symlink typo3_src zu entfernen. Wichtig ist dabei die erste Zeile. Diese verweist auf den Perl-Interpreter am Server. Das heisst, von Server zu Server kann dieser Pfad variieren. Nachdem der Symlink nun gelöscht ist, wird dieser mit folgender Datei (symlink.pl) neu erstellt - mit Verweis auf den neuen TYPO3-Sourcecode.


#!/usr/bin/perl --

use strict;
use CGI::Carp qw(fatalsToBrowser);

my $Ergebnis = symlink("typo3source/typo3_src-4.5.2","typo3_src");

print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
print "<html><head><title>Test-Ausgabe</title></head><body>\n";
if($Ergebnis == 1) {
  print "Symlink angelegt!";
}
else {
 print "Error: $!";
}
print "</body></html>\n";
Symlink mit Perl neu erstellen

Mit diesen zwei Perl-Skripts kann somit auf den Komfort von Symlinks bei der Durchführung von TYPO3-Updates zurückgegriffen werden. Damit ist es uns auch möglich, bei unseren TYPO3-Kundenprojekten schnell und effizient Updates einspielen zu können.

Vorschläge zur Verbesserung dieser Lösungen können gerne in den Kommentaren gepostet werden!

Kategorie(n): TYPO3
Kommentare (0)
07.04.2011

Logout-Button per TypoScript

Heute möchte ich ein kurzes TypoScript-Schnipsel veröffentlichen, dass wir gestern für ein TYPO3-Projekt benötigten. Anforderung war, dass ein Logout-Button für Frontend-Benutzer auf jeder Seite angezeigt werden soll, sobald sich diese über ein Login-Formular angemeldet haben.

Um das Problem zu lösen, reicht der folgende TypoScript-Code. Somit muss nicht extra eine Extensions dafür installiert werden (gibt es ja für Login/Logout Buttons).


[usergroup=*]
lib.logout_btn = TEXT
lib.logout_btn.data = TSFE : id
lib.logout_btn.wrap (
  <div class="logout_btn">
    <form action="index.php?id=90" method="post">
    <input name="submit" class="abmelden" value="Abmelden" type="submit" />
    <input name="logintype" value="logout" type="hidden" />
    <input name="pid" value="|" type="hidden">
    </form>
  </div>
)
[global]
Logout-Button per TypoScript

Wenn der Logout-Button nur für eine spezielle Benutzergruppe vorhanden sein soll, kann dies in der ersten Zeile näher festgelegt werden. Ansonsten gilt die Einstellung für alle Frontend-Benutzer. Das "lib.logout_btn" wurde in TemplaVoila gemappt und wird somit auf jeder Seite automatisch integriert.

Verbesserungsvorschläge, Alternativen, etc. können gerne in den Kommentaren gepostet werden.

Kategorie(n): TYPO3
Kommentare (0)
18.03.2011

Facebook Like-Button in TYPO3

Auf Facebook Developers lässt sich der Like-Button über ein Interface schnell und einfach erstellen. Allerdings nur für die URL die in der Eingabemaske angegeben wird. Um den Like-Button in TYPO3 auf jeder Seite zu integrieren und um die jeweilige Unterseite "liken" zu können ist folgendes TypoScript notwendig:


fb_likebutton = COA
fb_likebutton {
  10 = TEXT
  10.typolink.parameter.data = TSFE:id
  10.typolink.returnLast = url
  10.typolink.addQueryString = 1
  10.typolink.addQueryString.exclude = id
  10.dataWrap = {TSFE:baseUrl}|
  10.rawUrlEncode = 1
  wrap = <iframe src="http://www.facebook.com/plugins/like.php?href=|&amp;layout=standard&amp;show_faces=false&amp;width=450&amp; action=like&amp;font&amp;colorscheme=light&amp;height=35" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:35px;" allowTransparency="true"></iframe>
}


Facebook Like-Button für einzelne Seiten in TYPO3

Das COA kann somit jedem Marker oder via TemplaVoila zugewiesen werden. Ebenso kann es mittels der Extension "Generic markers for tt_news" verknüpft werden, sodass der Like-Button für einzelnen News-Beiträge eingesetzt werden kann.

Fragen, Verbesserungsvorschläge, Einwände, Feedback, Lob :-) ... sind wie immer in den Kommentaren möglich!

10.02.2011

Externe Datenbank in TYPO3 anbinden

Das folgende Skript zeigt, wie in TYPO3 auf die Daten einer externen Datenbank zugegriffen werden kann. Die Datenbank liegt zwar am gleichen Server, ist jedoch nicht die Standard-Datenbank von TYPO3.


// Zur externen Datenbank wechseln
$res = $GLOBALS['TYPO3_DB']->sql_select_db('meine-externe-db');

// Daten abfragen & zurückgeben
$res = $GLOBALS['TYPO3_DB']->sql(TYPO3_db, 'SELECT * FROM users WHERE id = ' . $id);

// Daten auslesen
while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))
{
  $data = $row['Wert']);
}

// Zurück zur TYPO3-Datenbank wechseln
$res = $GLOBALS['TYPO3_DB']->sql_select_db('meine-typo3-db');
return $data;
Daten aus externer Datenbank holen

Eine weitere Möglichkeit, um an die gleichen Daten zu kommen aber ohne dabei die Datenbank explizit zu wechseln ist folgende:


$res = $GLOBALS['TYPO3_DB']->sql('meine_typo3_db', 'SELECT * FROM meine_externe_db.users WHERE id = ' . $id);
Noch eine Möglichkeit um an die Daten der externen Datenbank zu kommen

Die erste, umständlichere Variante haben wir in einem Projekt verwendet, da der Name der Datenbank einen Bindestrich beinhaltet hat und dadurch ein Fehler im SQL-Statement aufgetreten ist. Vom Provider wurde der Datenbankname vorgegeben wurde, sodass wir diesen nicht ändern konnten.

Kategorie(n): TYPO3
Kommentare (0)
04.02.2011

Fancybox mit TYPO3 4.5

Da mein Artikel "Fancybox in TYPO3 integrieren" doch immer wieder einige Besucher hat, möchte ich auf eine kleine Aktualisierung beim Update auf TYPO3 4.5.0 aufmerksam machen.

Das in meinem Artikel erwähnte TypoScript muss um zwei Zeilen ergänzt werden, ansonsten funktionieren Links auf Bilder (auch ohne Fancybox) unter TYPO3 4.5.0 nicht mehr. Der aktualisierte Code sieht nun wie folgt aus:


tt_content.image.20.1 {
  # Den Standard imageLinkWrap entfernen und einen eigenen basteln
  imageLinkWrap >
  imageLinkWrap = 1
  imageLinkWrap {

    # Linkwrapping bei aktivierter Klickvergrößerung oder einem gesetzten Link
    enable.field = image_zoom
    enable.ifEmpty.typolink.parameter.field = image_link
    enable.ifEmpty.typolink.parameter.listNum.stdWrap.data = register : IMAGE_NUM_CURRENT
    enable.ifEmpty.typolink.returnLast = url
    enable.ifEmpty.typolink.parameter.listNum.splitChar = 10

    # Neuer wrapping Code
    typolink {
      target = {$styles.content.links.target}
      extTarget = {$styles.content.links.extTarget}

      # Link mit Pfad und Name zum Originalbild oder
      # Pfad und Name des umgerechneten lightbox Bild (wen maxH oder maxH erreicht ist)
      parameter.cObject = IMG_RESOURCE
      parameter.cObject.file.import.data = TSFE:lastImageInfo|origFile

      # Ausnahme: wenn das linkfield nicht leer ist
      parameter.override.field = image_link
      parameter.override.listNum.stdWrap.data = register : IMAGE_NUM_CURRENT
      parameter.override.if.isTrue.field = image_link
      parameter.override.listNum.splitChar = 10

      # rel-Attribut hinzufügen, für Galerie-Funktion (durchblättern)
      ATagParams = rel="gallery" title="{field:header}" class="lightbox"
      ATagParams.override = rel="gallery{field:uid}" title="{field:header}" class="lightbox"
      ATagParams.insertData = 1
      ATagParams.if.isTrue.field = image_zoom
    }
  }
}
Fancybox unter TYPO3 4.5

Neu hinzugekommen sind die Zeilen 12 und 28. Fügt man diese ein, funktioniert wieder alles ohne Probleme. Kurz noch den TYPO3-Cache löschen und es kann schon weiter gehen.

21.12.2010

PHP Scripte in TYPO3 ausführen

Oft kommt es vor, das man schnell auf einer Seite innerhalb einer TYPO3-Installation ein kurzes PHP-Script ausführen möchte (oder muss). Natürlich könnte man eine eigene Extension schreiben oder auf TypoScript und UserFunc oder PHP_SCRIPT zurückgreifen.

Doch das dauert meiner Meinung nach, alles länger und ist mühsamer als der Einsatz der Extension page_php_content, die allerdings nicht mehr im Extension-Repository von TYPO3 verfügbar ist. Aus diesem Grund stelle ich sie hier als Download zur Verfügung.

Was macht die Extension genau?

page_php_content fügt ein neues Inhaltselement in TYPO3 hinzu. Dieses Element wird aber über den "Content Element Wizard" nicht angezeigt, daher muss zuerst irgendein anderes Inhaltselement gewählt werden. Danach kann über die Selectbox auf den Typ "PHP Script" gewechselt werden. Nun ist es möglich, in das verfügbare Textfeld, beliebigen PHP-Code hineinzuschreiben. Aus Übersichtsgründen verwende ich gerne ein einfaches require_once() und verweise auf eine PHP-Datei im Filesystem, die ich bequem per Editor und Syntaxhighlighting bearbeiten kann.

page_php_content mit TemplaVoila

Leider funktioniert die Extension nicht mehr korrekt wenn TemplaVoila im Einsatz ist. Mit folgenden TypoScript-Code sollte jedoch die Erweiterung auch mit TemplaVoila seinen Dienst verrichten.


includeLibs.tx_pagephpcontent_pi1 = typo3conf/ext/page_php_content/pi1/class.tx_pagephpcontent_pi1.php
tt_content.page_php_content_pi1 = COA
tt_content.page_php_content_pi1.10 = < lib.stdheader
tt_content.page_php_content_pi1.20 = < plugin.tx_pagephpcontent_pi1
plugin.tx_pagephpcontent_pi1 = USER_INT
plugin.tx_pagephpcontent_pi1.userFunc=tx_pagephpcontent_pi1->main
TypoScript für page_php_content mit TemplaVoila

Wie bereits eingangs erwähnt, kann die Erweiterung page_php_content für schnelle und kurze PHP-Scripte innerhalb des Contents verwendet werden. Für umfangreichere Programmierarbeiten sollte ansonsten auf eine eigene Extension zurückgegriffen werden. Schon alleine aufgrund des Zusammenspiels mit TYPO3.

Kategorie(n): TYPO3
Kommentare (0)
15.10.2010

Eigene Daten an TYPO3 Mailform übergeben

Sollen eigene Daten an ein TYPO3 Mailform übergeben und gesendet werden, so ist das mit selbst definierten Markern und der Extension "Formhandler" möglich.

Angenommen es soll ein Wert aus einer GET-Variable an ein hidden-Field übergeben werden. Zuerst wird im Template des Formulars ein Hidden-Field erstellt. Im Beispiel hat es den Namen "produktid".


<input type="hidden" name="formhandler[produktid]" id="produktid" value="###produktid###"/>

Der Marker hat also den Namen ###produktid###. Nun übergeben wir an diesen Marker die GET-Variable mit folgendem TypoScript:


# Marker für ProduktID in Hidden Field
plugin.Tx_Formhandler.settings.predef.registration.markers.produktid = TEXT
plugin.Tx_Formhandler.settings.predef.registration.markers.produktid.data = GPvar:my_get_variable

Genauso kann eine GET-Variable an eine selbst definierte UserFunction übergeben werden. Das funktioniert ein wenig anders:


plugin.Tx_Formhandler.settings.predef.registration.markers.produktid = COA
plugin.Tx_Formhandler.settings.predef.registration.markers.produktid {
  10 = USER
  10 {
    userFunc = user_Products->user_myFunction
    getId = my_get_variable
  }
}

Um nun den Wert der Variable in der UserFunction per PHP auszulesen ist folgender Befehl notwendig:


// ProduktId holen
$id = $conf['getId']?t3lib_div::_GP($conf['getId']):false;
Kategorie(n): TYPO3
Kommentare (2)
30.09.2010

TYPO3: Auf übersetzte News direkt verlinken

Bei einem aktuellen Projekt, eine mehrsprachige Website unter TYPO3, standen wir vor der Aufgabe alle News einer Sprache auszugeben und zugleich auf die Übersetzungen einer News, falls welche vorhanden sind, direkt zu verlinken. Standardmäßig bietet die eingesetzte Erweiterung tt_news derartige Verlinkungen nicht an. Aus diesem Grund zeigen wir hier die Lösung dieses Problems.

Zu Beginn ist ein eigener Marker im Template von tt_news notwendig. Diesen Marker definieren wir mit der zusätzlichen Extension "ttnewsgenericmarkers". Danach fragen wir per TypoScript die erforderlichen Datensätze ab. Der TypoScript-Code sieht wie folgt aus:


plugin.tt_news.genericmarkers {

  data = uid,sys_language_uid

  translation = COA
  translation {
    10 = CONTENT
    10 {
      table = tt_news
      select {
        pidInList = 45
        selectFields = uid,sys_language_uid
        andWhere.dataWrap = l18n_parent = {field:generic_uid}
      }

      renderObj = COA
      renderObj {

        10 = TEXT
        10.value = In German
        10.if {
          value = 1
          isInList.field = sys_language_uid
        }

        10.typolink {
          parameter = 46
          addQueryString = 1
          additionalParams = &L={field:sys_language_uid}&tx_ttnews[tt_news]={field:uid}
          additionalParams.insertData = 1
        }

        20 = TEXT
        20.value = In Hungarian
        20.if {
          value = 2
          isInList.field = sys_language_uid
        }
        20.typolink {
          parameter = 46
          addQueryString = 1
          additionalParams = &L={field:sys_language_uid}&tx_ttnews[tt_news]={field:uid}
          additionalParams.insertData = 1
        }

        30 = TEXT
        30.value = In Romanian
        30.if {
          value = 3
          isInList.field = sys_language_uid
        }
        30.typolink {
          parameter = 46
          addQueryString = 1
          additionalParams = &L={field:sys_language_uid}&tx_ttnews[tt_news]={field:uid}
          additionalParams.insertData = 1
        }

        # Weitere Sprachen im gleichen Schema
        # ...
      }
    }
  }
}
Daten per Select holen und verarbeiten

Zuerst werden alle Datensätze geholt, wo die aktuelle News-ID im Feld "l18n_parent" vorkommt. Nun hat man die zu einer News übersetzten Datensätze (Zeile 9 - 13). Danach werden die Links je Sprache zusammengesetzt (zB Zeile 19 - 31). Das Beispiel kann natürlich an die eigenen Bedürfnisse und Anforderungen jederzeit ausgebaut werden.

Kategorie(n): TYPO3
Kommentare (0)
18.09.2010

Komprimieren und Minimieren von HTML, CSS und Javascript unter TYPO3

Die Anzahl der HTTP Request beim Laden einer Seite ist einer von vielen Faktoren der Performance Optimierung. Wie CSS und JavaScript Dateien unter TYPO3 zusammengefügt und minimiert werden kann, zeigt folgender Artikel. Weiters lesen Sie wie man die Größe des HTML-Quellcodes verkleinert.

Scriptmerger

Die TYPO3-Extension Scriptmerger bietet die Möglichkeit, extern eingebundene JavaScript und CSS Dateien zu komprimieren und diese anschließend zu einer Datei zusammenzufügen. Nach der Installation, die im Extension-Manual ausführlich erklärt wird, werden die Dateien je nach Einstellung zu einer oder mehrere Dateien zusammengefügt.

Probleme können beim Einsatz von UTF-8 in Verbindung mit gzip auftreten. Helfen kann dabei folgendes: Entweder man deaktiviert die gzip-Komprimierung da diese bereits vorher vom Server durchgeführt wurde oder man schreibt, wenn ein Kodierungs-Problem bei der CSS-Datei auftritt, folgendes Attribut in das link-Tag das für die Integration der CSS-Datei zuständig ist: charset="utf-8"

Leider werden die eigene CSS-Datei und das von TYPO3 integrierte CSS_Styled_Content-Stylesheet nicht zu einer Datei zusammengefügt.

Das Zusammenfügen und Minimieren der JavaScript-Files funktioniert im Prinzip problemlos und bedarf daher keiner weiteren Erklärung.

HTML Minify

Da Scriptmerger keine Minimierung des HTML-Quellcodes mit sich bringt, ist zur Entschlackung und Verkleinerung des HTML-Quellcodes die Extension SourceOptimization notwendig. Diese Erweiterungen macht nicht anderes, als unnötige Leerzeichen, Tabulatoren, Whitespaces, Kommentare, etc. aus dem Quelltext zu entfernen. Dadurch verkleinert sich die Größe der HTML-Datei. Wieviel vom Quellcode entfernt und minimiert werden soll kann mittels TypoScript eingestellt werden.

27.08.2010

Teaser in T3Blog

Standardmäßig bietet die TYPO3-Blog-Extension "T3Blog" keine elegante Möglichkeit, um für die einzelnen Beiträge in der Listenansicht automatisch Teaser zu erstellen. In einem Beitrag im Forum von typo3.net wurde folgende einfache Möglichkeit erwähnt, die sehr gut funktioniert:


[globalVar = GP:tx_t3blog_pi1|blogList|showUid<1]
tt_content.text.20.stdWrap.crop = 750 | &nbsp;... | 1
[global]
Tesar für T3Blog

Mit dieser Anweisung wird der Text nach 750 Zeichen abgeschnitten und danach mit 3 Punkten ergänzt. Allerdings funktioniert das nur mit Text. Wenn aber, wie in diesem Blog, mit Plugins Inhalt ausgegeben wird, so wird dieser einfach nach den 750 Zeichen weiterhin angezeigt. Da ich bis dato noch keine Lösung gefunden habe, dieses Problem zu umgehen, habe ich das oben genannte TypoScript wieder deaktiviert. Ich freue mich aber über jeden Lösungsvorschlag, der in den Kommentaren hinterlassen werden kann.

Die andere Variante, die ich aber aus Sicht eines Redakteures nicht sehr benutzerfreundlich finde, funktioniert so, indem man an einer Stelle im Text einen Marker mit dem Inhalt MORE schreibt.

Dieser Marker setzt einen Link, der zum eigentlichen Artikel inkl. den Kommentaren führt. Um den Titel des Links zu ändern ist folgendes TypoScript notwendig:


plugin.tx_t3blog_pi1 {
   blogList {
     _LOCAL_LANG.de {
       moreText = Weiterlesen
     }
   }
}
Beschriftung für MORE-Link ändern
Kategorie(n): TYPO3
Kommentare (1)

RSS, Twitter & Facebook