[Gelöst] Contao Leads & Notification Center PHP 7 "Cannot use 'String'"
Hallo,
erstmal vielen Dank für die saugeilen Erweiterungen, super flexibel & umfangreich zu konfigurieren!
Unter Contao 3.5.12 und PHP 7.0.6 erhalte ich jedoch folgenden Fehler (bei aktivierter Fehlerausgabe, ansonsten weißen Bildschirm):
Code:
Fatal error: Cannot use 'String' as class name as it is reserved in [Pfad_zu_Contao]/system/modules/core/library/Contao/String.php on line 28
in folgenden Fällen:
- nach dem Absenden eines Formulars im Frontend und aktivierter Benachrichtigung (also Notification Center), Daten werden gespeichert
- wenn ich mir die gespeicherten Daten im Backend ansehen will und bereits Daten vorhanden sind (also Leads; wenn noch keine Daten gespeichert wurden, wird die Seite normal aufgerufen ("Keine Einträge vorhanden")).
Mit PHP 5.6 funktioniert es.
Inhalt der String.php:
PHP-Code:
<?php
/**
* Contao Open Source CMS
*
* Copyright (c) 2005-2016 Leo Feyer
*
* @license LGPL-3.0+
*/
namespace Contao;
if (version_compare(PHP_VERSION, '7.0', '>=')) {
throw new \RuntimeException(
'The String class cannot be used in PHP ' . PHP_VERSION . '. Use the StringUtil class instead.'
);
}
/**
* Provides a String class for backwards compatibility.
*
* @author Leo Feyer <https://github.com/leofeyer>
*
* @deprecated Use the StringUtil class instead
*/
class String extends \StringUtil
{
/**
* Object instance (Singleton)
* @var \StringUtil
*/
protected static $objInstance;
/**
* Prevent direct instantiation (Singleton)
*
* @deprecated String is now a static class
*/
protected function __construct() {}
/**
* Prevent cloning of the object (Singleton)
*
* @deprecated String is now a static class
*/
final public function __clone() {}
/**
* Return the object instance (Singleton)
*
* @return \String The object instance
*
* @deprecated String is now a static class
*/
public static function getInstance()
{
if (static::$objInstance === null)
{
static::$objInstance = new static();
}
return static::$objInstance;
}
}
Contao Check ist alles grün.
Wenn ich die Fehlermeldung richtig interpretiere, dürfte es nicht an den Erweiterungen, sondern an Contao selbst liegen (der Fehler tritt aber wie geschildert nur im Zusammenhang mit den beiden Erweiterungen auf)?
Bin dankbar für Hinweise, was hier falsch laufen könnte.
Gruß, Jens
EDIT -Lösung-
haste 4.11.4 ist noch nicht PHP7-fit:
Zitat:
Zitat von
Thraile
Die Extension "haste" ist der Übeltäter, hier wird noch die String-Klasse verwendet (Angaben der Fundstellen mit Zeile:Spalte):
Code:
system/modules/haste/library/Haste/Util/StringUtil.php
$strText = \String::decodeEntities($strText); [position 46:20]
$strBuffer = \String::parseSimpleTokens($strText, $arrTokens); [position 59:22]
$strBuffer = \String::restoreBasicEntities($strBuffer); [position 71:22]
Hier einfach \String:: gegen \StringUtil:: austauschen und das sollte es gewesen sein. Es gibt hierfür auch schon einen PR auf Github
https://github.com/codefog/contao-haste/pull/79. In den nächsten Versionen ist das Problem dann wohl Geschichte.
bei Verwendung des Composer:
Zitat:
Zitat von
Thraile
Ach ja, wenn du Composer verwendest änder mal die gleiche Datei unter Composer/vendor/codefog/Contao-haste/....
der grund für die fehlende Meldung in der error.log:
Zitat:
Zitat von
Thraile
Ich habe das mal versucht nachzustellen und einfach mal in der PageRegular-Klasse einen Aufruf der String-Klasse eingebaut. In der Error.log wird wirklich nichts geschrieben, hier scheint irgend etwas mit dem Error-Handling von Contao unter PHP7 nicht ganz rund zu laufen.
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
entschuldigt bitte meine Unwissenheit: wie komme ich denn an den Stack Trace?
Die Fehlermeldung besteht nur aus der einen Zeile im Eröffnungspost, in die error.log wird nichts geschrieben.
Ich möchte nochmal auf die Situationen, in denen der Fehler auftritt, hinweisen:
Zitat:
Zitat von
ikratki
in folgenden Fällen:
- nach dem Absenden eines Formulars im Frontend und aktivierter Benachrichtigung (also Notification Center), Daten werden gespeichert
- wenn ich mir die gespeicherten Daten im Backend ansehen will und bereits Daten vorhanden sind (also Leads; wenn noch keine Daten gespeichert wurden, wird die Seite normal aufgerufen ("Keine Einträge vorhanden")).
Der Fehler tritt auch nach dem Deaktivieren sämtlicher Erweiterungen auf, die für Leads und Notification Center nicht benötigt werden (s. Anhang).
Ohne Benachrichtigung (Notification Center) und Formulardatenspeicherung (Leads) treten auch keine Fehler auf, also kann es doch eigentlich nur an diesen Erweiterungen oder jenen, die für diese noch benötigt werden, liegen?
haste: 4.11.4
multicolumnwizard: 3.3.5
dcawizard: 2.3.3
Ich bin offen gesagt zu OOP / PHP Klassen noch nicht vorgedrungen und weiß nicht, wo ich überall (in welchen Verzeichnissen und dort Dateien) nach String suchen müsste, um es durch StringUtil zu ersetzen, deshalb meine Frage hier im Forum, wo der Fehler liegen könnte.
Mit dem Deaktivieren fast aller Erweiterungen und den einzigen 2 Situationen, in denen der Fehler auftritt, sollte die Suche doch stark eingegrenzt worden sein?
Danke für eure Hilfe!
Gruß, Jens