PHP 5.5 Bug - Fonctionnalité obsolète: preg_replace ()


16

Après avoir mis à niveau vers PHP 5.5, nous obtenons l'erreur suivante lors de l'ajout d'un site Web, d'un magasin ou d'une vue de magasin. Ce bug est toujours présent dans Magento 1.9.0.1

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}

C'est le code qui produit l'erreur

Le code se trouve dans 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);
}

C'est, à mon avis, le patch le plus simple pour la méthode:

/**
 * 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);
}

La méthode n'est utilisée que par le Mage_Adminhtml_System_StoreController::storeAction().

Il y a trois endroits possibles pour le réparer:

  1. Mage_Core_Helper_Abstract => c'est là que se trouve la méthode, mais elle craint car elle touche un fichier core.
  2. Réécrire Mage_Core_Helper_Abstract => c'est une classe abstraite, donc elle ne doit pas / ne peut pas être réécrite.
  3. Réécrivez Mage_Adminhtml_Helper_Data et ajoutez-y la méthode. => Je pense que c'est la voie à suivre.

Qu'en pensez-vous?

  1. L'option # 3 est-elle la bonne façon de résoudre le problème.
  2. Le code de mon patch est-il correct?

Le problème existe toujours dans 1.9.1 CE et 1.14.1 EE

Réponses:


13

Oui, tu as raison. Corrigez l'aide adminhtml. Voici la différence pour le correctif que j'utilise:

--- 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);
 }

Ceci est un test pour confirmer que le comportement est le même qu'avec php 5.4:

<?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('<>', '<>'),
        );
    }
} 

4

Ceci est maintenant corrigé dans Magento EE 1.14.1 et 1.9.1. Une incompatibilité supplémentaire est les changements pack () / unpack () qui affectent la sauvegarde / restauration et certaines extensions pendant l'installation - tout ce qui touche les fichiers tar. Je suppose que quiconque exécute Magento en production ne les utilise pas.


Quand le patch sera-t-il publié pour les versions antérieures;)
Ben Lessani - Sonassi

Je ne sais pas encore si / quand
Piotr Kaminski

3

Réponse courte: Magento n'est pas compatible PHP 5.5, ne mettez pas à jour votre serveur Web vers 5.5.

Réponse plus longue: je suppose que Magento corrige ce bogue avec la prochaine version, donc je ferais juste un hack de base et j'espère le meilleur. Je ne sais pas si le code est correct, désolé.


Salut Fabian, nous exécutons tous nos serveurs sur PHP 5.5 depuis un certain temps maintenant. C'est le premier problème que j'ai rencontré. Quelles autres incompatibilités connues existent ou d'où proviennent ces informations?
RobM84

1
tbh je n'en ai aucune idée. Vous pouvez simplement consulter le changelog php.net/manual/en/migration54.php et grep pour les méthodes et les paramètres ini
Fabian Blechschmidt

1
en fait c'est le seul problème PHP 5.5 dans magento CE, nous n'en avons pas rencontré un autre au cours du dernier semestre
Flyingmana

2
c'est aussi un très mauvais conseil, car 5.3 est bien obsolète, php 5.4 n'a jamais atteint un état vraiment stable car la plupart des gens l'utilisent avec APC, 5.5 est actuellement la seule version PHP stable minimale prise en charge disponible, sans mentionner tous les correctifs de sécurité qui ne sont pas inclus dans les anciennes versions de PHP
Flyingmana
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.