Es ist endlich soweit! Symfony 1.1 ist fertig! Freude! Mal sehen ob ich heute noch Zeit habe damit zu spielen. Die letzten Vorab-Versionen waren schon sehr brauchbar!

Symfony 1.1 RC 1

8. Mai 2008

Der erste Release-Candidate von Symfony 1.1 ist ab sofort da! Das Release kommt immer näher. Hoffentlich arbeiten auch die Plugin-Entwickler an der Portierung.

Ich wollte die Tage das sfFeed2Plugin benutzen und musste feststellen, dass auf dem einfachen Weg über den “symfony”-Befehl die Installation verweigert wird, weil das Plugin für 1.0 ist. Musste ich mir leider kurzer Hand was eigenes Basteln um die News in einen RSS-Feed zu quetschen.

Weiteres zum RC1 gibt’s im Symfony-Blog: Symfony 1.1.0 RC1 is out.

P.S.: In den folgenden Wochen ist mit einem RC2 zu rechnen.

Bei Symfony kann man ja in der view.yml diverse Meta-Tags definieren, zum Beispiel “description” und “keywords”. Häufig ist es aber sinnvoller wenn diese auch dynamisch wären. Dies geht relativ einfach wenn man wie beim Artikel zu dynamischen Seitentiteln die sfActions Klasse erweitert:

class myActions extends sfActions
{
  public function setDescription($description)
  {
  	$response = $this->getResponse();
  	$response->addMeta('description', $description);
  }

  public function setKeywords($keywords)
  {
  	$response = $this->getResponse();
  	$response->addMeta('keywords', $keywords);
  }
}

Nun lassen sich in jeder “Action”, die von myActions abgeleitet ist statt direkt von sfActions, die Meta-Tags für Keywords und Beschreibungen bequem dynamisch anpassen, z.B.:

public function executeMyAction()
{
  $this->setDescription('.... beschreibung .... ');
  $this->setKeywords('foo, bar, foobar, ...');
}

Symfony 1.1 Beta 3

11. April 2008

Die dritte Beta-Version von Symfony 1.1 ist draußen. Die fertige Version kommt immer näher! Hach das ist wie Weihnachten :)

Zend Studio for Eclipse

28. Januar 2008

Zend hat vor kurzem das Zend Studio for Eclipse veröffentlich. Im Grunde basiert das Eclipse Studio for Eclipse auf Eclipse PDT mit einigen Erweiterungen. Zum Start gibt es die aktuelle Version für 299 Euro statt den bald fälligen 399 Euro.

Meine IDE der Wahl für PHP ist weiterhin:

Weitere Infos:

Symfony 1.0.11

22. Januar 2008

Symfony 1.0.11 wurde heute veröffentlicht und ist damit das erste Release in 2008.

Ich warte ja immer noch ganz sehnlich auf Symfony 1.1, das viele Neuerungen mitbringen wird. Zur Zeit migriere ich eine private Bastelei von 1.0.* auf 1.1 (svn) und es ist doch einiges zu beachten. Zwar bringt Symfony 1.1 ein Plugin mit, das die Kompatibilität zu 1.0.* herstellt, aber wenn man das Projekt direkt auf 1.1 ohne Rückwärtskompatibilitäten umstellen möchte, dann gibt’s viel zu beachten und zu entdecken ;)

Aber zurück zu Symfony 1.0.11 und den Neuerungen/Änderungen:

  • r6765, r6766: fixed error message in getPresentationFor() (closes #1527)
  • r6764: fixed logic error in sfPager class affects haveToPaginate() method (closes #1512)
  • r6768, r6769: added mime types caching in sfWebRequest (closes #1811, #1846)
  • r6761, r6762: fixed content type charset on non text/* content-type (closes #1811, #196 8)
  • r6743: doc: fixed typos (closes #2580, #2596, #251 8)
  • r6740, r6741: fixed sequences bug for postgresql (closes #2584)
  • r6987, r6988: fixed caching-Bug of file sfWebresponse.class.php (#2764)
  • r6649: fixed value for ‘Content-Type’ HTTP meta header is repeated (closes #1756, #2557, #2402, #239 8)
  • r6648: fixed call to undefined method sfResponse::sendHttpHeaders (closes #2412)

Symfony Blog: symfony 1.0.11 is out

Für manche Seiten ist es notwenig, dass der Seitentitel dynamisch angepasst wird. Das sieht zum einen schöner aus und ist weiterhin auch praktisch für Suchmaschinen und diverse Bookmarking-Dienste.

Eine Lösung bietet der Artikel Dynamically adjusting your page title in symfony. Mit ein wenig Anpassung kann man damit auch mehrere Ebenen unterstützen:

class myActions extends sfActions

{

  public function setPageTitle($titles)

  {

    $response = $this->getResponse();

    if(!is_array($titles)) $titles = array($titles);

    $mainTitle = sfConfig::get('app_title');

    $delimeter = ' '.sfConfig::get('app_delimeter', '»').' ';

    $response->setTitle($mainTitle.$delimeter.implode($delimeter, $titles), false);

  }

}

Jede actions-Klasse, die jetzt von myActions abgeleitet ist, statt von sfActions kann nun einen dynamischen Titel setzen:

class moduleActions extends myActions

{

  public function executeIndex()

  {

    $this->setPageTitle(array(

      'Blogs',

      'Antihype',

      'Seite 5'

    ));

    return sfView::SUCCESS;

  }

}

Der Seitenname und das Trennzeichen werden in der app.yml angegeben:


app:

  title:         wordpress.com

  delimeter:     »

Mit dieser Konfiguration würde das obige Beispiel folgenden Seitentitel setzen:

wordpress.com » Blogs » AntiHype » Seite 5

Bei einem Projekt benötigte ich die Möglichkeit mehrere Sprachversionen über Subdomains zu ermöglichen. Bekannt ist dieses System von Wikipedia: de.wikipedia.org beheimatet die deutschsprachige Wikipedia, unter en.wikipedia.org ist die englischsprachige Wikipedia zu Hause und so gibt es für alle unterstützte Sprachen eine Subdomain.

Für Mehrsprachigkeit bietet Symfony ja schon einiges an Möglichkeiten (The Definitive Guide to symfony - Chapter 13 - I18n And L10n). Mittels der Methode setCulture kann einem Besucher eine “Sprache” zugeordnet werden und mit Hilfe von XLIFF-Dateien können verschiedene Sprachversionen der Webseite angelegt werden. Was also nur noch fehlt ist eine Möglichkeit die “Culture” entsprechend der Subdomain zu setzen.

Den entsprechenden Hinweis bietet dabei das Askeet-Tutorial Tag 18. Ein Filter ermöglicht vor Ausführung des Controllers eigenen Code auszuführen. Dort können wir den Hostnamen auslesen und entsprechend der Subdomain die “Culture” des Besuchers setzen.

In einzelnen Schritten bedeutet dies also:

1. Filter deklarieren in /projekt/apps/frontend/config/filters.yml


languageFilter:

  class: languageFilter

2. Filter Klasse anlegen in /projekt/apps/frontend/lib/languageFilter.php

class languageFilter extends sfFilter

{

  public function execute($filterChain)

  {

     if($this->isFirstCall())

     {

       $hostname = $this->getContext()->getRequest()->getHost();

       if($pos = strpos($hostname, '.'))

       {

          $language = substr($hostname, 0, $pos);

          $this->getContext()->getUser()->setCulture($language);

       }

     }

     $filterChain->execute();

  }

}

Was passiert im Code? Mittels $this->isFirstCall() wird überprüft ob dies der erste Aufruf des Filters ist, denn durch die Nutzung von forward() im Controller wird der Filter sonst jedes mal ausgeführt, dies ist allerdings nicht nötig.

Mittels strpos und substr wird überprüft ob der Hostname einen Punkt “.” enthält und falls ja wird alles vor dem ersten Punkt extrahiert und als “Culture” gesetzt.

Damit die Kette von Filtern nicht unterbrochen wird muss ein Filter immer mit $filterChain->execute(); enden, damit der nächste Filter ausgeführt wird.

Dieser Code soll nur kurz die Möglichkeit skizzieren. Für eine sinnvolle Nutzung fehlen noch ein paar Elemente:

  • In den meisten Fällen dürfte nicht jede Subdomain sinnvoll sein und sollte daher auch nicht zugelassen sein. Ein Abgleich mit einer Liste von ‘erlaubten’ Subdomains sollte dabei helfen.
  • Man sollte sich überlegen was in Fällen passiert in denen keine Subdomain definiert ist. Möglichkeiten wäre eine Sprachauswahl-Seite oder eine automatische Weiterleitung auf eine Sprachversion.

Symfony Framework

14. Januar 2008

Auf der Suche nach einem PHP-Framework bin ich vor einiger Zeit bei Symfony hängen geblieben und bin damit mehr als glücklich geworden.

Nachdem ich inzwischen schon ein wenig Erfahrung mit dem Framework sammeln konnte, möchte ich diese jetzt nutzen um den ein oder anderen Artikel auch symfony zu widmen.

Zunächst bleibt erstmal der Hinweis auf die gute und umfangreiche Dokumentation und den kurzen Überblick bei Wikipedia.