Magento 1.9.2.0: la table "sales_flat_order_grid" contient de l'espace supplémentaire dans la valeur du nom du client


19

Dans le panneau d'administration, lorsque je souhaite rechercher les commandes en fonction du nom du client, je dois ajouter 2 espaces entre le prénom et le nom. Quand j'ai regardé la valeur dans la fenêtre de l'élément Inspect, j'ai remarqué que la valeur est affichée avec un espace supplémentaire. Comment puis-je résoudre ce problème?


1
Toujours présent dans 1.9.3.10
sv3n

Réponses:


23

Dans Magento 1.9.2, le deuxième prénom a été ajouté à cette colonne:

Source: 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
    ));

Malheureusement, ils n'ont pas vraiment pensé au cas où un client n'a pas de deuxième prénom. Voici à quoi devrait ressembler le code :

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

Vous pouvez copier le fichier app/code/local/Mage/Sales/Model/Resource/Order.phpet le patcher comme décrit.

Pour corriger les enregistrements existants, vous pouvez utiliser ce script PHP jetable:

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

Placez-le comme fixordergrid.phpdans le répertoire racine de Magento, exécutez-le et supprimez-le. Cela peut prendre un certain temps, il vaut donc mieux l'exécuter à partir de la console, pas dans le navigateur:

php fixordergrid.php

Ah, probablement, le deuxième prénom était alors une chaîne vide et non nulle. J'ai également mis à jour le code pour refléter cela
Fabian Schmengler

Merci pour la gentille réponse. Cela fonctionne pour les nouveaux clients enregistrés. Qu'en est-il des anciens enregistrements, peut-il être corrigé via une requête db?
Zinat

J'essaierais de forcer le recalcul de la table une fois avecMage::getModel('sales/order')->getResource()->updateGridRecords(Mage::getResourceModel('sales/order_collection')->getAllIds());
Fabian Schmengler

Veuillez voir la mise à jour pour les instructions
Fabian Schmengler

1
Je ne l'ai pas trouvé dans le suivi des problèmes, je l'ai signalé maintenant: magentocommerce.com/bug-tracking/issue/index/id/1202
Fabian Schmengler

2

Pour approfondir la réponse acceptée, il est préférable de ne pas modifier le code principal de Magento, il serait donc préférable d'utiliser une réécriture avec le correctif.

Dans config.xml

<global>
    <models>
        <sales_resource>
            <rewrite>
                <order>Yournamespace_Yourextension_Model_Sales_Order_Resource_Order</order>
            </rewrite>
        </sales_resource>
    </models>
</global>

3
La réponse acceptée ne modifie pas le code principal de Magento, @fschmengler recommande un remplacement de pool de codes local. Ce modèle particulier est souvent réécrit par les modules, et donc le remplacement du pool de codes est probablement meilleur.
Michael Parkin
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.