Legacy Mode Tutorial

Aus THM-Wiki
Wechseln zu: Navigation, Suche


iCampus-Projekt
Arbeitstitel Legacy Mode Tutorial
Betreuer Prof. Dr. Kneisel


Mitarbeiter Andrej Sajenko
Programmiersprache PHP
Framework Joomla! 2.5

Beschreibung

In Joomla gibt es die Möglichkeit das System im Legacy Mode zu betreiben. Dies hat Auswirkungen auf den Programmablauf des Joomla Cores. Es werden Code-Abschnitte anders behandelt wenn der Legacy Mode eingeschaltet ist.

Ein Beispiel anhand der Joomla MySQLI Anbindung.

Diese Funktion execute() soll ab der Version 3.0 verwendet werden um SQL-Befehle auszuführen. Die Version 2.5 unterstützt noch die Funktion execute(). Diese ruft aber bereits unter 2.5 die execute() Funktion auf.

Ausschnitt aus joomla25/libraries/joomla/database/database/mysqli.php

/**
* Execute the SQL statement.
*
* @return  mixed  A database cursor resource on success, boolean false on failure.
*
* @since   11.1
* @throws  JDatabaseException
*/
public function execute()
{
        if (!is_object($this->connection))
        {
                // Legacy error handling switch based on the JError::$legacy switch.
                // @deprecated  12.1
                if (JError::$legacy)
                {
                        if ($this->debug)
                        {
                                JError::raiseError(500, 'JDatabaseMySQLi::query: ' . $this->errorNum . ' - ' . $this->errorMsg);
                        }
                        return false;
                }
                else
                {
                        JLog::add(JText::sprintf('JLIB_DATABASE_QUERY_FAILED', $this->errorNum, $this->errorMsg), JLog::ERROR, 'database');
                        throw new JDatabaseException($this->errorMsg, $this->errorNum);
                }
        }
        ...
}

Falls man sich die API Dokumentation und die Joomla Anleitung für den Zugriff auf die Datenbank anschaut wird darauf hingewiesen das man die Fehlerbehandlung mit Exceptions steuern soll. http://docs.joomla.org/Inserting,_Updating_and_Removing_data_using_JDatabase

$db = JFactory::getDbo();
 
try{
    $db->transactionStart();
 
    $query = $db->getQuery(true);
 
    $values = array($db->quote('TEST_CONSTANT'), $db->quote('Custom'), $db->quote('/path/to/translation.ini'));
 
    $query->insert($db->quoteName('#__overrider'));
    $query->columns($db->quoteName(array('constant', 'string', 'file')));
    $query->values(implode(',',$values));
 
    $db->setQuery($query);
    $result = $db->execute();
 
    $db->transactionCommit();}
catch (Exception $e){
    // catch any database errors.
    $db->transactionRollback();
    JErrorPage::render($e);}
}

Die PHPDoc der JDatabase Klasse gibt auch vor das bei einem Fehler eine JDatabaseException geworfen wird.

/**
* Execute the SQL statement.
*
* @return  mixed  A database cursor resource on success, boolean false on failure.
*
* @since   12.1
* @throws  JDatabaseException
*/
abstract public function execute();

Falls man sich an die Anleitungen hält und Joomla 2.5 benutzt stellt man fest das diese Exception nie geworfen wird.

Dies liegt an der Fallunterscheidung bei der Datenbank-Implementierungen. Diese unterscheidet anhand des Legacy Mode's. Ist er eingeschaltet wird nie eine Exception geworfen. Ist er ausgeschaltet werden Exceptions geworfen.

Die Exception (JDatabaseException) die geworfen werden sollte ist unter anderem als Deprecated markiert und wird in Joomla 3.0 nicht mehr verwendet. In Joomla 3.0 wird an dieser Stelle eine RuntimeException geworfen.

Probleme die dadurch Entstehen

Dadurch Joomla 2.5 standardmäßig in Legacy Mode betrieben wird werden keine Exceptions geworfen. Die Entwickler merken das ihr Code durchläuft und führen keine Behandlung der Fehler durch. Falls sie bei der Ausführung irgendwann auf invalide Daten stoßen passen sie diese an dem Punkt an wo sie diese bemerken. Vermutlich nicht an dem Punkt wo diese Entstehen. Die Entwickler nach der API Dokumentation arbeiten und eine Fehlerbehandlung mit try-catch Blöcken schreiben gehen davon aus das sie alles richtig implementiert haben da bei der Ausführung keine Exception geworfen wurde. Falls die Tests diesen Fehlerfall nicht abdecken fällt der Fehler auch nicht direkt auf. Wird dann der Legacy Betrieb abgeschaltet funktioniert die entwickelte Applikation wahrscheinlich nicht mehr.

Achtung: In Joomla 3.x gibt es den Legacy Mode nicht mehr!

Einschalten / Ausschalten des Legacy Mode

Global für Joomla

Der Legacy Mode kann nicht mehr im Backend eingestellt werden. Die Meta-Information in der Tabelle #__extensions hat auch keinerlei Einfluss darauf. Diese Einstellung ist in Joomla Code hinterlegt und ist standardmäßig eingeschaltet!

Diese Einstellung wird von Joomla 2.5 im Frontend (Zeile 42) und in Backend (Zeile 35) eingestellt. Frontend: /includes/framework.php Back-End: /administrator/includes/framework.php

// Force library to be in JError legacy mode
JError::$legacy = true;

Für Komponenten, PlugIns und Module

Möchte man den Legacy Mode für seine Erweiterung ausstellen und keine Einstellung am Joomla Code vornehmen so kann man die Einstellung in der Einstiegsdatei der Erweiterung einstellen. Dadurch wird die Fehlerbehandlung durch Exceptions nur für die Erweiterung aktiviert.

Bsp: com_thm_repo.php

// Force library to be NOT in JError legacy mode
JError::$legacy = false;

Für Tests

Soll der Legacy Mode für die Tests deaktiviert werde so kann man den Legacy Mode in der Datei framework_include.php einstellen.

// Force library to be NOT in JError legacy mode
JError::$legacy = false;

Für Bibliotheken

Bei Bibliotheken kann der Legacy Mode ebenfalls ein/aus-geschaltet werden. Bibliotheken haben aber normalerweise keine Einstiegsdatei und somit müsste man diese Einstellung in jeder Datei treffen die Benutzt werden könnte.