Beliebte Fehler

Vielen Dank für die Unterstützung: 

Sie können dieses Kapitel sponsern!

**FOR SALE**Aller Anfang ist schwer, gerade wenn es um das Entwickeln von Software geht. Es gibt so viele Konzepte, Ideen, bewährte Verfahrensweisen, Frameworks und Abhängigkeiten.

Normalerweise sind Sie vermultich glücklich, wenn Ihr Programm einfach läuft. Einzeiler wie das "Hallo Welt" Programm sind nicht kompliziert und laufen gut, wenn Sie sich aber "echte" Probleme ansehen, sind Sie schnell überfordert und nach einer Weile probieren Sie vermutlich alles mögliche aus, nur damit es funktioniert.

Für mich war das genauso, als ich das Buch geschrieben habe.

Ich hatte oft eine Situation, in der ich nicht wusste "Wie ist denn nun der korrekte Weg?".

Und oftmals gibt es keinen "korrekten Weg". Ich fragte ein bischen herum, und viele antworteten auf meine oft mit Worten wie diesen:

Naja, es kommt darauf an ... Du kannst es so machen, aber sei vorsichtig. Du könntest es auch so machen, aber dann achte auf die Seiteneffekte ...

Am 13. November sah ich diesen Tweet von Radek Suski:

If I see this: http://wklej.org/id/624970/ I think we really need some kind of certification authority for Joomla! developers. #Fail

Ich fragte ihn, ob er nicht Lust hätte, ein Kapitel über dieses Thema mit mir gemeinsam zu schreiben und zwei Wochen später schickte er mir diese Liste der beliebten Fehler.

Radek Suski's Liste der beliebten Fehler

Daten aus einer HTTP Anfrage extrahieren

Ein beliebter Fehler von frischen Joomla! programmers ist die Art, wie sie der Werte von Variablen aus einem HTTP Request auslesen:

$id = $_REQUEST[ 'id' ];

Hier ist, abgesehen davon, das der Wert nicht überprüft wird, auch unklar wo der Wert eigentlich herkommt.

Wenn Sie eine neue Joomla! Erweiterung schreiben, sollten sicher wissen, wo die Daten herkommen. Falls diese Daten beispielsweise aus einem Formular kommen, liegt es nahe, dass die POST Methode verwendet worden ist.

In diesem Fall wäre diese Schreibweise besser:

$id = $_POST[ 'id' ];

Leider ist die Variable immer noch nicht validiert. Glücklicherweise bietet das Joomla! Framework dafür eine Input Klasse, die benutzt werden kann, um Daten aus einer HTTP Anfrage zu erhalten und zu überprüfen.

$jInput = JFactory::getApplication()->input;
// From GET
$id = $jInput->get->get( 'id', 0, 'INT' );
// From POST
$id = $jInput->post->get( 'id', 0, 'INT');

Wie Sie sehen, wird überpüft, ob es sich um eine Integer Variable handelt.
Es sind weitere Filter verfügbar.

Mehr Information gibt finden Sie unter: http://docs.joomla.org/JInput_Background_for_Joomla_Platform

Verbindung zur Datenbank

Wenn Sie eine Datenbankverbindung benötigen, haben Sie vielleicht diese Methode benutzt:

$dbConn = mysql_connect( 'address', 'login', 'password' );
$db = mysql_select_db( 'table', $dbConn );
$query = "SELECT `data` FROM `jos_my_table` WHERE `name`='{$myName}'";
$results = mysql_query( $query );

Zunächst mal funktioniert diese Variante nicht in Joomla!, weil Sie den weder den Datenbanknamen, noch die Zugangsdaten zur Datenbank kennen. Und Sie sollten sie auch nicht kennen!

Das ist der Weg, wie es in Joomla! funktioniert!

// get database object
$db = JFactory::getDbo();
// get new query
$query = $db->getQuery( true );
// what to select
$query->select( 'data' );
// from which table
// do not use fixed db prefix - the #__ will be replaced with the right one
$query->from( '#__my_table' );
// what is the condition
// do not forget to escape any variable you're passing to the SQL-Query
$query->where( 'name=' . $db->escape( $myName ) );
// set the query
$db->setQuery( $query );
// and load result
$results = $db->loadResult();

Mehr Information finden Sie unter: http://docs.joomla.org/JDatabase

Datei-Operationen

Da Joomla! bereits einen FTP-Layer eingebaut hat, um Probleme mit ungünstig konfigurierten Servern aus dem Weg zu gehen, ist es nicht empfehlenswert die nativen PHP Funktionen direkt zu benutzen. Auch Dateioperationen wie eine neue Datei erzeugen, sie zu kopieren oder einen neuen Ordner zu erzeugen sollten mit den Joomla! Core Methoden implementiert werden.

Statt:

$content = "My content";
file_put_contents( $content, 'my_file.txt' );
mkdir( 'new_folder' );
copy( 'my_file.txt', 'new_folder/my_file.txt' );

sollten Sie diese Schreibweise benutzen:

jimport( 'joomla.filesystem.file' );
jimport( 'joomla.filesystem.folder' );
$content = "My content";
JFile::write( 'my_file.txt', $content );
JFolder::create( 'new_folder' );
JFile::copy( 'my_file.txt', 'new_folder/my_file.txt' );

Styles und Scripte laden

Wenn Sie zusätzliche JavaScript oder CSS Dateien oder CSS Deklarationen laden wollen, ist das Mittel der Wahl in Joomla! recht einfach:

// get current document instance
$document = JFactory::getDocument();
// add CSS style declaration
$document->addStyleSheet( 'media/css/my_style.css' );
// add some CSS inline declaration
$document->addStyleDeclaration( 'div#myDiv { border-style: solid; }' );
// add script file
$document->addScript( 'media/js/my_script.js' );
// add inline script declaration
$document->addScriptDeclaration( 'function foo( id ) { alert( id ) }' );

Mehr Information finden Sie unter: http://docs.joomla.org/Category:JDocument

E-Mails versenden

Weil Joomla! unterschiedliche Methoden für die E-Mail Kommunikation unterstützt, ist es nicht empfehlenswert die PHP Core Funktionen zu nutzen.

Das ist die Methode, die Sie sicher kennen:

$to = 'nobody@example.com';
$subject = 'the subject';
$message = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.';
$headers = 'From: webmaster@example.com' . "\r\n" .
       'Reply-To: webmaster@example.com' . "\r\n" .
       'X-Mailer: PHP/' . phpversion();
mail( $to, $subject, $message, $headers );

Und hier ist die Schreibweise, die Sie in Joomla! nutzen sollten:

$mailer = JFactory::getMailer();
$mailer->setSender( array( 'webmaster@example.com', 'John Doe' ) );
$mailer->addRecipient( 'nobody@example.com' );
$mailer->setSubject( 'the subject' );
$mailer->setBody( 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.' );
$mailer->Send();

Meiner Meinung nach ist die Lösung in Joomla! erheblich eleganter.

Mehr Information finden Sie unter: http://docs.joomla.org/How_to_send_email_from_components

Benutzerstatusverwaltung

Während Sie ein Script entwickeln, müssen Sie manchmal die aktuellen Benutzereinstellungen speichern, wie beispielweise die Sortierung, die gewählten Einstellungen und vieles andere mehr. Normalerweise nehmen wir HTTP Cookies um solche Daten zu speichern. Cookies sind allerdings recht beschränkt in Ihren Funktionen und die neuesten HTML5 Techniken werden nicht vollständig unterstützt.

Das Joomla! Framework bietet eine exzellente Lösung für dieses Problem. Darüberhinaus müssen wir uns keine Gedanken über die Datentypen machen, die wir speichern wollen. Wir können daher einen String, ein Array und sogar ein Objekt speichern.

$app = JFactory::getApplication();
// store state data
$app->setUserState( 'my_id', $myVar );
// get stored data
$var = $app->getUserStateFromRequest( 'my_id', 'my_id_in_request', 0, 'int' );

Denken Sie ausserdem daran, dass die “getUserStateFromRequest” Methode die Benutzerstatus Variable aktualisiert, wenn eine HTTP Anfrage (GET oder POST) den  “my_id_in_request”  Index enthält, so dass Sie nicht mal den Status manuell setzen müssen.

Mehr Information finden Sie unter: http://docs.joomla.org/How_to_use_user_state_variables

Ihre Liste der beliebten Fehler

Ich würde mich freuen, weitere Tips dieser Liste hinzufügen zu können.

Wenn Sie welche kennen, schreiben Sie einfach einen Kommentar oder benutzen unser Kontaktformular.

 

 

Kommentare

$jInput = JFactory::getApplication()->input;
$id = $jInput->get->get( 'id', 0, 'INT' );

Warum nicht
$id = JRequest::getInt('id', 0, 'post');

Darum:

"In Joomla! 1.7 Joomla 1.7 and newer, JRequest has been superseded by JInput. See Retrieving request data using JInput."

Quelle: http://docs.joomla.org/Retrieving_and_Fi...