Kategorie: Uncategorized

  • Demographische Verteilung von Drupal

    Soben hat Dries auf seiner Seite eine nette Statistik veröffentlicht. Es ist recht ernüchternd ;), aber eigentlich nicht anders zu erwarten. Die Statistik zeigt die Mitglieder, welche auf Drupal.org registriert sind nach Land auf (diese Angabe ist optional).

    Rund 1/3 der Mitglieder auf Drupal.org kommen aus USA. War ja auch nicht anders zu erwarten. Danach flacht es massiv ab. Die Schweiz kommt dann gerade mal auf Rang 33. Immerhin eine Verbesserung ist zu sehen.

    Immerhin haben wir uns von Platz 41 um 10 Plätze nach vorne gekämpft. In absoluten Zahlen, sind es für die Schweiz 1180 Mitglieder und für die USA 74840. Wenn man das jetzt noch auf die Pro Kopf Bevölkerung ausrechnet:

      Mitglieder auf drupal.org Einwohner Drupalianer/Einwohner
    Schweiz 1180 7'591'400 0.00016
    USA 74840 303'346'630 0.00025

    Das relativiert dann das ganze doch wieder ein bisschen. Die Schweiz ist einfach zu klein!

  • Shop mit Drupal umsetzen – Ubercart

    Immer mal wieder taucht die Frage im Drupalcenter auf, ob und wie sich ein Shop mit Drupal umsetzen lässt. Ich bin gerade in der Endphase eines Shopes und möchte hier ein wenig meine Erfahrungen zusammenstellen:

    Umsetzung: Als Shopsystem habe ich mich auf Ubercart geeinigt. Es schien mir einfach das einfachere und kompaktere für das Projekt sein. Zahlung ist nur möglich per Überweisung. Mwst-Steuer wird nicht ausgewiesen.

    Vorteile:

    • Warenkorb und Checkout Prozess, sind extrem flexibel und leicht zu implementieren. Hat mir sehr gut gefallen.
    • Katalog. Greifft in die bestehende Taxonomy und sieht ganz hübsch aus. Super!
    • Die einzelnen Produkte lassen sich gut mit CCK erweitern. Hat alles wunderbar geklappt.
    • Rechnung lassen sich via Template relativ leicht anpassen.

    Nachteile:

    • Dazu gehört vor allem ein Rabatt System. Es gibt zwar ein Modul (Discount) für Ubercart. Dieses ist jedoch leider nicht wirklich gepflegt und ist nicht wirklich für den Einsatz geeignet, da es auch nur teilweise funktioniert.Man hätte theoretisch die Möglichkeit, viel versch. Rabatte zu machen, aber wenn das Modul nicht will, dann klappt das auch nicht. Zudem kann man mit den Rabatten auch keine Views oder so ähnlich erstellen, um diese speziell zu bewerben. Falls nicht wirklich benötigt -> Finger weg!
    • Ich habe gehört, dass es Probleme mit der deutschen Mwst Steuer gibt, habe aber jedoch keine Erfahrung damit gemacht.
    • AGB. Diese musste ich über das Modul "legal" lösen, da anscheinend nichts dafür in Ubercart vorgesehen ist -> nur suboptimal.
    • Deutsche Übersetzung ist eine absolute Katastrophe. So viele Fehler habe ich schon lange nicht mehr gesehen. Nein, das ist wirklich nicht schön. Falls jemand interessiert ist, ich hätte eine einigermassen ok deutsche Übersetzung, welche zumindest das Interface für den Kunden korrekt übersetzt.
    • Lager. Zweite Katastrophe: Will man ein Produkt, welches nicht mehr an Lager ist, automatisch aus dem Verkauf ziehen, so muss man ein zusätzliches Modul installieren und dann den Lagerbestand in zwei verschiedenen Orte aktualisieren. Ich weiss echt nicht, was hier in die Entwickler gefahren ist!

    Fazit:

    Ich muss sagen, dass ich irgendwie ein kleines bisschen enttäuscht bin, wobei dies wohl zu einem grossen Teil durch das Discount Modul kommt. Ich denke, für einfach Shops ist es sicher gut geeignet. Will man jedoch einen zweiten Amazon und Co. aufbauen, so tut man wohl besser daran ein System zu nehmen, welches dafür ausgelegt ist.

    Es lässt sich also extrem schnell was bauen. Aber es gibt ein paar Klippen, welche dann doch nicht ganz so schön gelöst sind. Ich hoffe mal, dass hier noch weiter gearbeitet wird und ein paar Fortschritte gemacht werden.

  • Nodes ohne Titel

    Der Titel ist standardmässig in jedem Node als Pflichtfeld drin. Das ist jedoch nicht immer gewünscht. Manchmal braucht man einfach keinen Titel. Das Bodyfeld kann man leicht wegmachen, indem man einfach das label löscht, nicht so jedoch beim Titel.

    Abhilfe schafft hier das Modul Automatic Nodetitles. Wenn man es installiert hat, hat man bei den Nodetypes drei Optionen:

    • Modul nicht verwenden, Titel von Hand hinschreiben
    • Titel automatisch setzen, wenn kein Titel von Hand geschrieben wurd
    • Titelfeld ganz ausblenden und alles automatisch machen.

    Ist das Tokemodul installiert, so lassen sich Regeln für den Titel erstellen. Echt geniales kleines Ding!

     

  • Ein paar Gedanken über die Performance von Drupal

    Auf Drupalcenter gab es eine ziemlich hitzige/witzige Diskussion bezüglich der Performance von Drupal. Ich kann mir einfach nicht verkneifen diesen hier zu posten, da doch sehr informativ und auf den Punkt gebracht.

    Ich habe bisher leider noch keine Erfahrung mit hochperformanten System, bin jedoch an der Entwicklung eines solchen…

    Alexander (22.5.08):

    Das Problem mit Drupals Performance liegt mehr in den Reports begründet, die in der Regel (wie auch hier) nicht qantifiziert werden. Damit kann man dann aber in einem deterministischen System nichts anfangen und so wird "Performance" von etwas absolutem, weil messbaren, zu etwas rein subjektivem.

    Dazu gibts auch andernorts Beispiele:
    Als Windows XP auf den Markt kam, dachten alle es würde schneller starten. Warum? Weil der Dsktop früher angezeigt wird und das Laden diverser Software und Komponenten erst dananch stattfindet. Das Ergebnis ist, dass das System gefühlt schneller startet, man aber wenigstens ebenso lange warten muss, ehe man wirklich damit arbeiten kann. So wurde Performance zu einem Thema, zu dem jeder meinte etwas fachlich fundiert beitragen zu können.

    Ähnliche Probleme kenne ich aus meiner Zeit als Java-Entwickler. Client-Anwendungen in Java gelten als langsam, weil das User Interface Swing oft als sehr langsam empfunden wird, nicht reagiert, hakt, … Das Problem ist nicht, dass Java oder Swing langsam sind, sondern weil die Entwickler der Software nich verstanden hatten / nicht umzusetzen wussten, dass das User Interface im Event Dispatcher Thread läuft und das zeitaufwändige Vorgänge in der Software da rausgehalten werden müssen (mittels Threads), um die Signalverarbeitung nicht zum Stocken zu bringen.

    Zurück zu Drupal:
    Eine Drupal-Website ist, wie jede Webanwendung, eine mittlerweile recht komplexe Angelegenheit. Wir haben die Datenhaltungsebene, umgesetzt über eine realtionale Datenbank und wir haben eine Dateiebene, auf der wir die Programmdateien des CMS, Konfigurationsdateien und allerlei statische Dateien (HTML-Snippets, Template-Dateien, CSS-Dateien, Bilder, Media-Dateien, …). Für die Abarbeitung eines HTTP Requests auf das CMS wird der gesamte benötigte Code auf Dateiebene eingelesen, wird der Code geparst und ausgeführt, werden Abfragen an die Datenbank gemacht und wird Output generiert. Typischerweise finden sich in diesem Output noch reichlich Anweisungen an den Webbrowser zusätzliche Ressourcen zu laden, wie CSS-Dateien, Bilder die im CSS verwendet werden, Bilder die im HTML-Teil verwendet werden, Flash-Dateien, Media-Dateien, JavaScript-Dateien, … Dazu kommen dann vielleicht noch JS-Spielereien, die erstmal geladen sein müssen und dann nochmal den Code umbauen oder Daten nachladen.

    Wenn wir nun von einem langsamen Gesamtsystem reden gilt dasgleiche für ein CMS wie auch für eine "normale" Anwendung: Zunächst einmal müssen die Bottlenecks identifiziert werden. Wo also wird im Prozess zwischen dem ersten Request an den Server und dem vollständigen Rendern der Website wieviel Zeit verbraten?

    Darin gehen Leitungsgeschwindigkeiten ein, Latenzzeiten für einzelne Aufrufe, Caching auf Dateiebene des Servers beim Einlesen der Dateien, ggf. Caching eines PHP-Moduls um ständige Neuparsen von nicht verändertem Code einzusparen (APC, Zend Cache, …), Caching auf Dateiebene des Servers für die Datenbank, Caching der RDBMS für Abfrgen und Daten, Normierungslevel der Datenbank, Effizienz der Datenbank-Abfragen, Optimierung des PHP-Codes, Wahl der Datenstrukturen durch den Entwickler, Wahl der Algorithemn durch den Entwickler, … die Liste lässt sich noch ne ganze Weile weiterführen.

    Was gerne außer Acht gelassen wird, hier im Forum, demonstrieren Aussagen wie, "Ich habe auch andere Drupal-Seiten gesehen die waren total langsam.". Da sage ich: "Okay, ich habe schon viele statische Websites gesehen die auch langsam sind."
    Das soll mal verdeutlich, was manche hier gerne tun, nämlich allein auf Basis einer einfachen Beobachtung eine ziemlich heftige Schlussfolgerung zu ziehen, ohne diese auch nur im Ansatz fachlich belegen zu können.

    Schnappe ich mir als Laie ein CMS, klatsche alle möglichen Module rein und benutze ein Theme, dessen Entwickler (sollte ich es nicht selbst gewesen sein) vielleicht nicht der cleverste war, klatsche noch Google Maps hier und irgendwelche Web-Preview-JS-Klamotten dort rein und lasse das ganze bei einem Dumping-Hoster laufen, muss ich mich nicht wundern. Und wenn das 1000 Leute machen und ich all deren Websites abgrase liegts dennoch nicht zwingend am System als solchen.

    Gerade Shared Hosting hat das Problem, dass die überhaupt für das CMS verfügbare Performance nicht einzuordnen ist. Keiner weiß was für eine Hardware da werkelt, wie das System konfiguriert ist und womit es sonst noch beschäftigt ist, wer da noch drauf gehostet wird und welches Schindluder deren Webanwendungen gerade treiben, wenn ich mal draufschaue. Und da will mir anmaßen die Performance von Drupal zu beurteilen?

    Das ist wie Schumi in ein Kettcar setzen und sagen: "So wie der fährt, wird er nie Formel1-Weltmeister!"

    Schaut man sich mal an welche Referenz-Websites mittlerweile mit Drupal laufen, ist es schwer vorstellbar, dass Drupal generell Performance-Probleme haben soll. Wir reden da von einer ganzen Reihe von Websites mit zig Millionen Hits. Wenigstens eine Website mit zig Millionen Hits betreiben und hosten wir auch und Performance ist gar kein Problem. Da reden wir noch nicht von Multi-Server Setups, sondern von einer einzelnen Maschine, die sich erst dann mal halbwegs ausgelastet fühlt, wenn sie des Nachts mal alle Daten zusammenrafft und packt, ehe sie sie auf den backup-Server schiebt.

    Am Ende ist es wie so oft: Man bekommt, wofür man zahlt.

    Wenn also mal wieder wer meint seine Drupal-Site sei langsam, soll er mal mit spezifischen Angaben anrücken, damit man überhaupt mal Anhaltspunkte hat, in welche Richtung man weiterforschen kann.

    Aber einfach zu sagen "Drupal ist langsam" ist natürlich einfach.

    P.S.:
    Man kann mit Benchmarks belegen, dass im Vergleich zu anderen Sprachen Ruby recht langsam ist, was sich wiederum auch auf Ruby on Rails auswirkt. Das hat aber niemanden davon abgehalten performente Lösungen in RoR zu entwickeln.

  • Nike setzt auf Drupal

    Nike setzt für die Olympischen Spiele auf Drupal. Soeben habe ich auf Dries Blog gelesen, dass ihr Homepage für Peking in Drupal umgesetzt ist. Der Beweis dafür ist hier.

    Das coole dran ist, dass die Seite in extrem vielen Sprachen übersetzt ist und darunter auch weniger westliche, welche man ohne fundierte Kenntnisse kaum übersetzen kann ;). Ein Proof of Concept also, dass Drupal 6 und das i18n Modul stark verbessert wurden.

    Scheint als hält Drupal wirklich Einzug und ist auf dem Weg an die CMS Weltherrschaft 😉

     

  • Views 2.0 – Argument transformieren mit dem PHP Validator

    Ich habe den folgenden Teil als Hilfedatei für die neue Views 2.0 geschrieben. Sorry, ist in Englisch… die Drupal Welt spricht nun halt mal einfach Englisch. Die Codebeispiele sollten jedoch auch für deutschsprachige gut verständlich sein.

    Using Arguments

    Using arguments is not as simple as it might look at first glance. It's not as complicated either. Using arguments applying a transformation might be a little tricky though.

    What's it all about?

    The argument allows you to pass options (arguments is actually the better word) at runtime to the views. So lets say you want to build a views that displays different things depending on where your are. You won't be able to use filters, because they are static. That's why we use arguments.

    If you are in clean URL Mode you often have URL that might look like that: www.mydomain.com/node/23. Argument 1 (or arg 1) would be 23. That's where this option of views comes in. Technically said, the argument is a where condition in the SQL statement. In the next few sections we are going through the different kinds of arguments.

    Choose the type of argument

    There's a whole like of arguments we can choose from. It's pretty simple to explain it, looking at the SQL. This would actually be the part …. WHERE myArgument = value. So first we have to choose the first part of the WHERE clause.

    Default options

    There's a bunch of default option like Title, what to do if there's not argument and so on. They are straight forward. Some testing will quickly reveal the function.

    Validator – PHP Code

    This is the part where the Arguments become incredibly flexibel. We can transform an input argument. Main reason is though to validate the argument. This means if we use the PHP validator code we have to ensure that we return a boolean value. Here a little example code:

    The variable $argument holds the argument from the URL. If you try to use arg() it won't work! To store the new argument again we use the $handler->argument variable. If we had choose as argument type the node id, and the initial input argument value would be 23 the SQL statement would look something like that: … WHERE nid = 46 (this might not make any sense, but it shows the point).

    We can then further specify what action we are going to take if in the PHP validator we return false.

  • 1000 Posts auf Drupalcenter

    1000 Beiträge in einem Jahr… ist recht ziemlich viel. Wenn man für ein Post im Schnitt 3 Minuten braucht gibt das doch immerhin 3000 Minuten. Umgerechnet in Stunden sind das 50 h Posts schreiben… und jetzt das noch mal x € Stundenlohn… hui, da will ich lieber gar nicht dran denken.

    Aber eben, ein bisschen profitieren tue ich ja davon auch. Und die ersten Posts waren ja vor allem Fragen. Die Antworten sind dann erst mit zunehmendem Wissen gekommen. In einer langweiligen Vorlesung ist das doch eine gute Alternative 😉

  • Mehrsprachigkeit mit Drupal 6

    Nicht viele CMS beitzen so gute Multilingualeigenschaften wie Drupal dies hat. Wer jedoch in Drupal 5 schon mal eine Seite damit gebaut hat, wird schnell merken, dass es durchaus seine Tücken hat. Besonders das mit den Menus und auch der Taxonomy ist nur mangelhaft gelöst.

    Drupal 6 ebnet hier den Weg :). Das i18n Modul wurde stark ausgebaut und macht es daher sehr viel einfach. Es braucht zwar auch hier noch ein wenig Zeit, bis man sich eingelebt hat, aber es ist auf jeden Fall viel besser durchdacht.

    Heute habe ich ein hübsches Modul entdeckt, dass noch ganz nett ausschaut: Translation Overview. Dadurch gehen keine Inhalte mehr unübersetzt verloren.

  • path_to_subtheme() in Drupal 6 – Zen

    Wer mit Zen arbeitet und von Drupal 5 zu Drupal 6 kommt wird dort eine Fehlermeldung bekommen, dass die Funktion "path_to_subtheme()" nicht existiert. Mist. Dabei wurde das ganze lediglich vereinfacht:

    Drupal 5:

    path_to_subtheme() -> Der Pfad zu einem Subtheme

    path_to_theme() -> Dadurch kam man lediglich zum Theme, nicht jedoch in den unterliegenden Ordner

    Drupal 6:

    Geht das ohne Probleme. path_to_theme kommt der korrekte Pfad zurück, auch wenn es im Zen in einem Unterordner ist.

    Quelle: http://drupal.org/node/260665

  • Gästebuch mit CCK und Views

    Ein Gästebuch lässt sich sehr effizient mit CCK und Views erstellen. Ja, es gibt extra ein Guestbook Modul dafür. Das bringt jedoch auch einige Nachteile mit sich: Inflexibilität! Was sind denn eigentlich die Grundfunktionen eines Gästebuches? Diese gilt es mit CCK und Views nachzubilden:

    • Neuen Eintrag erstellen
    • Neue Einträge moderieren
    • Chronologisch auflisten
    • Name, URL, E-mail angeben
    • Spam Control

    Das wäre es dann eigentlich auch schon. Nicht wirklich sehr viel und wenn man es genau anschaut, ist das einfach ein Node, welcher abgeschickt wird und dann aufgelistet wird. Sehr simpel also.

    Wenn man jetzt also das Gästebuch zuhand nimmt, so ist das sehr einfach und schnell. Modul installieren, ein bisschen konfigurieren und schon ist es fertig. Was ist jedoch, wenn man etwas ausbauen will? Was ist, wenn man zusätzliche Felder einfügen will? Wenn man z.B. die neusten Gästebucheinträge in einem Block anzeigen will? Was ist, wenn die Darstellung komplett geändert werden will? Was ist mit Multisprachigem Interface?

    Vielleicht kann es das Guestbook Modul, vielleicht aber auch nicht. Daher setzt hier dann die CCK und Views Lösung an, welche die enorme Flexibilität mit sich bringt.

    Es werden folgende Module benötigt:

    • CCK Content
    • CCK Textfield
    • Views
    • Views UI

    Als erstes fügen wir jetzt einen neuen Inhaltstypen "Guestbook" hinzu. Wichtig hier: Bei den Workflow Einstellungen alle Häckchen wegnehmen. Node soll also nicht published werden und soll nicht auf der Frontpage erscheinen. Auch die Comment Settings würde ich noch verändern. Kommentare sollten eigentlich nicht aktiviert werden -> ist meistens in einem Gästebuch nicht der Fall. Speichern

    In der Übersicht aller Inhaltstypen auf "bearbeiten" für unseren Guestbook Inhaltstypen. Dann auf "Feld hinzufügen". Feld Name: z.B. "Name". Dann auf "weiter" und hier noch entsprechende Anpassungen machen. Was ich als vernünftig ansehe: Label: "Name". Required -> Ja. Plan Text (also kein HTML oder so irgend etwas. -> "Speichern".

    Jetzt kommen wir auf die Seite admin/content/node-type/guestbook/fields. Hier können wir noch die Reihenfolge der Felder einstellen. Wohl am Besten: Name, Titel, Body.

    Als nächstes müssen wir eine View erstellen: admin/build/views/add. Hier einfach die entsprechend Sachen eingeben. Ausgabe als Node und auf weiter. Jetzt kommen wir in das schöne neue Views Interface. Ist ein bisschen gewöhnungsbedürftig, wenn man sich das alte UI noch gewohnt ist, aber geht relativ schnell.

    Zuerst wollen wir eine Page (Seiten) Ansicht hinzufügen (Links unterhalb von Defaults). Jetzt können wir zischen den defaultwerten und den Werten für Page hin und her wechseln. Auf der Page Seite müssen wir eine URL angeben, wo die View erreichbar sein soll. Weiter müssen wir einen Filter einrichten, dass nur die Einträge, welche veröffentlicht sind und welche vom Typ guestbook sind angezeigt werden. Dann wollen wir noch das sorting auf descending setzen (der neuste Eintrag soll zuoberst sein). Zum Schluss setzen wir den Row Style auf "Full node".

    Oky, das wäre es dann auch schon.

    Jetzt müssen wir noch die Berechtigungen setzen: admin/user/permissions. Hier einfach die entsprechenden Häckchen setzen. That's it.

    Das Modul kann jetzt nach belieben ausgebaut werden:

     

    • Für CCK ein Feld E-mail hinzufügen
    • Für CCK ein Feld URL hinzufügen
    • Das ganze schön Themen
    • Eine zusätzliche View für den Moderator hinzufügen
    • Spam protection (z.B. Mollom) hinzufügen
    • Workflows hinzufügen, so dass der Moderator benachrichtigt wird, wenn ein neuer Eintrag zum Moderieren vorhanden ist
    • RSS Feed hinzufügen
    • YouTube Feld hinzufügen
    • Interface Übersetzung mit dem i18n Modul

    Wie man sieht lässt sich die Liste noch sehr weit erweitern. Ich habe leider im Moment zu wenig Zeit um das zu testen. Zudem habe ich hier lokal das ganze schnell in D6 umgesetzt. Hier fehlen leider noch ein paar Module. Ich denke jedoch, dass der Lösungsansatz damit gegeben ist.