pronto.ee

Tomorrow will be cancelled due to lack of interest

Upgrading to Magento 1.9.4.0, PHP 7.2 compatibility problem

Magento
Magento

Magento 1.9.4.0 should support PHP 7.2 and fortunately it mostly does. However there’s an upgrade script from older Magento versions which, lets say, has room for improvements.

When your original Magento is old enough (I tested it on Magento 1.7.0.2) the process will throw following error message:

Fatal error: Uncaught Error: [] operator not supported for strings in /magento-path/app/code/core/Mage/Usa/sql/usa_setup/upgrade-1.6.0.1-1.6.0.2.php on line 93
( ! ) Error: [] operator not supported for strings in /magento-path/app/code/core/Mage/Usa/sql/usa_setup/upgrade-1.6.0.1-1.6.0.2.php on line 93

The culprit of the message above is here:

    $newValue = '';
    if (stripos($oldValue['path'], 'free_method') && isset($oldToNewMethodCodesMap[$oldValue['value']])) {
        $newValue = $oldToNewMethodCodesMap[$oldValue['value']];
    } else if (stripos($oldValue['path'], 'allowed_methods')) {
        foreach (explode(',', $oldValue['value']) as $shippingMethod) {
            if (isset($oldToNewMethodCodesMap[$shippingMethod])) {
                $newValue[] = $oldToNewMethodCodesMap[$shippingMethod];
            }
        }
        $newValue = implode($newValue, ',');
    } else {
        continue;
    }

As you can see $newValue is declared as a string and almost immediately expected to be an array (provided that conditions are right). No good. Simplest way to resolve it is to redeclare it as an array when it happens:

    $newValue = '';
    if (stripos($oldValue['path'], 'free_method') && isset($oldToNewMethodCodesMap[$oldValue['value']])) {
        $newValue = $oldToNewMethodCodesMap[$oldValue['value']];
    } else if (stripos($oldValue['path'], 'allowed_methods')) {
        $newValue = [];
        foreach (explode(',', $oldValue['value']) as $shippingMethod) {
            if (isset($oldToNewMethodCodesMap[$shippingMethod])) {
                $newValue[] = $oldToNewMethodCodesMap[$shippingMethod];
            }
        }
        $newValue = implode($newValue, ',');
    } else {
        continue;
    }

Magento: SUPEE-10752 v1 breaks Zend_Filter_PregReplace

There’s a chance that after installing SUPEE-10752v1 you might run into following error message:

Warning: substr() expects parameter 1 to be string, array given in /magento_root/app/code/core/Zend/Filter/PregReplace.php on line 173


This file was introduced as a part of SUPEE-10752v1 patch and it adds some deprecation modifier checks:

    /**
     * Perform regexp replacement as filter
     *
     * @param  string $value
     * @return string
     */
    public function filter($value)
    {
        if ($this->_matchPattern == null) {
            #require_once 'Zend/Filter/Exception.php';
            throw new Zend_Filter_Exception(get_class($this) . ' does not have a valid MatchPattern set.');
        }
        $firstDilimeter = substr($this->_matchPattern, 0, 1);
        $partsOfRegex = explode($firstDilimeter, $this->_matchPattern);
        $modifiers = array_pop($partsOfRegex);
        if ($modifiers != str_replace('e', '', $modifiers)) {
            throw new Zend_Filter_Exception(get_class($this) . ' uses deprecated modifier "/e".');
        }

        return preg_replace($this->_matchPattern, $this->_replacement, $value);
    }

It’s an override of lib/Zend/Filter/PregReplace.php and the original looks like this:

    /**
     * Perform regexp replacement as filter
     *
     * @param  string $value
     * @return string
     */
    public function filter($value)
    {
        if ($this->_matchPattern == null) {
            #require_once 'Zend/Filter/Exception.php';
            throw new Zend_Filter_Exception(get_class($this) . ' does not have a valid MatchPattern set.');
        }

        return preg_replace($this->_matchPattern, $this->_replacement, $value);
    }

As you can see, original method is indeed able to handle arrays while override is not. Objects such as lib/Zend/Filter/Word/CamelCaseToSeparator.php and lib/Zend/Filter/Word/SeparatorToCamelCase.php indeed use arrays for match patterns:

    public function filter($value)
    {
        if (self::isUnicodeSupportEnabled()) {
            parent::setMatchPattern(array('#(?<=(?:\p{Lu}))(\p{Lu}\p{Ll})#','#(?<=(?:\p{Ll}|\p{Nd}))(\p{Lu})#'));
            parent::setReplacement(array($this->_separator . '\1', $this->_separator . '\1'));
        } else {
            parent::setMatchPattern(array('#(?<=(?:[A-Z]))([A-Z]+)([A-Z][A-z])#', '#(?<=(?:[a-z0-9]))([A-Z])#'));
            parent::setReplacement(array('\1' . $this->_separator . '\2', $this->_separator . '\1'));
        }

        return parent::filter($value);
    }

While Magento itself does not use the things above some of the third party extension do, such as Ebizmarts_SagePaySuite (Zend_Filter_Word_CamelCaseToUnderscore extends Zend_Filter_Word_CamelCaseToSeparator), do. Here a sample code from app/code/local/Ebizmarts/SagePaySuite/Helper/Data.php:

    public function cameltounder($str)
    {
        $a = new Zend_Filter_Word_CamelCaseToUnderscore;

        return strtolower($a->filter($str));
    }

Solution:

Easiest way to solve this issue is to copy the file mentioned above (app/code/core/Zend/Filter/PregReplace.php) to app/code/local/Zend/Filter/PregReplace.php and replace the filter method with following:

    /**
     * Perform regexp replacement as filter
     *
     * @param string $value
     * @return string
     */
    public function filter($value)
    {
        if ($this->_matchPattern == null) {
            #require_once 'Zend/Filter/Exception.php';
            throw new Zend_Filter_Exception(get_class($this) . ' does not have a valid MatchPattern set.');
        }
        $patterns = array();
        if (is_array($this->_matchPattern)) {
            $patterns = $this->_matchPattern;
        } else {
            $patterns[] = $this->_matchPattern;
        }
        foreach($patterns as $pattern) {
            $firstDilimeter = substr($pattern, 0, 1);
            $partsOfRegex = explode($firstDilimeter, $pattern);
            $modifiers = array_pop($partsOfRegex);
            if ($modifiers != str_replace('e', '', $modifiers)) {
                throw new Zend_Filter_Exception(get_class($this) . ' uses deprecated modifier "/e".');
            }
        }
        return preg_replace($this->_matchPattern, $this->_replacement, $value);
}

I guess eventually there will be SUPEE-10752v2 which hopefully fixes this problem. Make sure to check/remove the local override when you install it.

PS. Everything above applies to Magento OS v1.9.3.9 as well.

Magento CE 1.9.0.1

Vaid kaks päeva pärast eelmise versiooni tulekut sai Magento täiendust ning värskeimaks numbriks tõusis 1.9.0.1. Uuendus parandab kaks väikest kuid väga olulist viga: esiteks ei saa klient enam ostukorvis kasutada mitte aktiivset kupongi ja teiseks väike parandus uuest responive kestas, mis pisemate ekraanide peal ei töötanud päris nii nagu oli plaanitud.

Magento CE 1.9.0

Magento

Magento

Seoses Las Vegases toimuva Imagin konverentsiga lasi Magento välja uue versiooni oma populaarsest e-poe platvormist mille tasuta variant kannab nüüd numbrit 1.9.0. Erinevalt kahest eelmisest versioonist (1.8.0 ja 1.8.1) sisaldas see päris mitut olulist muudatust. Vaatame, mida see uuendus endaga kaasa tõi.

PHP 5.4 tugi

Magento eelmine versioon tuli välja eelmise aasta detsembris. Selle aasta jaanuaris ilmus nendele lehele funktsionaalsuspaik, mis lubas lisada versioonidele alates 1.6.0 PHP 5.4 toe. Spetsialistide hinnangul sisaldab PHP 5.4 täiendusi, mis võivad kuni 28% kiirendada Magento kliendiliidest. Magento CE 1.9.0-le on see uuendus juba sisse ehitatud ning ainuüksi see täiendus võib olla argumendiks, miks korraline uuendustee ette võtta.

Piiriülene kaubandus

Täiendatud funktsionaalsus lihtsustab hindade ja maksude arvutamist piiriülese kabanduse puhul. Tegemist on täiendusega, mida päris mitmed e-poodnikud on nõudnud: võimalus jätta lõpphind kogu Euroopa Liidu sees samaks, kuigi erinevates riikides võivad olla maksumäärad erinevad.

PayPal

Ohtralt on lisandunud PayPaliga seotud uut funktsionaalsust, näiteks toetab Magento nüüd  funkctiooni nimega “Bill Me Later”, ehk maksa hiljem.

Sellega siiski uue funktsionaalsuse nimekiri ei lõppe ning lisaks kaasneb täiendusega hulgaliselt veaparandusi. Täpsemalt saab kõikidest uuendustest lugeda siit.

Mac ja Linux sõbralikult, näe, ulatavad Internet Explorerile käe

Internet Explorer 10

Internet Explorer 10

Suur osa (võimalik, et isegi üle poole) veebiarendusest toimub kas Mac OS X-i või mõne Linuxi distributsiooni rüpes. Ma ei hakka siinkohas seletama miks see nii on, aga kui see postitus tundub relevante, siis ei vajagi see vast täiendavaid kommentaare. Siiski kaasneb sellega üks suure mure — märkimisväärne osa Internetis kasutajatest pruugib endiselt (millegipärast) Internet Explorerit, mis paraku aga neis kahes operatsioonisüsteemis ei toimi. Samas on IE-l läbi aegade olnud tõsiseid probleeme ülejäänud veebibrauseritega ühte sammu astumisega, mis tekitab veebiarendajale vajaduse teha täiendavaid teste. Ehk teisisõnu: mida sina testid kui testi ei ole.

Õnneks pole asi siiski lootusetu ning appi tõttab vana hea virtualiseerimine, kuid paraku on virtualiseerimisel üks võrdlemise ebameeldib kõrvalnähtus — selleks, et jooksutada Internet Explorerit, peab virtuaalmasinas jooksutama Windowsi, mille litsents maksab aga raha. Selleks, et proovida vaid seda, kas veebileht paistab kasutajale normaalne, kaugelt liiga palju raha. Õnneks pole see dilemma (testida või mitte testida) jäänud märkamatuks ka Microsoftile ja nõnda ongi Redmond käivitanud projekti nimega modern.IE.

modern.IE kujutab ette ennast valitud sortimenti virtuaalmasinate tõmmiseid, kuhu on paigaldatud viimase piirini nuditud Windows, mis on mõeldud vaid Internet Exploreri käivitamiseks ning see tõmmis on arendajate jaoks tasuta.

modern.IE koduleht asub siin: www.modern.ie

Praegusel hetkel on tõmmised tehtud valmis kolme virtualiseerija jaoks: tasuta VirtualBoxi ning tasuliste Parallelsi ja VMWare jaoks. Tõmmised leiab kõigi olulisemate Internet Exploreri versioonide ja Windowsite jaoks. Hetkel on sortiment järgnev:

  1. Windows XP – IE6
  2. Windows XP – IE8
  3. Windows Vista – IE7
  4. Windows 7 – IE8
  5. Windows 7 – IE9
  6. Windows 7 – IE10
  7. Windows 7 – IE11 Preview
  8. Windows 8 – IE10
  9. Windows 8.1 – IE11 Preview

Tähelepanuks ka niipalju, et suur osa tõmmistest on allalaadimise hõlbustamiseks jagatud mitmesse faili. Esimene fail on tavaliselt .sfx laiendiga ja kui sellele anda käivitumisõigused (chmod u+x fail.sfx), siis on ta võimeline kogu asja lahti pakkima eeldusel, et kõik failid on samas kataloogis ja loetavad. Seejärel tuleb tegutseda nii nagu tõmmistega ikka tegutsetakse, näiteks VirtualBoxi puhul tuleb lahtipakkimisel tekkinud fail importida. Tähelepanuks veel niipalju, et alates Windows 7-st tuleks virtuaalmasinale eraldada mälu vähemalt 1024MB-i.

Head testimist.

WordPress v3.0.3

Wordpress

Kes arvas, et pääseb enne loetud päevade jooksul saabuvat suuremat versioonimuutust (v3.1) oma WordPressi installatsiooni uuendamisest, see arvaku uuesti. Vaid paar päeva pärast viimase (v3.0.2) veaparanduse ilmumist tõstis pead veel üks turvakonarus, mis seekord lubab mittelokaalsetel pahatahtlikel kasutajatel soovi korral teha asju, milleks neil õigusi ei ole.

Uusima versiooni leiab WordPressi koduleheküljelt ning soovi korral on seda võimalik alla laadida ka administreerimisliidese automaatse paigaldaja abil.

WordPress v3.0.2

Wordpress

Meeldetuletuseks niipalju, et järgmise suurema versiooniuuenduseni (v3.1) on jäänud vaid paar nädalat, on WordPressi tiim väljastanud parandusversiooni v3.0.2. Eelkõige on see uuendus vajalik nendele, kes kasutavad oma keskkonnas rohkem kui ühte sisuautorit ning mitte kõik neist pole samade õigustega. Selgub, et väiksemate õigustega kasutajal on võimalik WordPressi vigu kasutades endale suuremaid õiguseid kaaperdada ja potentsiaalselt sellega kurja teha.

Vaba vara?

Ma teen ettepaneku lõpetada sellise sõna nagu vabavara ebasihipärase kasutamise ära. Tegemist on tavaliselt väärtõlkega inglise keelest, kus sõna free tähendab üheaegselt nii “vaba” kui “tasuta”.

Miks ma sellest räägin? Ma räägin seda sellepärast, et sõna kasutus või väärkasutus mõjutab seda kuidas inimene suhtub ühte või teise tootesse. Tasuta tarkvara ehk freeware ei pruugi olla automaatselt avatud lähtekoodiga ega ka “vaba” vara. Näiteks Oracle Express (Oracle Database XE) on tasuta tarkvara, kuna selle eest ei pea sentigi lauale veeretama, ometigi pole see “vaba”, sest Oracle hoiab endale kõik sellega seotud õigused. Teisest küljest võttes ei tohi unustada, et isegi kui tootega antakse kaasa lähtekood, ei pruugi see seda automaatselt “vabaks” teha. Näiteks praktiliselt kogu PHP tasuline tarkvara on avatud lähtekoodiga ja ometigi mitte “vaba”.

Õigupoolest ei nimetaks ma vabaks varaks ka ühtegi GPL litsentsiga tarkvara, sest GPL seab paika päris jõhkrad reeglid kuidas seda tarkvara võib või ei või kasutada. Minu silmis on vabavara vaid public domain tarkvara, mille omaniku ja litsentsitingimusi kas ei ole võimalik tuvastada või on omanik loobunud kõikidest õigustest sellele. Taolist vara võib kasutada kuidas pähe tuleb — laiendada, muuta, müüa (juhul kui ostja leiab), jagada, jne. Kui omanik on teada siis võib talle viidata, aga ka selle jaoks pole mingit kohustust.

Nagu olen ma jõudnud välja punkti, et enamus tarkvara, mida traditsiooniliselt kiputakse Eestis vabavaraks nimetama ei ole teps mitte vaba, vaid hoopis a) avatud lähtekoodiga (open source) ja b) tasuta (freeware).

Pages:12