PHP 5.5 Bug - Fungsionalitas usang: preg_replace ()


16

Setelah kami meningkatkan ke PHP 5.5, kami mendapatkan kesalahan berikut saat menambahkan Situs Web, Toko atau Tampilan Toko. Bug ini masih ada di 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}

Ini adalah kode yang menghasilkan kesalahan

Kode dapat ditemukan di 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);
}

Ini, menurut saya, patch yang paling mudah untuk metode ini:

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

Metode ini hanya digunakan oleh Mage_Adminhtml_System_StoreController::storeAction().

Ada tiga kemungkinan tempat untuk memperbaikinya:

  1. Mage_Core_Helper_Abstract => di situlah metode ini berada, tetapi menyebalkan karena menyentuh file inti.
  2. Tulis ulang Mage_Core_Helper_Abstract => ini adalah kelas abstrak, jadi seharusnya tidak / tidak bisa ditulis ulang.
  3. Tulis ulang Mage_Adminhtml_Helper_Data dan tambahkan metode di sana. => Saya pikir ini adalah cara untuk pergi.

apa yang kalian pikirkan?

  1. Apakah opsi # 3 cara yang benar untuk memperbaiki masalah.
  2. Apakah kode di tambalan saya benar?

Masalah masih ada di 1.9.1 CE dan 1.14.1 EE

Jawaban:


13

Ya kamu benar. Perbaiki pembantu adminhtml. Ini adalah perbedaan untuk perbaikan yang saya gunakan:

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

Ini adalah tes untuk mengkonfirmasi perilaku yang sama dengan 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

Ini sekarang diperbaiki di Magento EE 1.14.1 dan 1.9.1. Ketidakcocokan tambahan adalah perubahan pack () / unpack () yang mempengaruhi Backup / Rollback dan beberapa ekstensi selama instalasi - apa pun yang menyentuh file tar. Saya menganggap siapa pun yang menjalankan Magento dalam produksi tidak menggunakan itu.


Kapan patch dirilis untuk versi sebelumnya;)
Ben Lessani - Sonassi

belum tahu jika / kapan
Piotr Kaminski

3

Jawaban singkat: Magento tidak kompatibel dengan PHP 5.5, jangan perbarui server web Anda menjadi 5.5.

Jawaban yang lebih panjang: Saya berasumsi, Magento memperbaiki bug ini dengan versi berikutnya, jadi saya hanya akan membuat hack inti dan berharap yang terbaik. Saya tidak tahu apakah kodenya benar, maaf.


Halo Fabian, kami menjalankan semua server kami di PHP 5.5 untuk beberapa waktu sekarang. Ini adalah masalah pertama yang pernah saya temui. Ketidakcocokan lain yang diketahui yang ada atau dari mana informasi ini berasal?
RobM84

1
tbh saya tidak tahu. Anda cukup memeriksa changelog php.net/manual/en/migration54.php dan grep untuk metode dan pengaturan ini
Fabian Blechschmidt

1
sebenarnya ini adalah satu-satunya masalah PHP 5.5 di magento CE, kami tidak menemukan masalah lain dalam setengah tahun terakhir menjalankannya
Flyingmana

2
juga itu saran yang sangat buruk, karena 5.3 sudah ketinggalan zaman, php 5.4 tidak pernah mencapai keadaan stabil nyata karena kebanyakan orang menggunakannya dengan APC, 5.5 saat ini merupakan satu-satunya versi PHP minimum yang didukung stabil, tidak menyebutkan semua perbaikan keamanan yang tidak termasuk dalam versi PHP yang lebih lama
Flyingmana
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.