PHP 5.5 Hata - Kullanımdan kaldırılmış işlevsellik: preg_replace ()


16

PHP 5.5'e yükselttikten sonra, bir Web Sitesi, Mağaza veya Mağaza Görünümü eklerken aşağıdaki hatayı alıyoruz. Bu hata hala Magento 1.9.0.1'de mevcut

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}

Hatayı üreten kod budur

Kod şurada bulunabilir: 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);
}

Bence, yöntem için en kolay yama:

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

Yöntem yalnızca Mage_Adminhtml_System_StoreController::storeAction().

Düzeltmek için üç olası yer vardır:

  1. Mage_Core_Helper_Abstract => yöntemin bulunduğu yer, ancak bir çekirdek dosyaya dokunduğu için berbat.
  2. Mage_Core_Helper_Abstract => yeniden yaz soyut bir sınıftır, bu yüzden yeniden yazılmamalı / tekrar yazılmamalıdır.
  3. Mage_Adminhtml_Helper_Data yeniden yazın ve yöntemi buraya ekleyin. => Bence bu yol.

Siz ne düşünüyorsunuz?

  1. Seçenek # 3 sorunu düzeltmek için doğru yoldur.
  2. Düzeltme ekimdeki kod doğru mu?

1.9.1 CE ve 1.14.1

Yanıtlar:


13

Evet haklısın. Adminhtml yardımcısını düzeltin. Bu kullandığım düzeltme için farktır:

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

Bu, davranışın php 5.4 ile aynı olduğunu onaylamak için yapılan bir testtir:

<?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

Bu, Magento EE 1.14.1 ve 1.9.1'de düzeltildi. Ek uyumsuzluk, yedekleme (Geri Alma) ve yükleme sırasında bazı uzantıları etkileyen katran () / unpack () değişiklikleri - tar dosyalarına dokunan her şeydir. Üretimde Magento'yu çalıştıranların bunları kullanmadığını varsayıyorum.


Yama daha önceki sürümler için ne zaman yayınlanacak;)
Ben Lessani - Sonassi

henüz / ne zaman bilmiyorum
Piotr Kaminski

3

Kısa cevap: Magento PHP 5.5 ile uyumlu değildir, web sunucunuzu 5.5'e güncellemeyin.

Daha uzun cevap: Magento'nun bu hatayı bir sonraki sürümle düzelttiğini varsayıyorum, bu yüzden sadece bir çekirdek kesmek ve en iyisini umuyorum. Kodun doğru olup olmadığını bilmiyorum, üzgünüm.


Merhaba Fabian, tüm sunucularımızı PHP 5.5 üzerinde çalıştırıyoruz. Karşılaştığım ilk sorun bu. Bilinen diğer uyumsuzluklar nelerdir veya bu bilgiler nereden geliyor?
RobM84

1
Hiçbir fikrim yok. Sadece yöntemler ve ini ayarları için changelog php.net/manual/tr/migration54.php ve grep'i kontrol edebilirsiniz
Fabian Blechschmidt

1
aslında bu magento CE tek PHP 5.5 sorunu, biz üzerinde çalışan son yarım yıl içinde başka bir hit olmadı
Flyingmana

2
Ayrıca thats gerçekten kötü bir tavsiye, 5.3 yol modası geçmiş olduğundan, php 5.4 çoğu insan APC ile kullandığından gerçek bir kararlı duruma asla çarpmadı, 5.5 şu anda mevcut olan tek minimum kararlı desteklenen PHP sürümüdür, olmayan tüm güvenlik düzeltmelerinden bahsetmiyor eski PHP versiyonlarında mevcut
Flyingmana
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.