Magento 1.9.2.0: таблица «sales_flat_order_grid» содержит дополнительное пространство в имени клиента

19

В админ-панели, когда я хочу искать заказы по имени клиента, я должен добавить 2 пробела между именем и фамилией. Когда я посмотрел на значение в окне элемента Inspect, я заметил, что значение отображается с дополнительным пробелом. Как я могу это исправить?

Зинат
источник
1
Все еще присутствует в 1.9.3.10
sv3n

Ответы:

23

В Magento 1.9.2 второе имя было добавлено в этот столбец:

Источник: 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
    ));

К сожалению, они на самом деле не думали о случае, когда у клиента нет отчества. Вот как должен выглядеть код :

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

Вы можете скопировать файл app/code/local/Mage/Sales/Model/Resource/Order.phpи исправить его, как описано.

Чтобы исправить существующие записи, вы можете использовать этот одноразовый PHP-скрипт:

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

Поместите его как fixordergrid.phpв корневой каталог Magento, выполните и удалите его. Это может занять некоторое время, поэтому лучше запустить его из консоли, а не из браузера:

php fixordergrid.php
Фабиан Шменглер
источник
Ах, наверное, отчество было тогда пустой строкой, а не нулем. Я обновил код, чтобы отразить это также
Фабиан Шменглер
Спасибо за добрый ответ. Это работает для новых зарегистрированных клиентов. Как насчет старых записей, это можно исправить с помощью запроса базы данных?
Зинат
Я бы попытался провести пересчет таблицы один раз сMage::getModel('sales/order')->getResource()->updateGridRecords(Mage::getResourceModel('sales/order_collection')->getAllIds());
Фабиан Шменглер,
Пожалуйста, смотрите обновление для инструкций
Фабиан Шменглер
1
Я не нашел его в системе отслеживания проблем, сообщил об этом сейчас: magentocommerce.com/bug-tracking/issue/index/id/1202
Фабиан Шменглер,
2

Чтобы продолжить принятый ответ, лучше не редактировать основной magento-код, поэтому лучше было бы использовать переписывание с исправлением.

В config.xml

<global>
    <models>
        <sales_resource>
            <rewrite>
                <order>Yournamespace_Yourextension_Model_Sales_Order_Resource_Order</order>
            </rewrite>
        </sales_resource>
    </models>
</global>
beingalex
источник
3
Принятый ответ не редактирует основной код Magento, @fschmengler рекомендует переопределить локальный пул кода. Эта конкретная модель часто переписывается модулями, и поэтому переопределение пула кода, вероятно, лучше.
Майкл Паркин