PHP 5.5 Bug - Veraltete Funktionalität: preg_replace ()

16

Nach dem Upgrade auf PHP 5.5 wird beim Hinzufügen einer Website, eines Geschäfts oder einer Geschäftsansicht die folgende Fehlermeldung angezeigt. Dieser Fehler ist in Magento 1.9.0.1 immer noch vorhanden

Exception message: Deprecated functionality: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in app/code/core/Mage/Core/Helper/Abstract.php on line 238
Trace: #0 [internal function]: mageCoreErrorHandler(8192, 'preg_replace():...', 'app...', 238, Array)
#1 app/code/core/Mage/Core/Helper/Abstract.php(238): preg_replace('# <(?![/a-z]) |...', 'htmlentities('$...', 'New Store Name')
#2 app/code/core/Mage/Adminhtml/controllers/System/StoreController.php(175): Mage_Core_Helper_Abstract->removeTags('New Store Name')
#3 app/code/core/Mage/Core/Controller/Varien/Action.php(418): Mage_Adminhtml_System_StoreController->saveAction()
#4 app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(250): Mage_Core_Controller_Varien_Action->dispatch('save')
#5 app/code/core/Mage/Core/Controller/Varien/Front.php(172): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#6 app/code/core/Mage/Core/Model/App.php(354): Mage_Core_Controller_Varien_Front->dispatch()
#7 app/Mage.php(686): Mage_Core_Model_App->run(Array)
#8 index.php(87): Mage::run('', 'store')
#9 {main}

Dies ist der Code, der den Fehler erzeugt

Den Code finden Sie in Mage_Core_Helper_Abstract

/**
 * Remove html tags, but leave "<" and ">" signs
 *
 * @param   string $html
 * @return  string
 */
public function removeTags($html)
{
    $html = preg_replace("# <(?![/a-z]) | (?<=\s)>(?![a-z]) #exi", "htmlentities('$0')", $html);
    $html =  strip_tags($html);
    return htmlspecialchars_decode($html);
}

Dies ist meiner Meinung nach der einfachste Patch für die Methode:

/**
 * Remove html tags, but leave "<" and ">" signs
 *
 * @param   string $html
 * @return  string
 */
public function removeTags($html)
{
    $html = preg_replace_callback("# <(?![/a-z]) | (?<=\s)>(?![a-z]) #xi",
        create_function('$matches', 'return htmlentities($matches);'),
        $html
    );
    $html =  strip_tags($html);
    return htmlspecialchars_decode($html);
}

Die Methode wird nur von der Mage_Adminhtml_System_StoreController::storeAction().

Es gibt drei mögliche Stellen, um das Problem zu beheben:

  1. Mage_Core_Helper_Abstract => hier befindet sich die Methode, aber sie ist nicht gut, weil sie eine Kerndatei berührt.
  2. Schreibe Mage_Core_Helper_Abstract um => es ist eine abstrakte Klasse, daher sollte / kann sie nicht umgeschrieben werden.
  3. Schreiben Sie Mage_Adminhtml_Helper_Data neu und fügen Sie die Methode dort hinzu. => Ich denke, das ist der richtige Weg.

Was denkt ihr?

  1. Ist Option 3 der richtige Weg, um das Problem zu beheben.
  2. Ist der Code in meinem Patch korrekt?
RobM84
quelle
Problem besteht weiterhin in 1.9.1 CE und 1.14.1 EE

Antworten:

13

Ja, du hast recht. Korrigieren Sie den adminhtml-Helfer. Dies ist der Unterschied für das Update, das ich verwende:

--- app/code/core/Mage/Core/Helper/Abstract.php.orig 2014-09-25 15:32:56.000000000 +0200
+++ app/code/core/Mage/Core/Helper/Abstract.php 2014-09-25 15:34:42.000000000 +0200
@@ -235,7 +235,9 @@
  */
 public function removeTags($html)
 {
-        $html = preg_replace("# <(?![/a-z]) | (?<=\s)>(?![a-z]) #exi", "htmlentities('$0')", $html);
+        $html = preg_replace_callback("# <(?![/a-z]) | (?<=\s)>(?![a-z]) #xi", function($matches) {
+            return htmlentities($matches[0]);
+        }, $html);
         $html =  strip_tags($html);
         return htmlspecialchars_decode($html);
 }

Dies ist ein Test, um zu bestätigen, dass das Verhalten mit PHP 5.4 identisch ist:

<?php

namespace Vinai\Kopp\Magento\Tests;

class MageAdminhtmlHelperDataTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var \Mage_Adminhtml_Helper_Data
     */
    private $helper;

    static public function setUpBeforeClass()
    {
        ini_set('display_errors', 1);
        umask(0);
        error_reporting(E_ALL);
        require_once 'app/Mage.php';
        \Mage::setIsDeveloperMode(true);
    }

    public function setUp()
    {
        $this->helper = new \Mage_Adminhtml_Helper_Data();
    }

    /**
     * @covers \Mage_Core_Helper_Abstract::removeTags
     * @dataProvider removeTagsDataProvider
     */
    public function testRemoveTags($inputHtml, $expected)
    {
        $result = $this->helper->removeTags($inputHtml);
        $this->assertEquals($expected, $result);
    }

    public function removeTagsDataProvider()
    {
        return array(
            array('<b>', ''),
            array('<b> >', ' >'),
            array('<b> <', ' <'),
            array('<b/> </', ' '),
            array('< <b/>', '< '),
            array('> <b/>', '> '),
            array('</ <b/>', ''),
            array('x />', 'x />'),
            array('> <', '> <'),
            array('>>', '>>'),
            array('<<', '<<'),
            array('<>', '<>'),
        );
    }
} 
Vinai
quelle
4

Dies ist jetzt in Magento EE 1.14.1 und 1.9.1 behoben. Eine weitere Inkompatibilität sind Änderungen an pack () / unpack (), die sich auf Backup / Rollback und einige Erweiterungen während der Installation auswirken - alles, was TAR-Dateien berührt. Ich gehe davon aus, dass jeder, der Magento in der Produktion ausführt, diese nicht verwendet.

Piotr Kaminski
quelle
Wann ist der Patch für frühere Versionen freigegeben werden;)
Ben Lessani - Sonassi
Piotr Kaminski
3

Kurze Antwort: Magento ist nicht PHP 5.5 kompatibel, aktualisieren Sie Ihren Webserver nicht auf 5.5.

Längere Antwort: Ich gehe davon aus, dass Magento diesen Fehler mit der nächsten Version behebt, also würde ich einfach einen Core-Hack durchführen und das Beste hoffen. Ich weiß nicht, ob der Code korrekt ist, sorry.

Fabian Blechschmidt
quelle
Hallo Fabian, wir betreiben seit einiger Zeit alle unsere Server auf PHP 5.5. Dies ist das erste Problem, auf das ich gestoßen bin. Welche anderen bekannten Inkompatibilitäten gibt es oder woher stammen diese Informationen?
RobM84
1
tbh ich habe keine ahnung Sie können einfach im Changelog php.net/manual/en/migration54.php und grep nach den Methoden und INI-Einstellungen suchen
Fabian Blechschmidt
1
Eigentlich ist dies das einzige PHP 5.5-Problem in Magento CE, wir haben im letzten halben Jahr kein weiteres Problem damit gelöst
Flyingmana
2
auch das ist ein wirklich schlechter Rat, da 5.3 viel veraltet ist, PHP 5.4 niemals einen echten stabilen Zustand erreicht, da die meisten Leute es mit APC verwenden in älteren PHP-Versionen enthalten
Flyingmana