Come modificare i tipi di colonna catalog_product_flat


8

Un sito Web che gestisco richiede che i prezzi abbiano 5 decimali. Sono andato avanti e ho modificato almeno una dozzina di file / tabelle per riuscire a raggiungere questo obiettivo. Ma (perché c'è sempre un ma) sembra esserci un problema catalog_product_flat_X.

Mi spiego: per i prezzi sul fronte, la maggior parte delle volte, si tratta di chiamare Mage_Catalog_Model_Product->getPrice(), che, a quanto ho capito, cercherà il prezzo nei tavoli piatti (se hai tavoli piatti abilitati). Il problema è con la reindicizzazione dei dati.

Se la mia tabella piatta ha un prezzo con il formato DECIMAL(12,5), premendo il link "Reindex" sulla riga "Reindex flat data" verrà ripristinata ALTERla tabella piatta DECIMAL(12,4).

Dopo aver cercato per molto tempo, sono arrivato ad una funzione in
app/code/core/Mage/Catalog/Model/Resource/Product/Flat/Indexer.php
cui viene chiamato prepareFlatTable($storeId). Questa funzione chiama quindi convertOldColumnDefinition($column)su ogni colonna della tabella piatta (in questo caso).

Infine, osservando questa funzione in
app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.php
essa sembra convertire tutti decimale numericcosì:

case 'decimal':
case 'numeric':
        $length = $proposedLength;
        $type = Varien_Db_Ddl_Table::TYPE_DECIMAL;
        break;  

in cui $proposedLengthè il risultato di questo:

$definition = trim($column['type']);
if (!preg_match('/([^(]*)(\\((.*)\\))?/', $definition, $matches)) {
    throw Mage::exception(
        'Mage_Core',
        Mage::helper('core')->__("Wrong old style column type definition: {$definition}.")
    );
}

$proposedLength = (isset($matches[3]) && strlen($matches[3])) ? $matches[3] : null;  

Non capisco bene cosa stia succedendo qui, inserisco qualcosa di hardcoded ma non voglio interferire con il normale processo di tutti gli indicizzatori.

Qualcuno può illuminarmi su questo argomento e offrirmi una soluzione?


puoi per favore pubblicare la soluzione? Cosa hai cambiato nel app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.phpfile? Ho lo stesso problema e non riesco a trovare una soluzione
zekia

@zekia Sinceramente non ricordo di scusarmi.
Julien Lachal,

Risposte:


0

Lascia che ti dia alcune spiegazioni sul codice che converte la definizione di colonna:

    $definition = trim($column['type']);
    if (!preg_match('/([^(]*)(\\((.*)\\))?/', $definition, $matches)) {
        throw Mage::exception(
            'Mage_Core',
            Mage::helper('core')->__("Wrong old style column type definition: {$definition}.")
        );
    }

Quindi sostanzialmente il preg_matchmetodo ti darà un array nella $matchesvariabile in base alla definizione della colonna (memorizzata in $definition).

L'esempio di definizione delle colonne di solito è simile al seguente:

  • int
  • varchar (100)
  • decimale (12,4)

Tali definizioni di colonna forniranno rispettivamente il seguente risultato $matchesnell'array:

  • array('int','int')
  • array('varchar(100)','varchar','(100)','100')
  • array('decimal(12,4)','decimal','(12,4)','12,4')

Quindi hai la $proposedLengthvariabile:

$ propostaLunghezza = (isset ($ corrispondenze [3]) && strlen ($ corrispondenze [3]))? $ corrispondenze [3]: null;

È sostanzialmente uguale alla quarta voce $matchesdell'array se questa è impostata.

Quindi nel tuo caso il valore di $proposeLengthdovrebbe essere 12,5.

Il mio consiglio:

Aggiungi il seguente codice subito dopo la $proposedLengthdichiarazione della variabile:

Mage::log($column);
Mage::log($matches);
Mage::log($proposedLength);

Riprova e controlla il tuo var/log/system.logfile per assicurarti che il codice si comporti come dovrebbe.


@fschmengler ha modificato il titolo della mia domanda, che ora è fuorviante perché non corrisponde a quello che volevo porre nella mia domanda. Ho finito per codificare un valore app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.php.
Julien Lachal,

@JulienLachal sentiti libero di pubblicare la tua soluzione e contrassegnare la tua domanda come risposta
Raffaello al Pianismo Digitale

No, non è una soluzione, è un trucco, quindi non lo posterò. Penso che accetterò il tuo in quanto dettaglia ciò che dovrebbe succedere.
Julien Lachal,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.