Magento 1.9.2.0: tabela „Sales_flat_order_grid” zawiera dodatkowe miejsce w wartości nazwy klienta

19

W panelu administracyjnym, gdy chcę wyszukiwać zamówienia na podstawie nazwy klienta, muszę dodać 2 spacje między imieniem i nazwiskiem. Kiedy spojrzałem na wartość w oknie Inspect element, zauważyłem, że wartość jest wyświetlana z dodatkową spacją. Jak mogę to naprawić?

Zinat
źródło
1
Nadal obecny w 1.9.3.10
sv3n

Odpowiedzi:

23

W Magento 1.9.2 drugie imię zostało dodane do tej kolumny:

Źródło: https://github.com/OpenMage/magento-mirror/blob/magento-1.9/app/code/core/Mage/Sales/Model/Resource/Order.php#L93-L99

    $ifnullFirst   = $adapter->getIfNullSql('{{table}}.firstname', $adapter->quote(''));
    $ifnullMiddle  = $adapter->getIfNullSql('{{table}}.middlename', $adapter->quote(''));
    $ifnullLast    = $adapter->getIfNullSql('{{table}}.lastname', $adapter->quote(''));
    $concatAddress = $adapter->getConcatSql(array(
        $ifnullFirst,
        $adapter->quote(' '),
        $ifnullMiddle,
        $adapter->quote(' '),
        $ifnullLast
    ));

Niestety tak naprawdę nie myśleli o sprawie, w której klient nie ma drugiego imienia. Tak powinien wyglądać kod :

    $ifnullFirst   = $adapter->getIfNullSql('{{table}}.firstname', $adapter->quote(''));
    $ifnullMiddle  = $adapter->getIfNullSql('{{table}}.middlename', $adapter->quote(''));
    $ifnullLast    = $adapter->getIfNullSql('{{table}}.lastname', $adapter->quote(''));
    $concatAddress = $adapter->getConcatSql(array(
        $ifnullFirst,
        $adapter->quote(' '),
        $ifnullMiddle,
        new Zend_Db_Expr('IF({{table}}.middlename IS NULL OR {{table}}.middlename="", "", " ")'),
        $ifnullLast
    ));

Możesz skopiować plik app/code/local/Mage/Sales/Model/Resource/Order.phpi załatać go zgodnie z opisem.

Aby naprawić istniejące rekordy, możesz użyć tego wysuwanego skryptu PHP:

<?php
require 'app/Mage.php';
Mage::app();
Mage::getModel('sales/order')->getResource()->updateGridRecords(
    Mage::getResourceModel('sales/order_collection')->getAllIds()); 
echo 'done';

Umieść go jak fixordergrid.phpw katalogu głównym Magento, uruchom i usuń. Może to zająć trochę czasu, więc lepiej uruchomić go z konsoli, a nie w przeglądarce:

php fixordergrid.php
Fabian Schmengler
źródło
Ach, prawdopodobnie drugie imię było wówczas pustym ciągiem, a nie zerowym. Zaktualizowałem również kod, aby to odzwierciedlić
Fabian Schmengler
Dziękuję za miłą odpowiedź. Działa dla nowych zarejestrowanych klientów. Co powiesz na stare rekordy, czy można to naprawić za pomocą zapytania db?
Zinat
Spróbowałbym wymusić ponowne przeliczenie stołu raz zMage::getModel('sales/order')->getResource()->updateGridRecords(Mage::getResourceModel('sales/order_collection')->getAllIds());
Fabianem Schmengler
Proszę zobaczyć aktualizację instrukcji
Fabian Schmengler
1
Nie znalazłem go w narzędziu do śledzenia problemów, zgłosiłem to teraz: magentocommerce.com/bug-tracking/issue/index/id/1202
Fabian Schmengler
2

Aby uzyskać dalszą akceptowaną odpowiedź, najlepszą praktyką jest nie edytowanie podstawowego kodu magento, więc lepsze byłoby użycie przepisania z poprawką.

W config.xml

<global>
    <models>
        <sales_resource>
            <rewrite>
                <order>Yournamespace_Yourextension_Model_Sales_Order_Resource_Order</order>
            </rewrite>
        </sales_resource>
    </models>
</global>
beingalex
źródło
3
Przyjęta odpowiedź nie edytuje podstawowego kodu Magento, @fschmengler zaleca zastąpienie lokalnej puli kodów. Ten konkretny model jest często przepisywany przez moduły, dlatego też zastąpienie puli kodów jest prawdopodobnie lepsze.
Michael Parkin,