Bug PHP 5.5 - Funzionalità obsoleta: preg_replace ()


16

Dopo aver eseguito l'aggiornamento a PHP 5.5, viene visualizzato il seguente errore quando si aggiunge un sito Web, Store o Store View. Questo bug è ancora presente in 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}

Questo è il codice che produce l'errore

Il codice è disponibile 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);
}

Questa è, a mio avviso, la patch più semplice per il metodo:

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

Il metodo è utilizzato solo dal Mage_Adminhtml_System_StoreController::storeAction().

Esistono tre posti possibili per risolverlo:

  1. Mage_Core_Helper_Abstract => è lì che si trova il metodo, ma fa schifo perché tocca un file core.
  2. Riscrivi Mage_Core_Helper_Abstract => è una classe astratta, quindi non dovrebbe / non può essere riscritta.
  3. Riscrivi Mage_Adminhtml_Helper_Data e aggiungi il metodo lì. => Penso che questa sia la strada da percorrere.

Che cosa ne pensate?

  1. L'opzione 3 è il modo corretto per risolvere il problema.
  2. Il codice nella mia patch è corretto?

Il problema persiste ancora nella versione 1.9.1 CE e 1.14.1 EE

Risposte:


13

Si hai ragione. Correggi l'helper adminhtml. Questa è la diff per la correzione che uso:

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

Questo è un test per confermare che il comportamento è lo stesso di 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

Questo problema è stato risolto in Magento EE 1.14.1 e 1.9.1. Ulteriori incompatibilità sono le modifiche pack () / unpack () che influiscono sul backup / rollback e su alcune estensioni durante l'installazione, tutto ciò che tocca i file tar. Presumo che chiunque stia eseguendo Magento in produzione non li stia utilizzando.


Quando verrà rilasciata la patch per le versioni precedenti;)
— Ben Lessani - Sonassi,

non so ancora se / quando
— Piotr Kaminski,

3

Risposta breve: Magento non è compatibile con PHP 5.5, non aggiornare il server Web a 5.5.

Risposta più lunga: suppongo che Magento corregga questo bug con la prossima versione, quindi farei solo un core hack e spero il meglio. Non so se il codice sia corretto, scusa.


Ciao Fabian, gestiamo tutti i nostri server su PHP 5.5 già da un po 'di tempo. Questo è il primo problema che abbia mai incontrato. Quali altre incompatibilità conosciute esistono o da dove provengono queste informazioni?
— RobM84,

1
tbh non ne ho idea. Si può solo controllare il changelog php.net/manual/en/migration54.php e grep per i metodi e le impostazioni ini
— Fabian Blechschmidt

1
in realtà questo è l'unico problema di PHP 5.5 in magento CE, non ne abbiamo
— riscontrato

2
anche questo è un pessimo consiglio, dato che 5.3 è obsoleto, php 5.4 non ha mai raggiunto uno stato reale stabile poiché la maggior parte delle persone lo usa con APC, 5.5 è attualmente l'unica versione di PHP supportata minima stabile, senza menzionare tutte le correzioni di sicurezza che non sono incluso nelle versioni precedenti di PHP
— Flyingmana,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.