Änderungen REDAXO 4 zu 5

$REX

Hinweis: Die Listen sind nicht vollständig.

Die globale Variable $REX wurde entfernt. Im Wesentlichen wurde sie ersetzt durch die statische Klasse rex, viele Dinge aus $REX werden nun aber auch an anderen Stellen gelagert. AddOn-spezifische Dinge sollten zum Beispiel direkt in den neuen AddOn-Objekten gelagert werden (siehe unten). Möchte man aber Daten modulübergreifend zwischenlagern o.ä., kann man dafür durchaus die Methoden rex::setProperty() und rex::getProperty() verwenden.

REDAXO 4 REDAXO 5
$REX['KEY'] etc. rex::getProperty('key') rex::setProperty('key', $value)
$REX['SERVER'] rex::getServer()
$REX['SERVERNAME'] rex::getServerName()
$REX['REDAXO'] rex::isBackend()
$REX['CUR_CLANG'] rex_clang::getCurrentId()
$REX['ARTICLE_ID'] rex_article::getCurrentId()
$REX['START_ARTICLE_ID'] rex_article::getSiteStartArticleId()
$REX['NOTFOUND_ARTICLE_ID'] rex_article::getNotfoundArticleId()
$REX['CLANG'] rex_clang::getAll()
$REX['MOD_REWRITE'] Existiert nicht mehr
$REX['TABLE_PREFIX'] rex::getTablePrefix()
rex::getTable($table) (ergibt: 'rex_'.$table)
$REX['USER']
$REX['USER']->hasPerm('myperm[]')
rex::getUser()
rex::getUser()->hasPerm('myperm[]')
$REX['PERM'][] = 'myperm[]' rex_perm::register('myperm[]', $name = null)
Zweiter (optionaler) Parameter ist ein Bezeichner, der in der Rechteverwaltung erscheint
$REX['EXTPERM'][] = 'myperm[]' rex_perm::register('myperm[]', $name = null, rex_perm::OPTIONS)
$REX['EXTRAPERM'][] = 'myperm[]' rex_perm::register('myperm[]', $name = null, rex_perm::EXTRAS)
$REX['HTDOCS_PATH']
$REX['INCLUDE_PATH']
$REX['FRONTEND_PATH']
$REX['MEDIAFOLDER']
$REX['FRONTEND_FILE']
rex_path siehe hier
$REX['ADDON'] rex_addon, bzw. rex_plugin (siehe weiter unten)

REX_VAR

REDAXO 4 REDAXO 5
VALUE[] REX_INPUT_VALUE[]
REX_HTML_VALUE[id=1] REX_VALUE[id=1 output=html]
INPUT_PHP REX_INPUT_VALUE[]
REX_PHP REX_VALUE[id=1 output=php]
REX_LINK_BUTTON[id=1] REX_LINK[id=1 widget=1]
REX_LINKLIST_BUTTON[id=1] REX_LINKLIST[id=1 widget=1]
REX_MEDIA_BUTTON[id=1] REX_MEDIA[id=1 widget=1]
REX_MEDIALIST_BUTTON[id=1] REX_MEDIALIST[id=1 widget=1]

Funktionen und Klassen

REDAXO 4 REDAXO 5
OOArticle
OOCategory
OOMedia
OOMediaCategory
OOArticleSlice
rex_article
rex_category
rex_media
rex_media_category
rex_article_slice
rex_article rex_article_content
OOArticle::getArticleById()
OOCategory::getCategoryById()
OOMedia::getMediaByFilename()
OOMediaCategory::getCategoryById()
rex_article::get()
rex_category::get()
rex_media::get()
rex_media_category::get()
OOArticle::isValid()
OOCategory::isValid()
OOMedia::isValid()
OOMediaCategory::isValid()
Entfernt, stattdessen:
$art instanceof rex_article etc.
$article->getDescription()
$article->isStartPage()
$article->getValue('art_description')
$article->isStartArticle()
rex_register_extension()
rex_register_extension_point()
REX_EXTENSION_EARLY
REX_EXTENSION_LATE
rex_extension::register()
rex_extension::registerPoint()
rex_extension::EARLY
rex_extension::LATE
rex_title()
rex_info()
rex_warning(), etc.
rex_view::title()
rex_view::info()
rex_view::warning()
, etc.
rex_put_file_contents() rex_file::put()
rex_file::putCache() (JSON-formatiert)
rex_file::putConfig() (YAML-formatiert)
rex_get_file_contents() rex_file::get()
rex_file::getCache()
rex_file::getConfig()
rex_replace_dynamic_contents() Entfernt, da dynamische Inhalte in eigenen Dateien gespeichert werden sollen
rex_deleteDir()
rex_deleteFiles()
rex_createDir()
rex_copyDir()
rex_dir::delete()
rex_dir::deleteFiles()
rex_dir::create()
rex_dir::copy()
rex_absPath() rex_path::absolute()
rex_send_file()
rex_send_resource()
rex_send_article()
rex_send_content()
rex_response::sendFile()
rex_response::sendResource()
rex_response::sendArticle()
rex_response::sendContent()
rex_generateAll()
rex_deleteAll()
rex_delete_cache()
rex_call_func()
rex_check_callable()
Entfernt, stattdessen: call_user_func() / call_user_func_array()
Entfernt, stattdessen: is_callable()
rex_split_string() rex_string::split()
rex_addslashes() Entfernt, stattdessen: addslashes() / addcslashes()
rex_highlight_string()
rex_highlight_file()
rex_string::highlight()
rex_tabindex() Entfernt
rex_hasBackendSession() rex_backend_login::hasSession()
$I18N->msg()
rex_translate()
rex_i18n::msg()
rex_i18n::translate()
rex_lang_is_utf8() Entfernt, da REDAXO 5 immer UTF8 verwendet
rex_create_lang() Entfernt, da rex_i18n nun statisch ist
OOAddon::getProperty($addon, $property)
OOAddon::isAvailable($addon)
OOPlugin::isInstalled($addon, $plugin) etc.
rex_addon::get($addon)->getProperty($property)
rex_addon::get($addon)->isAvailable()
rex_plugin::get($addon, $plugin)->isInstalled() etc.
rex_install_dump()
rex_organize_priorities()
rex_sql_util::importDump()
rex_sql_util::organizePriorities()
rex_getAttributes()
rex_setAttributes()
In der Form entfernt, stattdessen rex_sql::getArrayValue() und rex_sql::setArrayValue()
rex_a79_textile() rex_textile::parse()

Extension Points

REDAXO 4 REDAXO 5
ALL_GENERATED CACHE_DELETED
ADDONS_INCLUDED PACKAGES_INCLUDED
OUTPUT_FILTER_CACHE RESPONSE_SHUTDOWN
OOMEDIA_IS_IN_USE MEDIA_IS_IN_USE

rex_sql

Die Methoden setQuery(), insert(), update() etc. liefern keine boolschen Werte mehr zurück, sondern das aktuelle rex_sql-Objekt.

REDAXO 4 REDAXO 5
$sql->setWhere('myid="35" OR abc="zdf"') $sql->setWhere('myid = :id OR abc = :abc', array(':id' => 3, ':abc' => 'zdf'))
oder
$sql->setWhere(array(array('id' => 3, 'abc' => 'zdf')))
$sql->setQuery('UPDATE rex_table SET a="$i" WHERE myid="35" ') $sql->setQuery('UPDATE rex_table SET a=? WHERE myid="35" ', array($i))
$sql->setQuery('SELECT * FROM rex_table WHERE col_str = "$adf" and col_int = "4"') $sql->setQuery('SELECT * FROM rex_table WHERE col_str = :mystr and col_int = :myint', array(':mystr' => $adf, ':myint' => 4))

Bei Fehlern wird eine rex_sql_exception geworfen.

Fehlermeldung in REDAXO 4

<?php
if ($sql->update()) {
    $info = 'Success';
} else {
    $error = $sql->getError();
}

Fehlermeldung in REDAXO 5

<?php
try {
    $sql->update();
    $info = 'Success';
} catch (rex_sql_exception $e) {
    $error = $e->getMessage();
}

rex_form

REDAXO 4 REDAXO 5
$form = rex_form::factory('table', 'legend', 'id="'.$id.'"', 'post', false, 'my_form_class'); $form = new my_form_class('table', 'legend', 'id="'.$id.'"', 'post', false);
oder
$form = my_form_class::factory('table', 'legend', 'id="'.$id.'"', 'post', false);

Packages (AddOns/PlugIns)

Package ist der neue gemeinsame Oberbegriff für AddOns und PlugIns.

REDAXO 4 REDAXO 5
(un)install.inc.php (un)install.php
config.inc.php package.yml
boot.php
classes/ lib/
vendor/ (für externe Klassen)
files/ assets/
pages/index.inc.php pages/index.php

Die statischen Package-Informationen, wie Version, Autor etc. sollten statt in der boot.php (ehemals config.inc.php), in der neuen package.yml stehen. In dieser Datei kann auch angegeben werden, welche REDAXO-Version, welche PHP-Extensions oder welche AddOns und PlugIns benötigt werden (wird automatisch überprüft). Beispiel:

package: mein_addon
version: '1.3'
author: Vorname Nachname
supportpage: forum.redaxo.de

page:
  title: Mein tolles AddOn
  perm: mein_addon[]
  block: system

requires:
  redaxo: '~5.1'
  php:
    version: '>=5.3.4'
    extensions: [gd, xml]
  packages:
    structure: '5.0.1'
    structure/content: '>5.0, <5.2'

Es können aber auch weiterhin Package-Informationen in der boot.php gesetzt werden, aber nicht mehr über $REX['ADDON'], sondern über die neue Package-api. Das aktuelle Objekt (rex_addon oder rex_plugin) ist in den Dateien (boot.php, install.php, pages/index.php etc.) über $this erreichbar.

// Beispiel boot.php
$this->setProperty('author', 'Vorname Nachname');

// Beispiel install.php
$error = '';

// Überprüfungen
if($error)
  $this->setProperty('installmsg', $error);
else
  $this->setProperty('install', true);

Innerhalb von Klassen und Funktionen, wo das Package nicht über $this zur Verfügung steht, kann so auf die Daten zugegriffen werden:

$author = rex_addon::get('myaddon')->getProperty('author');

Außer der package.yml sind alle Dateien (boot.php, install.php, uninstall.php etc.) optional. Die package.yml benötigt auf jeden Fall die "package"- und "version"-Angabe.

Dadurch, dass die Dateien aus den Objekten heraus eingebunden werden (damit $this zur Verfügung steht), sind globale Variablen nicht mehr automatisch verfügbar.

Der Klassenordner classes heißt jetzt lib. Die Klassen in diesem Ordner (und in den Unterordnern) müssen nicht mehr manuell über include/require eingebunden werden, dies übernimmt das "Autoloading" bei Bedarf automatisch.

Die Sprachdateien im lang-Ordner werden automatisch dem Sprachkatalog hinzugefügt.

Der files-Ordner in der REDAXO-Root-Ebene wurde aufgeteilt, die Dateien des Medienpools liegen nun im media-Ordner, für die Dateien der AddOns/PlugIns gibt es den assets-Ordner. Dementsprechend muss der ehemalige files-Ordner innerhalb der Packages nun assets heißen.

Die layout/top.php und layout/bottom.php werden automatisch eingebunden.

Die Dateien im AddOn-, bzw. PlugIn-Ordner sollten nicht mehr verändert werden, um automatische Updates zu ermöglichen. Konfigurationswerte können über die neue rex_config in der Datenbank gespeichert werden (diese werden gecacht):

rex_config::set($addon, $key, $value);
$value = rex_config::get($addon, $key);

// alternativ über das Package-Objekt:
rex_addon::get($addon)->setConfig($key, $value);
$value = rex_addon::get($addon)->getConfig($key);

// oder falls das Package-Objekt über $this erreichbar ist (config.inc.php etc.):
$this->setConfig($key, $value);
$value = $this->getConfig($key);

Des Weiteren können Daten im Ordner redaxo/data/addons/$addonName abgelegt werden, der Pfad ist über rex_path::addonData($addon) und rex_addon::get($addon)->getDataPath(), bzw. $this->getDataPath() erreichbar.