Dokumentation REDAXO

R3 /

Redaxo3.x FAQ

In eckigen Klammern ist die Redaxoversion genannt, auf die sich der Beitrag bezieht.

I. Fehlermeldungen
1. Fatal error: Call to undefined function: title() [3.2]
2. Fatal error: Call to a member function on a non-object [3.2]
3. Medienpool: Datei wurde nicht gefunden.
4. Warning: ini_set ... has been disabled for security reasons ...
5. Fatal error: Cannot instantiate non-existent class ...
6. Fatal error: Cannot redeclare ***() (previously declared in ...)
7. Notice: Undefined variable: ...
8. Fatal error: Allowed memory size of 33554432 bytes exhausted ...
9. Class SQL 1.1 | Database down. | Please contact mail@mail.tld | Thank you! [3.2]


II. Sonstiges
1. Backend oder Frontend?
2. Backend in anderem Verzeichnis [3.2]
3. Namen der Rootkategorie als Artikelüberschrift
4. Redaxo und MySQL 5.X [3.2]
5. Wie sortiere ich meine Artikel (mein Artikel-Array) nach xx
6. Artikel der Root Kategorie auslesen [3.2]
7. Mehrere Redaxoinstallationen aber nur eine DB [3.2]
8. Ist der Benutzer im Backend eingeloggt?
9. "Online bis zum" steht auf 01.01.2010. Wie kann das geändert werden?
9.1.Anpassen des "Online bis"-Artikeldatums beim anlegen einer neuen Kategorie oder eines Artikels

I. Fehlermeldungen
1. Fatal error: Call to undefined function: title() [3.2]
Durch das Update von Version 3.1 auf 3.2 haben sich einige Namensänderungen bei Variablen und Funktionen ergeben.
Siehe Updatehinweise von REX 3.0, REX 3.1 -> REX 3.2

2. Fatal error: Call to a member function on a non-object [3.2]
falscher Code: $article = OOArticle::getArticleById($REX['STARTARTIKEL_ID']);

richtiger Code: $article = OOArticle::getArticleById($REX['START_ARTICLE_ID']);

3. Medienpool: Datei wurde nicht gefunden.
Schau mal bitte ob du eine Datei namens readme.txt oder _readme.txt im Ordner files/ hast. Wenn ja löschen...
Oder: Überprüfe ob in der php.ini die Option file_uploads = On gesetzt ist.
Oder: Überprüfe die Zugriffsrechte für den Ordner files/. Versuche es mal mit 777, falls noch nicht geschehen.

4. Warning: ini_set ... has been disabled for security reasons in ... redaxo/include/classes/class.article.inc.php(452) : eval()'d code on line 9
Dein Provider hat einige PHP-Funktionen deaktiviert.
Siehe dazu auch im PHP-Handbuch Kapitel 42. Safe Mode.
Lösung: Kommentiere im default Template die "ini_set" Zeilen aus ... (# davor setzen)
Sollte dann so aussehen:

// Setting
$navTemplateId = "2";

#ini_set('arg_separator.output',  '&'); 
#ini_set("arg_separator.output", ";");
#ini_set("url_rewriter.tags", "a=href");

5. Fatal error: Cannot instantiate non-existent class: shop_article in /var/www/localhost/htdocs/redaxo/include/classes/class.article.inc.php(144) : eval()'d code on line 4
Dieses Beispiel bezieht sich auf das Shop-Addon. Es kann aber auch für jedes andere Addon eine ähnliche Meldung erscheinen.
Das Addon wurde zwar auf dem Server im addons-Verzeichnis abgelegt aber entweder im Backend unter Addons nicht "installiert" oder nicht "aktiviert".

6. Fatal error: Cannot redeclare ***() (previously declared in ...)
Eine Funktion wird entweder mehrfach eingebunden (z.b. von mehreren Modulen) oder bei der Verarbeitung doppelt definiert. Umgehen kann man das mit folgendem Konstrukt:

if(!function_exists('NameDerFunktion'))
{
  function NameDerFunktion()
  {
    // code...
  }
}

Bei der Verwendung der Funktion function_exists ist zu bedenken, dass ein anderes Modul/Addon eine gleichlautende Funktion verwenden könnte, die aber etwas völlig anderes machen soll. D.h.: wird eine Funktion durch die Verwendung von function_exists nicht geladen, dann kann es zu Fehlermeldungen auf Grund der fehlenden Funktionseigenschaften kommen. Im schlimsten Falle könnte es sogar zu Datenverlust führen. Entwickler sollten auf entsprechende Funktionsnamen achten, um solche Probleme zu vermeiden.

7. Notice: Undefined variable: ...
Erhälst du Meldungen die dieser ähneln:

Notice: Undefined variable: method in redaxo/include/addons/
file_import/pages/index.inc.php on line 114

so ist das Error-Reporting der PHP-Installation zu hoch eingestellt. Die "Notice"-Meldungen beinträchtigen nicht die Funktionsweise der Scripte. Abschalten kann man diese, indem in der php.ini bei "error_reporting = E_ALL & ~E_NOTICE" eingestellt wird. Ein "error_reporting = E_ALL" ist nur für Entwickler interessant (und diese sollten dies bitte auch so einstellen, um solche unnötigen Meldungen zu verhindern). Wenn du keinen Zugriff auf die php.ini hast, kannst du versuchen die Einstellung in der index.php zu erzwingen:

<?php
error_reporting(E_ALL ^ E_NOTICE); // Notices ausschalten
...


8. Fatal error: Allowed memory size of 33554432 bytes exhausted ...
Diese Meldung tritt meist (aber nicht ausschließlich) im Zusammenhang mit dem Import-/Export-Addon auf. Das serverinterne Memory Limit ist erreicht. Der PHP-Prozeß wird abgebrochen. Beheben läßt sich dies, in dem in der PHP.ini der Wert von memory_limit erhöht wird. Wende dich an deinen Serveranbieter oder befrage für weitere Informationen die Suchmaschine deines Vertrauens.

9. Class SQL 1.1 | Database down. | Please contact mail@mail.tld | Thank you! [3.2]
Hierbei könnte es sich um ein Problem mit der Verbindungseinstellung zur Datenbank handeln. Versuche die Verbindung zur DB anstatt über ein mysql_pconnect über ein mysql_connect erstellen zu lassen. Ändere dazu in der Datei redaxo/include/classes/class.sql.inc.php die Zeile

$this->identifier = @ mysql_pconnect($REX['DB'][$DBID]['HOST'],
$REX['DB'][$DBID]['LOGIN'], $REX['DB'][$DBID]['PSW']);

in

$this->identifier = @ mysql_connect($REX['DB'][$DBID]['HOST'],
$REX['DB'][$DBID]['LOGIN'], $REX['DB'][$DBID]['PSW']);

Link zum Thema persintente MySQL-Verbindungen:Features.persistent-connections



II. Sonstiges
1. Backend oder Frontend?
In $REX['REDAXO'] wird festgehalten, ob man sich im Backend oder im Frontend befindet.
Dies kann genutzt werden, um z.B. Modulausgaben zu steuern.
if ($REX['REDAXO']) { 
 echo 'Ich bin nur im Backend zu sehen.';
} 

if (!$REX['REDAXO']) { 
 echo 'Ich bin nur im Frontend zu sehen.';
}


2. Backend in anderem Verzeichnis [3.2]
(Die hier beschriebene Vorgehensweise bezieht sich ausschließlich auf Redaxo 3.2)
Du möchtest das Redaxobackend in einem anderen Unterordner unterbringen (also nicht im Ordner "redaxo/")? Dann könnte dir diese kleine Anleitung weiterhelfen.
Um einen neuen Ordernamen verwenden zu können, muß der Ordnername in folgenden Dateien angepasst werden:

1 x in der index.php:
include "./<neuerOrdnername>/include/master.inc.php"; 1 x in der master.inc.php:
$REX['INCLUDE_PATH'] = $REX['HTDOCS_PATH']."<neuerOrdnername>/include"; In der config.inc.php im Verzeichnis /include/addons/image_resize/ kann gleich die richtige Variable eingesetzt werden.
Ausinclude ($REX['HTDOCS_PATH']."redaxo/include/addons/image_resize/class.thumbnail.inc.php"); wird$REX['INCLUDE_PATH']."/addons/image_resize/class.thumbnail.inc.php" Diese Zeile ist zweimal in dieser Datei zu ändern!

In den Klassendateien class.ooarticle.inc.php und class.oocategory.inc.php.
class.ooarticle.inc.php:
aus $article_path = $REX['HTDOCS_PATH']."redaxo/include/generated/articles/".$article_id.".".$clang.".article";wird $article_path = $REX['INCLUDE_PATH']."/generated/articles/".$article_id.".".$clang.".article"; und aus $articlelist = $REX['HTDOCS_PATH']."redaxo/include/generated/articles/".$a_category_id.".".$clang.".alist";wird $article_path = $REX['INCLUDE_PATH']."/generated/articles/".$article_id.".".$clang.".article";
class.oocategory.inc.php:
aus $categorylist = $REX['HTDOCS_PATH']."redaxo/include/generated/articles/".$cat_parent_id.".".$clang.".clist";wird $categorylist = $REX['INCLUDE_PATH']."/generated/articles/".$cat_parent_id.".".$clang.".clist";

Und dann noch das "Regeneriere Artikel & Cache" unter "Specials" im Backend nicht vergessen. Damit funktionierte es bei einer einfachen Redaxo 3.2 Installation mit nur sehr wenigen zusätzlichen Addons und Modulen. Falls in einem Modul, Addon oder Template der Pfad ebenfalls fest drin steht, muss dieser dort auch noch angepasst werden.

Für die neue Redaxoversion sollte das Anpassen des Ordnernamens in der Redaxogrundversion auf die index.php und die master.inc.php begrenzt sein. Entsprechende Änderungen sind dazu weitestgehend bereits im CVS drin.(Stand: 26.8.2006)
(zum Forenbeitrag)

3. Namen der Rootkategorie als Artikelüberschrift
Den Namen einer Rootcategory kann man mit diesem Code direkt als Artikelüberschrift ausgeben lassen:

$cat = OOCategory::getCategoryById($this->getValue('category_id')); 
$tree = $cat->getParentTree(); 
echo '<h1>'. $tree[0]->getName() .'</h1>';

Dazu muss der Code an entsprechender Stelle ins Template eingebaut werden.

4. Redaxo und MySQL 5.X [3.2]
Joins ab MySQL 5.0.12
Es gibt seit MySQL 4.0 die Möglichkeit das Verhalten von MySQL beim Umgang mit Anfragen über die Systemvariable sql_mode zu steuern. Bei MySQL 4.0 musste dies bei der Konfiguration des Servers noch fest eingebunden werden. Seit MySQL 4.1.1 kann der sql_mode auch zur Laufzeit geändert werden. Mit MySQL 5.0.2 wurde der sql_mode STRICT_TRANS_TABLES als Standardwert (Diese Angabe ist noch nicht bestätigt. (03.10.2006)) eingestellt.
Was macht dieser STRICT_TRANS_TABLES-Modus? Nun, er sorgt dafür, dass MySQL die ihm übergebenen Daten sorgfältig überprüft und bei Fehlern die weitere Verarbeitung des ihm übergebenen Aufrufes abbricht.
Ein Fehler könnte z.B. sein, wenn versucht wird einen String in ein als integer deklariertes Feld zu speichern. Ohne Strict-Mode wandelt MySQL den String in eine "0" um und speichert diesen Wert ab. Im Strict-Mode hingegen bricht MySQL die Anfrage mit einem Fehler ab. Dies betrifft u.a. auch als NOT_NULL deklarierte Felder in denen ein Wert erwartet wird. Bei Redaxo <= 3.2 sind die Felder alle als NOT_NULL deklariert, was im erwähnten STRICT MODE zu Fehlern führt.
Die Lösung liegt im abschalten des STRICT MODE. Dies kann mit dieser Zeile erreicht werden: SET sql_mode = ''; Für Redaxo bedeutet dies eine Änderung direkt im Code. Zu Ändern ist die Datei redaxo/include/classes/class.sql.inc.php.
In der Funktion function sql($DBID = 1) muss nach $this->counter = 0; die erwähnte SET-Anweisung eingefügt werden. $this->setQuery("SET sql_mode = ''"); Dies sollte dann insgesamt so aussehen:

  function sql($DBID = 1)
  {
    global $REX;

    $this->identifier = @ mysql_pconnect($REX['DB'][$DBID]['HOST'], 
$REX['DB'][$DBID]['LOGIN'], $REX['DB'][$DBID]['PSW']);
    $this->debugsql = false;
    $this->DBID = $DBID;
    $this->selectDB();
    $this->zaehler = 0;
    $this->counter = 0;

    // MySQL Version bestimmen
    if ($REX['MYSQL_VERSION'] == '')
    {
      $this->setQuery("SET sql_mode = ''");
      $this->setQuery('SELECT VERSION() as VERSION');
      $res = $this->get_array();
      $arr = array ();
      preg_match('/([0-9]+\.([0-9\.])+)/', $res[0]['VERSION'], $arr);
      $REX['MYSQL_VERSION'] = $arr[1];
    }
  }

(Quelle: MySQL - The definitive guide to using, programming, and administrating MySQL 4.1 and 5.0 (ISBN: 0-672-32673-6)) Dieses Buch betrachtet MySQL nur bis Version 4.1.9 und 5.0.3

Joins ab MySQL 5.0.12 [3.2]
Mit MySQL 5.0.12 wurde das Verhalten von Natural Joins, Joins mit USING inclusive von Outer Join Varianten an den SQL:2003 Standard angepasst. Weitere Informationen dazu finden sich im MySQL-Handbuch, Abschnitt "Join Processing Changes in MySQL 5.0.12".
Dies kann ebenfalls Auswirkungen auf das Verhalten von Redaxo 3.2 haben. Allerdings gibt es dafür keine einfache Lösung.
Betroffene SQL-Abfragen erzeugen eine Fehlermeldung mit diesem Text (dies ist ein Beispiel!)
Unknown column 't1.i1' in 'on clause'

Eine Fehler auslösende SQL-Abfrage könnte z.B. sein SELECT * FROM t1, t2 JOIN t3 ON (t1.i1 = t3.i3); Eine mögliche Lösung ist das Zusammenfassen der Tabellen im FROM-Teil mit Hilfe einer Klammer: SELECT * FROM (t1, t2) JOIN t3 ON (t1.i1 = t3.i3);

6. Artikel der Root Kategorie auslesen [3.2]
Alle Artikel der Root-Kategorie lassen sich mit diesem Einzeiler auslesen: OOArticle::getRootArticles($ignore_offlines, $clang) $ignore_offlines: true oder false - Auflisten von Offlineartikeln zulassen oder verbieten
Wenn $ignore_offlines und/oder $clang nicht gesetzt sind, wird für beide automatisch false verwendet.

Anwendungsbeispiel:

<?php
$catsLev = OOArticle::getRootArticles(true); 
$countLev = count($catsLev); 
$key = $countLev-1; 
$lastLev = $catsLev[$key]; 
foreach (OOArticle::getRootArticles() as $mainnav) {
  if ($mainnav->isOnline() && $mainnav->getId() != 1) {
    echo '<li'.$style.'>
            <a href="'.$mainnav->getUrl().'">'.$mainnav->getName().'</a>
          </li>';
  }
}
?>


7. Mehrere Redaxoinstallationen aber nur eine DB [3.2]
[Siehe auch] Doku::A1.05 Mehrfachinstallation von Redaxo
Frage: Ist es möglich den PRÄFIX bei den Tabellennamen, bei der Installation von REDAXO umzuändern? Ich möchte eventuell mehrere REDAXO instanzen auf einem SERVER installieren.
Antwort: Einfach in der master.inc.php das Präfix ändern: $REX['TABLE_PREFIX'] = "rex_"; Wichtig ist, dass du dieses Präfix änderst, bevor du das SETUP durchführst.

8. Ist der Benutzer im Backend eingeloggt?

<?php
if ($_SESSION['UID'][$REX['INSTNAME']]>0)
{
  // Der aktuelle User ist im Backend angemeldet
}
else
{
  // Der aktuelle User ist NICHT im Backend angemeldet
}
?>


9. "Online bis zum" steht auf 01.01.2010. Wie kann das geändert werden? [3.2]
Der max. Wert für "Online bis" (online_to) ist fest in Redaxo einprogrammiert.
Um dies zu ändern begebe man sich in die Datei redaxo/include/pages/content.inc.php zur Zeile 713 for ($i=2005;$i<2011;$i++){ und ändere dort die 2011 z.B. auf 2030.
Nun müssen noch die Daten in der Datenbank angepasst werden.
Dies kann mit ein paar Zeilen PHP-Code schnell erledigt werden. Der Code muss dazu nur in das default-Template kopiert und die Seite einmal aufgerufen werden. Wenn das erledigt ist, sollte der Code wieder aus dem Template entfernt werden. Das wars schon :-)

<?php
$abfrage = "UPDATE rex_article SET online_to = '1861916400' where online_to = '1262300400'";
     $sql = new sql();
     $data = $sql->get_array($abfrage);
 ?>

(zum Forenbeitrag)

9.1. Anpassen des "Online bis"-Artikeldatums beim anlegen einer neuen Kategorie oder eines Artikels
Wird eine neue Kategorie oder ein Artikel angelegt, so wird auch die "Online bis" (online_to) Zeit mit festgelegt. Per Grundeinstellung ist das Datum der 01.01.2010
Ändern läßt sich das in der Datei redaxo/include/pages/structure.inc.php in Zeile 232 und 338. Dort steht jeweils folgende Zeile: $AART->setValue("online_to", mktime(0, 0, 0, 1, 1, 2010)); Setze für 2010 eine beliebige andere Jahreszahl ein, die nicht größer ist, als die unter Punkt 9 in der for-Schleife eingetragene Zahl!
Fertig.


Koala 20.07.2012 09:44 Uhr

Page last modified on 20.07.2012 09:44 Uhr