Artikel mit Tag php
HTML erlauben bei Usereingaben
Joomla hat ab einer der letzten Versionen - ich glaube 1.5.14 - die durchaus vernünftige Eigenschaft, dass HTML in $_GET und $_POST Parametern automatisch gefiltert wird. Das ist zwar grundsätzlich gut, blöd ist es nur wenn man nichts davon weiß und dich die ganze Zeit wundert wieso vor verschiedenen Zeichen auf einmal nur mehr Slashes auftauchen, sprich diese escaped werden. Egal, nach langer Suche weiß ich jetzt wie man damit umgeht:
$parameter = JRequest::getVar( 'parameter', '', 'post', 'string', JREQUEST_ALLOWHTML );
Bildbearbeitung mit PHP
Dateien hochladen
Dieser erste Teil hat noch nicht unbedingt was mit Bildverarbeitung zu tun, aber meistens kommen die Bilder ja über die PHP-Applikation erst auf den Server.
Um eine Datei auf den Webserver zu laden benötigt man ein Formular, das in seiner einfachsten Form ungefähr so aussehen könnte:
<form name="uploadform" method="post" enctype="multipart/form-data" action=""> <input type="file" name="thefile" /> <input name="thesubmit" type="submit" value="Upload image" /> </form>
Wichtig ist, dass als Methode POST angegeben wird und als MIME-Typ (enctype) multipart/form-data, da der Dateiupload sonst nicht funktioniert.
Im Ziel-Script (das im action-Attribut angegeben werden kann, wenn nichts angegeben wird, wird das selbe Script wieder geladen) kann man nun die hochgeladene Datei überprüfen und in ein Verzeichnis seiner Wahl kopieren:
<?php
//überprüfen, ob das Formular gesendet wurde
if(isset($_POST['thesubmit'])){
//Metadaten, die uns PHP über die Datei liefert ausgeben
echo $_FILES['thefile']['name'] . "<br />";
echo $_FILES['thefile']['type'] . "<br />";
echo $_FILES['thefile']['tmp_name'] . "<br />";
echo $_FILES['thefile']['error'] . "<br />";
echo $_FILES['thefile']['size'] . "<br />";
//überprüfen des MIME-Typs
$mime = $_FILES['thefile']['type'];
if($mime == 'image/gif' || $mime == 'image/jpeg' || $mime == 'image/png'){
//aktueller Pfad und Dateiname des Bildes
$oldfile = $_FILES['thefile']['tmp_name'];
//vorgesehener Pfad und Dateiname des Bildes
$newfile = 'uploads/'.$_FILES['thefile']['name'];
//datei kopieren
move_uploaded_file($oldfile, $newfile);
}
}
?>
Das Bild wird also hochgeladen, überprüft ob es sich um ein Bild handelt, dann wird es aus dem Temporären Verzeichnis in ein beliebiges neues kopiert, in unserem Fall uploads/, mit dem Originalnamen dahinter.
Achtung! Die Überprüfung des MIME-Typs (oder auch der Dateiendung) genügt noch nicht als sichere Überprüfung der Datei. Eine bessere Methode ist, mit den weiter unten vorgestellten Funktionen zu prüfen, ob das Bild tatsächlich eine Höhe und eine Breite hat. Ist auch keine 100% sichere Methode, aber schon mal besser als gar keine.
Auch der Dateiname sollte geändert werden, der Originalname sollte niemals übernommen werden.
Bild von Datei laden
Dafür gibts drei Funktionen für gif, jpeg und png:
- resource imagecreatefromgif ( string $filename )
- resource imagecreatefromjpeg ( string $filename )
- resource imagecreatefrompng( string $filename )
Dadurch erhält man einen Zeiger auf die Grafik, z.B.:
$image = imagecreatefrompng( 'einbild.png' );
Daten eines Bildes - Metadaten
Für viele Anwendungen in der Bildverarbeitung ist es wichtig, Daten über das Bild zu erhalten. Dazu gehören unter anderem Höhe, Breite, Typ, Farbtiefe usw. Die gängigste Funktion für diese Metadaten ist getimagesize(). Diese Funktion liefert ein Array mit 7 Elementen, die verschiedene Metainformationen beinhalten.
- Index 0 Breite des Bildes
- Index 1 Höhe des Bildes
- Index 2 ist eine der IMAGETYPE-Konstanten (IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_SWF, IMAGETYPE_PSD, IMAGETYPE_BMP, IMAGETYPE_WBMP, IMAGETYPE_XBM, IMAGETYPE_TIFF_II, IMAGETYPE_TIFF_MM, IMAGETYPE_IFF, IMAGETYPE_JB2, IMAGETYPE_JPC, IMAGETYPE_JP2, IMAGETYPE_JPX, IMAGETYPE_SWC, IMAGETYPE_ICO)
- Index 3 Textstring im Format 'height="yyy" width="xxx"'für ein IMG-Tag.
- Index mime Der MIME Typ des Bildes
- Index channels 3 für RGB und 4 für CMYK Bilder.
- Index bits Die Farbtiefe in Bit pro Farbe .
Größe eines Bildes ändern
Um ein Bild zu skalieren, braucht man mehrere Funktionen, die man am besten in einer Funktion zusammenfasst:
public static function scaleImage($image, $maxwidth, $maxheight){
list($image_width, $image_height) = getimagesize($file);
if($image_width > $image_height){
$new_image_width = $maxwidth;
$new_image_height = $image_height*($maxheight/$image_height);
}else{
$new_image_height = $maxheight;
$new_image_width = $image_width * ($maxwidth/$image_width);
}
$new_image = imagecreatetruecolor(round($new_image_width),
round($new_image_height));
imagecopyresized($new_image, $image, 0, 0, 0, 0, $new_image_width,
$new_image_height, $image_width, $image_height);
return $new_image;
}
Die Funktion nimmt als Parameter einen Zeiger und die gewünschte maximale Breite und maxiamle Höhe entgegen. Je nachdem, ob Höhe oder Breite größer ist, wird dann der andere Wert berechnet.
Danach wird ein neues Bild mit der berchneten Größe erstellt.
Schlußendlich kopiert die Funktion imagecopyresized() das alte Bild in das neue Bild.
Die verwendeten Funktionen:
resource imagecreatetruecolor ( int $width , int $height ) bool imagecopyresized ($to, $from, $to_x, $to_y, $from_x, $from_y, $to_w, $to_h, $from_w, $from_h)
Bild speichern bzw. ausgeben
Um ein Bild zu speichern oder im Dokument auszugeben gibt es wieder für jedes Format die entsprechenden Funktionen:
bool imagegif ( resource $image [, string $filename ] ) bool imagejpeg ( resource $image [, string $filename [, int $quality ]] ) bool imagepng ( resource $image [, string $filename [, int $quality [, int $filters ]]] )
Das Bild wird einfach im Skript ausgegeben, wenn kein Dateiname angegeben ist.
Die Qualität wird für JPEGs von 0-100 und bei PNGs von 0-9 angegeben.
$filters kann eine der Konstanten PNG_NO_FILTER, PNG_FILTER_NONE, PNG_FILTER_SUB , PNG_FILTER_UP, PNG_FILTER_AVG, PNG_FILTER_PAETH oder PNG_ALL_FILTERS sein.
Neues, leeres Bild erstellen
Das geschieht durch die Funktion
resource imagecreate ( int $width , int $height )
Einfach Breite und Höhe angeben und den zurückgegebenen Zeiger in einer Variable speichern.
Farben definieren
Zu Beginn ist die Farbpalette des Bildes leer, das heißt man muss jede neue Farbe vor jeder Operation definieren:
int imagecolorallocate ( resource $image , int $red , int $green , int $blue )
Also z.B.:
$white = imageColorAllocate($image, 255, 255, 255)
Diese Farbe kann dann manchen Funktionen mitgegeben werden.
Außerdem legt der erste Aufruf der Funktion den Hintergrund der Grafik fest, außer sie wurde mittels imagecreatetruecolor() erstellt.
Ausschnitt eines Bildes in ein anderes kopieren
bool imagecopy ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h )
Text einfügen
Zeichenketten kann man mithilfe der Funktion
bool imagestring ( resource $image , int $font , int $x , int $y , string $string , int $color )
ausgeben, wobei die Parameter für das Bild, die Schriftart (1-5), die Position, die auszugebende Zeichenkette und die Farbe stehen.
Für weitere Schriftarten siehe die Funktion
int imageloadfont ( string $file )
Zeichnen
Man kann in ein Bild verschiedene Formen zeichnen, dafür gibt’s unter anderem die folgenden Funktionen:
bool imagesetpixel ( resource $image , int $x , int $y , int $color ) bool imageline ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $color ) bool imagerectangle ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $color ) bool imagefilledrectangle ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 ,int $color ) bool imageellipse ( resource $image , int $cx , int $cy , int $width , int $height , int $color ) bool imagefilledellipse ( resource $image , int $cx , int $cy , int $width , int $height, int $color ) bool imagearc ( resource $image , int $cx , int $cy , int $width , int $height , int $start , int $end , int $color ) bool imagepolygon ( resource $image , array $points , int $num_points , int $color )
Interner Link im Joomla-Template
Manchmal kann es notwendig sein, einen internen Link direkt ins Joomla Template einzufügen. Die naheliegendste Möglichkeit ist wohl, auf die entsprechende Seite im Browser zu gehen, die URL zu kopieren und im Template einzufügen. Allerdings kann sich der Name der Seite (und damit unter Umständen der Alias) ändern und das ergibt dann ungültige Links auf der Seite. Diese gilt es zu vermeiden.
Nun, die Lösung ist eigentlich ganz einfach und heißt JHTML::link(). Das ist die Funktion, die aus einer URL mit GET-Parametern eine schöne Joomla-URL macht.
Also, zuerst müssen wir den Link zusammenbauen:
Einen Artikel verlinken
Im Joomla-Backend auf die Beitragsübersicht gehen um die ID des Artikels herauszufinden (in der ganz rechten Spalte):

Die ID wird dann an den folgenden Link statt xyz angehängt.
index.php?option=com_content&view=article&id=xyz
Oft will man aber nicht auf den Beitrag, sondern auf einen bestimmten
Menüpunkt verlinken
Dazu geht man im Backend auf ein Menü, und wählt den entsprechenden Menüeintrag aus. In der Detailansicht sieht man dann die ID des Menüeintrags (Menü-Item), die man benötigt:

Auch hier wird die ID (in diesem Fall 54) an den Link angehängt:
index.php?Itemid=xyz
Ins Template einfügen
Nun muß der Link nur noch an der gewünschten Stelle ins Template eingefügt werden:
<?
echo JHTML::link('index.php?Itemid=xyz','Linktitel', $attribute);
?>Mögliche HTML Attribute des Link-Tags können über das assoziative Array $attribute übergeben werden, z.B.:
<?
$attribute = array('class'=>'menulink', 'title'=>'Zum Menü');
echo JHTML::link('index.php?Itemid=xyz','Linktitel', $attribute);
?>
Die aktuelle Kalenderwoche anzeigen
Ich habe momentan keinen Kalender in Papierform den ich die ganze Zeit mit mir herumschleppe. Hab ich nicht und brauch ich eigentlich nicht. Meine Termine und Vorhaben hab ich schön im Kopf, auf Post-Its, auf den Uni-Webseiten oder auf dem Standkalender auf meinem Schreibtisch.
Ich weiß, dass sollte ich ändern, aber das ist ein anderes Kapitel. Was ich damit eigentlich sagen möchte ist, dass ich, wann immer ich es mir helfen würde, nie die aktuelle Kalenderwoche weiß. Nie. Und der blöde Windows-Taskleiste-Kalender zeigt mir auch keine Kalenderwochen an. Blöd.
Also hab ich das getan, was wohl jeder machen würde, wenn er auf dieses Problem stößt: ich hab mir eine Domain registriert und ein kleines Service eingerichtet, tataaaa, hier ist es:
Ach ja: Kalenderwoche mit PHP berechen? Kein Problem:
<?php
$kw_aktuell = (int)date('W');
?>
Die Programmierer-Hierarchie
Eine Hierarchie, wie sich Programmierer bestimmter Sprachen selbst sehen, also wer sich wem überlegen fühlt.
Bemerkenswert der Kommentar zu Ruby (frei übersetzt):
Ruby Programmierer fühlen sich jedem überlegen, aber sie wissen nicht dass es auch Nicht-Web-Programmiersprachen gibt, darum sind sie in der Grafik über Perl.
Hm, hat was wahres...

Via informatik-forum.at.
Gratis eBook "MySQL mit PHP"
O'Reilly hat in seiner Serie OpenBooks ein neues eBook zum Download bereitgestellt. Heißen tut das gute Stück "MySQL mit PHP".Es beschreibt die Installation des "magischen Trios" Apache, PHP und MySQL, Grundlagen und Methoden des Datenbankentwurfs (Datentypen, Schlüssel, Entity-Relationship Diagramme, Normalisierung,..), und wie man per SQL mit der Datenbank kommuniziert. Auch erweiterte Funktionen wie Transaktionen, Views, Prepared Statements, Stored Procedures und Trigger werden durchgenommen.
Dann gibts eine kleine Einführung in PHP und eine Beschreibung der MySQL-Funktionen von PHP, garniert mit einem kleinem, ein bisschen deplazierten Ajax-Tutorial und einer umfangreichen Beispielanwendung.
Zum Schluß gibts auch noch eine Einführung in die Administration von MySQL.
Ich denke alles in allem ist es ein recht brauchbares Buch für Einsteiger oder auch zum Nachschlagen für erfahrenere Nutzer.
Joomla Tipps #3
Größe des Email-Popups ändern für Joomla 1.5
Das Ändern der Größe des mailto-Popups von Joomla ist eigentlich sehr einfach, wenn sich auch die Frage stellt, warum es dazu nicht einfach ein kleines Konfigurations-Tool im Backend gibt...
Die Einzige Voraussetzung ist eigentlich, dass man Zugriff auf das Dateisystem des Servers, auf dem Joomla installiert ist, hat. Man sucht die Datei "<Wurzelverzeichnis>/components/com_content/helpers/icon.php", öffnet diese und sucht die Funktion email() - bei mir in Zeile 64. In dieser Funktion findet man die Zeile
$status = 'width=400,height=300,menubar=yes,resizable=yes';
Einfach nach "width=" die gewünschte Breite und nach "height=" die Höhe in Pixel eintragen, speichern und die Datei wieder hochladen.
So einfach kanns sein...
Syntaxhighlighter für Serendipity
Sodala, endlich hab ichs geschafft, der Syntaxhighlighter ist installiert. Wie immer, eigentlich ist es ja ganz einfach...
Installation
Hier die Schritte:
- Das Plugin dp.SyntaxHighlighter von der Serendipity-Homepage downloaden.
- Das Zip-File entpacken und ins Plugin-Verzeichnis am Server hochladen.
- In der S9y-Verwaltungsoberfläche den Menüpunkt "Plugins verwalten" auswählen, dann bei Ereignis-Plugins auf "Hier klicken, um Ereignis-Plugin zu installieren" klicken und das Plugin dp.Syntaxhighlighter installieren (Disketten-Symbol rechts).
- Die Datei index.tpl des aktuellen Templates im Texteditor des Vertrauens öffnen. In den <head>-Tag die Zeile "{serendipity_hookPlugin hook="frontend_header"}" und am Ende des <body>-Tags die Zeile "{serendipity_hookPlugin hook="frontend_footer"}" einfügen.
- Falls das Plugin NL2BR installiert ist, dessen Konfiguration öffnen und in das Eingabefeld "code,pre,textarea" schreiben.
Anwendung
Um auch wirklich eingefärbten Quellcode in einem Eintrag anzeigen zu können, sind ein paar Dinge notwendig:
- Die Quelltexte müssen von <pre>-Tags eingeschlossen sein.
- Die Tags müssen als name-Attribut "code" und als class-Attribut ein Kürzel der jeweilige Programmiersprache haben, etwa so: <pre name="code" class="php">. Welche Kürzel für welche Programmiersprache verwendet werden können, verrät euch Google

- Den eigentlichen Quelltext kopiert ihr am besten vorformatiert aus eurer Programmierumgebung in die Zwischenablage und fügt ihn in der HML-Ansicht des Editors zwischen die <pre>-Tags ein.
- Optionalerweise sollte der Quelltext (der dann gefärbt werden soll) keine Sonderzeichen, sondern stattdessen HTML-Entities enthalten. Eine Möglichkeit, diese automatisch zu ersetzen bietet die PHP-Funktion htmlentities().
- Speichern und fertig

Also das ist ein ziemliches Gewurschtel, falls es eine schönere oder bessere Möglichkeit mit Serendipity gibt, bitte posten...
PHP Feedreader-Libraries: Zend_Feed vs. SimplePie
Ich hab mich in letzter Zeit ein wenig mit dem Zend Framework beschäftigt und bin nach kurzer zeit auch auf die PHP-Feedreader Komponente Zend_Feed gestoßen.Nach ein bisschen herumprobieren mit diversen Feeds, bin ich aber anscheinend schon an ihre Grenzen gestoßen. Das parsen von Atom-Feeds ist mir nicht gelungen, besser gesagt das extrahieren des link-Tags.Wobei ich jetzt nicht unbedingt die Schuld auf Zend_Feed schieben möchte, ich hab einfach nicht lange herumprobiert und Google hat nichts brauchbares zu dem Thema ausgespuckt.
Langer Rede kurzer Sinn, ich hab mich nach Alternativen umgesehen und bin auch sogleich fündig geworden: Eine oft empfohlene Library ist SimplePie, ein Open Source PHP Feed Reader. Der Vorteil, der sofort ins Auge sticht, ist die Fehlertoleranz und die Unterstüzung für diverse Feed-Formate. Momentan sind das (laut Website):
- RSS 0.90
- RSS 0.91 (Netscape)
- RSS 0.91 (Userland)
- RSS 0.92
- RSS 1.0
- RSS 2.0
- Atom 0.3
- Atom 1.0
Ein weiteres praktisches Feature ist das automatische Auffinden von Feeds einer Website. Man muss also nicht die genaue URL des Feeds eingeben, es reicht auch beispielsweise die Adresse eines Blogs. Das kann Zend_Feed zwar auch, macht es aber nicht automatisch (Was vielleicht auch performancetechnisch intelligenter ist, whatever).
Auch Caching der geladenen Einträge wird unterstützt, was die etwas trägere Performance etwas besser macht.
Zu guter letzt möchte ich ein kleines Beispiel bringen, um zu zeigen, wie einfach SimplePie angewandt werden kann:
<?php
require_once('simplepie/simplepie.inc');
$feed = new SimplePie('webcode.lemme.at');
$feed->handle_content_type();
if($feed->error()){
//handle Error
}else{
echo'<ul>';
foreach ($feed->get_items() as $item) {
echo '<li><ul>';
echo '<li>'.$item->get_title().'</li>';
echo '<li>'.$item->get_permalink().'</li>';
echo '</ul></li>';
}
echo '</ul>';
}
?>
Ich denke mal der Code ist halbwegs selbsterklärend, sollte er das nicht sein, darf natürlich in den Kommentaren gefragt werden ![]()
Joomla-Tipps #2
User-ID herausfinden
Für alle möglichen Zwecke kann es bei der Komponenten- und Modulentwicklung nützlich die User-Id herauszufinden.
Das geht ganz einfach mittels der JFactory-Klasse, die das User-Objekt des aktuellen Users zurückgibt:
$user =& JFactory::getUser();
$userid = $user->get('id');
Auf die Datenbank zugreifen
Auch auf das Datenbank-Objekt kann man über die JFactory zugreifen:
$db =& JFactory::getDBO();
In einigen Klassen kann auch einfach über
$db =& $this->getDBO();
zugegriffen werden. Das sind (zumindest, die, die mir bekannt sind) die Klassen JModel und JTable, bzw. deren Unterklassen.
Enterprise PHP Patterns
Stefan Priebsch hat auf der DLW-Europe einen Vortrag zum Thema: "Beyond MVC: Enterprise PHP Patterns" gehalten. Die sehr interessanten Slides stellt er auf seinem Blog mittels Slideshare zur Verfügung:
"Enterprise PHP Patterns" vollständig lesen
MVC mit PHP - Ein neues Tutorial
Weil mich die Arbeit mit dem MVC-Joomla-Framework so fasziniert hat, habe ich ein MVC mit PHP-Tutorial geschrieben, dass beschreibt, wie man das MVC-Pattern ganz einfach mit PHP implementieren kann.
Feedback, Fragen und Diskussion zu dem Tutorial ist hier in den Kommentaren möglich und erwünscht ![]()
Natürlich habe ich mich von anderen Inspirieren lassen, vor allem von folgenden Blogs und Artikeln:
- Understanding MVC in PHP, von Joe Stump
- MVC-Pattern in PHP von Brati
- Building a simple MVC system with PHP5 von Dennis Pallett auf PHPit.net
Joomla-Tipps
Sprache Herausfinden
Oft ist es interessant, die Sprache des aktuellen Users festzustellen, etwa wenn man aus mehreren Sprachen auswählen kann. Das geht ganz einfach mittels:
$language = JFactory::getLanguage();
Nun bekommt man ein JLanguage-Objekt, durch den Aufruf der Methode 'getTag()' erhält man das Sprachkürzel in der Form 'de-DE':
$tag = $language->getTag();
Layout im Menü-Maager verstecken / Layout (um)benennen
Bei der Entwicklung von Komponenten ist es oft wichtig, im Menümanager des Backends ein Layout einer View zu verstecken, oder dem Layout einen ansprechenderen Namen zu geben.
Dazu legt man in dem 'tmpl'-Ordner der View ein neues XML-File an. Den Namen der Datei bestimmt der Name des Layouts. Ist das Layout-File beispielsweise 'show_item.php', muss die XML-Datei 'show_item.xml' heißen. Um das Layout zu verstecken muss die XML-Datei nun folgenden Aufbau haben:
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<layout hidden="true" />
</metadata>
Um dem Layout einen ansprechenden Namen zu geben, muss sie folgenden Inhalt haben:
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<layout title="Alle Items anzeigen"></layout>
</metadata>
Komponenten für Joomla entwickeln
Es gibt eigentlich 2 gute Quellen bzw. Tutorials für die Entwicklung von Komponenten für Joomla 1.5: Das Online-Buch von Hagen Graf und die Joomla Tutorials (Englisch).
Juhuuu! Projektpraktikum und Bakkelaureatsarbeit über Joomla!
Nach langem Suchen hab ich endlich eine Bakkarbeit gefunden, die mir wirklich zusagt. Ursprünglich hätte ich mich für dieses Praktikum interessiert, war dann aber leider schon vergeben. Jetzt hab ich am INSO ein Projektpraktikum gefunden, bei dem ich mich mit Joomla beschäftigen kann. Um was es genau geht weißich selbst noch nicht wirklich (ist noch nicht genau ausspezifiziert), auf jeden Fall wird eine Joomla-Komponente entwickelt. Und das macht Spaß, hab mich schon ein bisschen mit Joomla 1.5 und dem neuen Framework mit MVC herumgespielt, bin begeistert, kann nur jedem, der sich für PHP und MySQL interessiert raten, sich das anzusehen.
