preload
Dez 12

ExtJS: Restore grid scroll position after store reload

Werden von einem Grid aus Daten bearbeitet (bspw. durch RowEditing oder Popup), wird nach dem Speichern der Store aktualisiert (bspw. store.load()). Damit nach dem Reload das Grid nicht in die obere linke Ecke zurückscrollt, sondern an der Position bleibt, an der es sich auch zuvor befunden hat, genügt es, in der viewConfig des GridPanels die Eigenschaft preserveScrollOnRefresh auf true zu setzen, was bspw. wie folgt aussehen kann:

  
var grid = Ext.create('Ext.grid.Panel', {
  ...
  viewConfig: {
    ...
    preserveScrollOnRefresh: true,
    ...
  },
  ...
});

Andere Vorgehensweisen, wie bspw. die undokumentierte Eigenschaft invalidateScrollerOnRefresh auf false zu setzen funktioniert zwar bei Updates, bringt jedoch Probleme mit sich, wenn Datensätze gelöscht oder erzeugt werden. Dafür sind wiederum Workarounds notwendig, die man sich ganz einfach sparen kann, indem man die o.g. Methode mit preserveScrollOnRefresh in der viewConfig auf true setzt.

Okt 31

Mobile_Detect ist eine einzige PHP-Klasse, mit der sich mobile Endgeräte erkennen lassen (siehe Eintrag "Mobile Endgeräte mit PHP erkennen").

php-mobile-detect liegt nun in Version 2.3 vor und bietet eine verbesserte und aktualisierte Erkennung für mobile Endgeräte (Tablets und Smartphones)

Projekt-Homepage und Download: php-mobile-detect

Okt 15

Mail-Server können eine Maximal-Länge je Zeile in einer E-Mail vorgeben. Wird diese Länge überschritten, tritt eine Fehlermeldung in der Form ... line limit exceeded auf.

Abhilfe schafft die Verwendung der PHP-Funktion chunk_split. Diese Funktion splittet einen String in Zeilen beliebiger Länge auf (standardmäßig 76 Zeichen).

Ob der mit chunk_split erzeugte String noch das gewünschte Ergebnis liefert ist natürlich für jeden Anwendungsfall einzeln zu prüfen.

Beschreibung der Funktion auf php.net:
http://php.net/manual/en/function.chunk-split.php

Feb 15

Seit PHP 5.3.9 existiert eine PHP-Einstellung max_input_vars, die standardmäßig auf den Wert 1000 gesetzt ist, was unter anderem den Zweck hat, DOS-Attacken zu vermeiden. Eine genauere Beschreibung finden Sie in Artikel ‘Supercolliding a PHP array’ in nicik’s blog.

In komplexen Formularen können durchaus mehr als 1000 Felder vorkommen – sicherlich nicht alltäglich, aber durchaus möglich. Seit PHP 5.3.9 erhält man bei solchen großen Formularen durch die standardmäßige Begrenzung auch standardmäßig Probleme, da plötzlich x POST-Felder fehlen.

Dieses Problem kann behoben werden, indem über die auf dem jeweiligen Server zur Verfügung stehenden Optionen die PHP-Einstellung max_input_vars auf einen ausreichend großen Wert gestellt wird.

Aug 15

Man meint ja, wenn es etwas gibt, was Computer besonders gut können, dann ist es Rechnen. Im Allgemeinen trifft das ja auch zu und auch in diesem speziellen Fall war das Problem letztendlich vor dem Monitor, aber vielleicht hilft der Hinweis hier, dass 2 oder 3 Menschen weniger mit diesem Effekt zu kämpfen haben.

Generell ist unsere bevorzugte Datenbank-Plattform ja Oracle und damit kommen wir auch ganz gut klar. In manchen Fällen müssen wir uns aber auch z.B. mit dem Microsoft SQL-Server® befassen. Und dabei bin ich vor kurzem auf eine Eigenheit des SQL-Servers gestoßen, die mir bislang so nicht bewusst war. Bei Oracle liefert ein Statement der Art

select 8 / 5 from Table

das Ergebnis 1,6. Das gleiche Ergebnis erhält man auch, wenn man zwei Number-Spalten miteinander dividiert, die eben diese Zahlen beinhalten.
Der SQL-Server hingegen ist der festen Meinung, dass das richtige Ergebnis erst einmal nur 1 ist. Der simple Grund dafür: Bei reinen Integerwerten gibt der SQL-Server auch einen reinen Integerwert zurück (den er leider nicht einmal rundet, sondern nur abschneidet). Mein Matheleher hätte mich wohl hochkant aus dem Kurs geworfen mit solchen Rechenkünsten. Aber wie schon erwähnt, steht es auch so in der Dokumentation zum SQL-Server (http://msdn.microsoft.com/de-de/library/ms175009.aspx) und somit kann ich niemandem einen Vorwurf machen, außer mir selbst.
Falls man dem SQL-Server doch zu einer richtigen Berechnung überreden möchte (mit dessen Ergebnis auch mein Mathelehrer einverstanden wäre), muss man mindestens einen der Operanden als Float-Wert darstellen.

select 8 / 5.0 from Table

Bzw. eben mit einem entsprechenden Type-Casting bei den Spalten.

Tja, man lernt eben nie aus und kann auch in der Mathematik immer wieder neue Überraschungen erleben.

Tagged with:
Aug 10

Immer öfter besteht die Anforderung, Webseiten auch auf mobilen Endgeräten verwendbar zu halten – sei es über Anpassungen auf der eigentlichen Webseite oder über eine spezielle mobile Version. Die Datenstruktur sollte sich dabei gar nicht ändern, der Code idealerweise nur wenig. Dazu ist bei der Erzeugung der Ausgabe zwischen dem Ziel zu unterscheiden: Bspw. ein Rechner, irgendein mobiles Endgerät, ein Android-Phone, ein Windows-Phone, usw… Diese Aufgabe lässt sich bequem und sehr einfach mit php-mobile-detect bewerkstelligen…

Weiterlesen

Aug 08

Auf der Manual-Seite zu array_diff lautet die Beschreibung “Ermittelt die Unterschiede zwischen Arrays” und “Vergleicht array1 mit array2 und gibt die Unterschiede zurück.” Dieser Beschreibung nach könnte man davon ausgehen, dass der folgende Code-Abschnitt die Elemente von A liefert, die nicht in B vorkommen und die von B, die nicht in A vorkommen; eben “die Unterschiede”.

<?php
  
  $aElementA = array(1, 2, 3, 4);
  $aElementB = array(2, 4, 6, 9);
  
  $aResult = array_diff($aElementA, $aElementB);
  
  var_dump($aResult);
  
?>

Das evtl. erwartete Ergebnis, nämlich array(1, 3, 6, 9) wird nicht geliefert. Stattdessen lautet das Ergebnis array(1, 3)

Ein paar Zeilen weiter unten auf der Manual-Seite wird der erste Parameter beschrieben als “Das Array, das verglichen werden soll” und der zweite Parameter als “Das Array, mit dem verglichen werden soll”.

Eine etwas besser verständliche Beschreibung für array_diff könnte lauten Liefert A ohne B, denn genau das ist das Ergebnis des Aufrufs: Elemente aus Menge A, die nicht in Menge B vorkommen.

Jul 26

Videos, die auf Webseiten dargestellt werden sollen, liegen nur selten in einem einheitlichen Datei-Format und mit einheitlicher Breite und Höhe vor. Bspw. werden Produkt-Daten mit einem PIM-System (weitere Informationen zu Product-Information-Management) zentral gepflegt und anschließend über unterschiedliche Kanäle verteilt. Einer dieser Kanäle kann eine Webseite sein, auf der die vom Anwender im PIM-System eingepflegten Videos bspw. pro Produkt angezeigt werden sollen. An dieser Stelle ist es nun wichtig, auf die unterschiedlichen Video-Formate und -Maße zu reagieren. Bspw. sollen Informationen über die Auflösung, den verwendeten Codec usw. angezeigt werden. Außerdem soll der eingebettete Player (je nach ermitteltem Video-Format unterschiedlich, bspw. für FLV, WMV, MOV, usw.) in den Maßen des Videos angezeigt werden (bspw. 480×320 oder bei einem anderen Video 800×450 oder ähnlich). All diese Informationen und noch weitaus mehr lassen sich wunderbar mit dem Tool “getID3() – The PHP media file parser” auslesen. Die Informationen werden als Array geliefert und können dann dem jeweiligen Anwendungsfall entsprechend verwendet werden.

Informationen, Beispiele und Download bei SourceForge.net:
» getID3() – The PHP media file parser

Jul 11

Gelegentlich kommt es vor, dass man eine mit PHP erzeugte HTML-Ausgabe vor der Ausgabe noch modifizieren möchte. Bspw. sollen alle src-Attribute in img-Tags geändert werden. Soll gleichzeitig noch jede Ersetzung anhand bestimmter Kriterien oder mit wechselnden Optionen durchgeführt werden, kommt idealerweise ein Callback einer Funktion oder einer Methode zum Einsatz. Wenn zum Finden der gewünschten Inhalte ein regulärer Ausdruck verwendet werden kann bzw. soll, ist preg_replace_callback die richtige Wahl.

Dieser Artikel beschreibt anhand eines Beispiels, wie mittels preg_replace_callback innerhalb einer Methode alle src-Attribute von img-Tags gefunden und über ein Callback einer Methode der selben Klasse ersetzt werden können.

Weiterlesen

Tagged with:
Feb 10

Der folgende Code erläutert das Vorgehen zum Skalieren einer PNG-Datei mit Alpha-Transparenz bei Verwendung der PHP-Grafikbibliothek GD. Wichtig hierbei ist, dass die Informationen aus dem Alphakanal gespeichert werden müssen (imagesavealpha), das Alphablending hingegen deaktiviert sein muss (imagealphablending).

<?php

// Original-Bild laden und dessen Breite und Höhe bestimmen
$in = imagecreatefrompng(“image.png”);
$iWidthOld = imagesx($in);
$iHeightOld = imagesy($in);

// Breite und Höhe für neues Bild festlegen und Bild erzeugen
$iWidthNew = 320;
$iHeightNew = 240;
$out = imagecreatetruecolor($iWidthNew, $iHeightNew);

// Alphablending (bspw. für grafische Objekte) deaktivieren – wichtig!
imagealphablending($out, false);

// Die Informationen aus dem Alphakanal sollen gespeichert werden
imagesavealpha($out, true);

// Originalbild mit Zielmaße in das neue Bild kopieren
imagecopyresampled($out, $in, 0, 0, 0, 0, $iWidthNew, $iHeightNew, $iWidthOld, $iHeightOld);

// Header ausgeben
header(“Content-Type: image/png”);

// PNG-Datei als Ausgabe erzeugen
imagepng($out);

?>