Websitegeschwindigkeit über UMTS/EDGE testen

Viele Webdeveloper kennen das Problem sicherlich: Man sitzt zu Hause vor der dicken Leitung mit 25, 50 oder gar 100 MBit und baut z.B. eine mobile Version einer Website. Schwer vorstellbar, wie da die Ladezeiten im wirklichen Leben auf mobilen Endgeräten aussehen. Und das komplette Kontingent seiner Daten’flatrate’ will man ja auch nicht mit Tests aufbrauchen.

Abhilfe kommt von Apple. Im neuen XCode 4.1 (kostenlos) für Max OS X Lion (10.7) findet sich, versteckt unter /Programme/Dienstprogramme (bei manchen auch unter /Developer/Applications/Utilities) ein Ordner Namens Network Link Conditioner.

Klickt man die Prefpane-Datei doppelt, die sich darin befindet, installiert sich ein neuer Eintrag in den Systemeinstellungen, über den man verschiedenste Zugänge und Leitungsqualitäten simulieren kann. Apple hat bereits diverse Profile angelegt, eigene Konfigurationen kann man problemlos hinzufügen. Und dann kann man feststellen, dass beispielsweise diese Seite über VDSL50 in knapp zwei Sekunden lädt, während sie über gutes 3G-Netz ca. 10 mal so lange braucht.

Es wäre schön, wenn Apple dieses Utility einzeln zum Download anbieten oder direkt mit Lion ausliefern würde, derzeit bleibt einem nur der 3GB große XCode-Download. Nur dafür lohnt sich das sicherlich nicht, alle, die XCode sowieso installiert haben, bekommen aber ein nützliches kleines Helferlein für die tägliche Arbeit an die Hand.

via Matt Gemell

Umlaute im URL key von Magento

Umlaute ist ja eines meiner Lieblingsthemen. Und Magento stellt sich da direkt hinter Afterbuy in die ‘Können wir nicht’-Schlange. Naja, fast. So heißt es in meinem Lieblingsbuch auf Seite 162:

Die URL-Bezeichnung ist wichtig, wenn Sie als Shop-Besitzer die Anzeige in der Adressleiste eines Browsers beeinflussen möchten. Sollten Sie das Feld leer lassen, generiert Magento automatisch aus dem Produktnamen die URL-Bezeichnung. Da das System aus dem USA stammt, werden die Umlaute dabei nicht berücksichtigt, sondern falsch dargestellt: ä als a, ö als o etc.

Soweit richtig. Magento berücksichtigt in der URL-Bezeichnung (URL key) keine Umlaute. Warum man im Buch aber nicht direkt auf die Lösung verweist erschließt sich mir nicht. Denn wer mag schon bei vierstelligen Produktzahlen jeden URL key in Handarbeit erstellen?

Allerdings muss die im Magento-Wiki befindliche Lösung noch etwas erweitert werden, denn die Einträge in app/etc/local.xml, die im Wiki genannt werden, berücksichtigen weder ß noch die Großbuchstaben Ä, Ö und Ü (die Ersetzung erfolgt offensichtlich bevor der String in Kleinbuchstaben gewandelt wird).

Der fertige Block, der direkt vor </config> eingesetzt wird, muss also lauten:

<default>
  <url>
    <convert>
      <char0228><from>ä</from><to>ae</to></char0228>
      <char0246><from>ö</from><to>oe</to></char0246>
      <char0252><from>ü</from><to>ue</to></char0252>
      <char0223><from>ß</from><to>ss</to></char0223>
      <char0196><from>Ä</from><to>ae</to></char0196>
      <char0214><from>Ö</from><to>oe</to></char0214>
      <char0220><from>Ü</from><to>ue</to></char0220>
    </convert>
  </url>
</default>

Damit werden Umlaute im Produktnamen im URL key korrekt umgeschrieben. Die Einstellung greift nicht für Kategorien. Wer dafür eine Lösung hat, immer her damit, aber Kategorien legt man ja auch nicht so oft neu an wie Produkte bzw. nicht in der selben Anzahl.

xt:Commerce: Bestellnummer mit Datum

Das ist jetzt zur Abwechslung mal keine 1:1-Anleitung, die man einfach mittels Copy&Paste übernehmen könnte, sondern eher ein Beitrag, der einem eine Idee geben soll, wie man das Problem angehen kann. Er setzt voraus, dass man sich einigermaßen gut mit php und dem Shopsystem auskennt und in der Lage ist, Transferleistungen vorzunehmen. Wer sich das nicht zutraut sollte die Finger davon lassen oder nachher nicht rumheulen.

Die Frage kommt immer mal wieder und sie ist meiner Meinung nach auch durchaus berechtigt: Wie kann man die Bestellnummer eines xt:Commerce-Systems mit zusätzlichen Informationen anreichern, sei es ein Shopkürzel, das Datum oder auch einfach einer Zufallszahl? Die kurze Antwort ist: Geht nicht, denn xt:Commerce nimmt die inkrementell von MySQL erzeugte ID als Bestellnummer. Die lange Antwort ist: Geht schon, erfordert aber tiefe Eingriffe ins System. Updatefähigkeit ade. Aber das ist ja mit jedem xt:Commerce-‘Modul’ so.

Beginnen wir mit dem leichten Teil der Übung. Einer Funktion, die eine Bestellnummer mit Datum zurück liefert. Dazu brauchen wir neben der systemseitig generierten ID noch das Bestelldatum. Sonst haben wir morgen eine andere Bestellnummer als heute. Die Datei packen wir in das inc/-Verzeichnis und nennen sie xtc_build_order_id.php.

function xtc_build_order_id($date, $id) {
	$date = strtotime($date);
	return sprintf("%d%02d%02d-%05d", strftime("%y", $date), strftime("%m", $date), strftime("%d", $date), $id);
}

Der anstrengende Teil kommt jetzt: Überall, wo die Bestellnummer zur Ausgabe verwendet wird, muss der Funktionsaufruf ergänzt werden. Wir reden mindestens von diesen Dateien:

account_history_info.php
account_history.php
account.php
checkout_success.php
print_order.php
send_order.php

Dazu kommen alle Zahlungsmodule, sofern diese die Bestellnummer ausgeben oder benutzen (z.B. Paypal) und mindestens die orders.php im admin/-Verzeichnis. In jeder dieser Dateien muss am Anfang, nach den schon vorhanden includes, zunächst unsere Funktionsdatei inkludiert werden:

require_once(DIR_FS_INC.'xtc_build_order_id.inc.php');

und wie gesagt die Bestellnummer durch den Funktionsaufruf ersetzt werden, so wird z.B. in der send_order.php aus

$smarty->assign('oID', $insert_id);

das hier:

$smarty->assign('oID', xtc_build_order_id($order->info['date_purchased'], $insert_id));

Was daran anstrengend ist? Man muss sich in jeder Datei wieder raussuchen, in welcher Variable die Order-ID versteckt ist. In send_order.php ist es wie gesehen $insert_id, in print_order.php hingegen $_GET['oID']. Denn im $order-Objekt kommt die ID selbst nicht vor – wäre ja auch zu einfach. Und mitunter, wie in account_history.php, hat man nicht einmal ein $order-Objekt zur Verfügung.
Man muss also gewillt sein, ein bisschen zu suchen. Und man muss wissen, was man tut.

Der +1-Button – die SEO-Revolution

Mit dem internationalen Rollout des +1-Buttons auf Webseiten tauchen auch hier die ersten Anleitungen auf, wie man das ganze beispielsweise in einen xt:Commerce-Shop integrieren kann.

+1 wird die Suche, wie wir sie kennen, revolutionieren. Und mit der Integration in die Google Webmaster Tools geht der Suchgigant gleich noch einen Schritt weiter und bietet eine Auswertung des Buttons in einem seiner Produkte, das jeder Shopbetreiber eh nutzen sollte.

Das ganze lässt sich mit wenigen Handgriffen in den eigenen Shop integrieren. Ich präferiere aber einen Ansatz, der nicht an allen möglichen Stellen im Template {php}-Tags nutzt, daher: In includes/application_bottom.php kurz vor dem schließenden <body>-Tag einfügen:

echo '<script type="text/javascript" src="https://apis.google.com/js/plusone.js">{lang:''.$_SESSION['language_code'].''}</script>';

An der Stelle in der Produktseite, wo der +1-Button erscheinen soll, muss dann nur noch entweder der Button in Googles XML-Syntax oder die HTML5-Variante eingefügt werden (HTML5 empfiehlt sich, wenn man das ganze fehlerfrei durch den Validator bekommen will):

<div class="g-plusone" data-size="medium"></div>

Das ganze kann dann so aussehen:

Produktseite mit +1-Integration

Die Angabe des Zählers kann man sich sparen, wenn man diesen sowieso anzeigen will. Die Angabe der URL kann man sich ebenfalls sparen, wenn man saubere URLs hat oder einen canonical-Tag benutzt. Die Finger lassen sollte man generell von den xt:Commerce eigenen ‘SEO-URLs’ – und damit ist auch die preg_replace()-Geschichte, wie bei Christian vorgeschlagen, vom Tisch. Saubere URLs, z.B. für den canonical-Tag, bekommt man für ein Produkt mittels

xtc_href_link(FILENAME_PRODUCT_INFO, xtc_product_link($product->data["products_id"]))

Wer mit irgendwelchen Umleitungen beispielsweise seiner Produktseiten arbeitet, um auch serverseitig für wirklich kanonische URLs zu sorgen, muss evtl. ein gesondertes Augenmerk auf die Funktion legen, die hier für die Redirects verantwortklich ist. Google überprüft nämlich die URL, indem sie aufgerufen wird. Landet diese Überprüfung in einem Redirect hat man schnell statt des +1-Buttons ein rotes Ausrufezeichen und im Firebug findet sich in der Antwort des entsprechendes Requests:

400 Bad Request: Cannot confirm a connection that was not proposed.

Im Log findet sich zum zugehörigen Request ein Client, der sich als ‘Firefox/1.0.4’ identifiziert. Da dieser in der freien Wildbahn faktisch ausgestorben ist kann man darauf eine mögliche Überprüfung aufbauen.