2012-01-22 13 views
8

Prima di tutto, mi scuso per aver chiesto ancora un'altra domanda "override magento core" qui, ma ho seguito circa 10 tutorial e letto quasi tutte le domande simili pubblicate qui, senza successo.magento non può sostituire il core model

Devo eseguire l'override di alcuni modelli e classi principali. Il codice funziona, perché ho già cambiato il core (in un sito di test di Magento) e ha funzionato perfettamente. Ma ogni tanto un aggiornamento Magento è disponibile e se dovessimo applicare gli aggiornamenti tutte le mie modifiche andrebbero perse. Quindi devo sostituire il codice base. Voglio creare il mio modulo per inserire tutto il codice richiesto, perché devo solo sostituire 1 o 2 funzioni in ogni classe, il resto dovrebbe funzionare come Magento.

Il mio primo tentativo è stato quello di ignorare la classe Mage_Sales_Model_Order_Pdf_Invoice. Ok, quindi ho creato il mio modulo. La struttura dei file è:

app/code/local/[namespace] /Sales/etc/config.xml

app/code/local/[namespace] /Sales/Helper/Data.php (Questa classe non fa nulla, è solo una classe vuota. l'ho fatto perché ho letto da qualche parte che Magento a volte non riconosce il modulo se non v'è nessuna classe Helper)

app/code/local /[namespace]/Sales/Model/Order/Pdf/Invoice.php

app/etc/modules/[namespace] _Sales.xml

Il [spazio dei nomi] File _Sales.xml appare in questo modo:

<?xml version="1.0"?> 
    <config> 
     <modules> 
      <[namespace]_Sales> 
       <active>true</active> 
       <codePool>local</codePool> 
      </[namespace]_Sales> 
     </modules> 
    </config> 

Il file config.xml è simile al seguente:

< ?xml version="1.0"?> 
    <config> 
    <modules> 
     <[namespace]_Sales> 
      <version>0.1.0</version> 
     </[namespace]_Sales> 
    </modules> 
    <global> 
    <helpers> 
      <sales> 
       <class>[namespace]_Sales_Helper</class> 
      </sales> 
     </helpers> 
     <models> 
      <sales> 
       <rewrite> 
        <order_pdf_invoice>[namespace]_Sales_Model_Order_Pdf_Invoice</order_pdf_invoice> 
       </rewrite> 
      </sales> 
     </models> 
    </global> 
</config> 

e il file Invoice.php assomiglia a questo:

<?php 

/****I'm adding some different classes here*******************************/ 
include_once Mage::getBaseDir('lib')."/myclass.php"; 
include_once Mage::getBaseDir('lib')."/another_library.php"; 
/********************************************************/ 

class [namespace]_Sales_Model_Order_Pdf_Invoice extends Mage_Sales_Model_Order_Pdf_Invoice 
{ 
    public function getPdf($invoices = array()) 
    { 
     //my code 
    } 


} 

Volevo testare questo prima prima di andare a scavalcare tutti gli altri controller e modelli che devo modificare.

Il problema è che utilizza ancora il modello originale.

Penso che il codice del modulo e i percorsi siano corretti, perché Magento trova il mio modello personalizzato. Ho controllato andando nel back-end e ho visto Sistema-> configurazione-> avanzato

Ho cancellato completamente la cache, quindi non è così.

ho usato get_class per determinare quale modello viene restituito nel controller: get_class (Mage :: getModel ('vendite/order_pdf_invoice')), restituisce Mage_Sales_Model_Order_Pdf_Invoice

non so dove ho fatto un errore ma sono sicuro di averlo fatto uno :(

+1

Perché gli spazi bianchi qui? '' – Zyava

+0

Ho copiato la struttura xml degli esempi e l'ho modificata di conseguenza al mio modulo personalizzato. Non penso che lo spazio bianco sia necessario, ma funziona anche in questo modo. – itd

risposta

7

Ci sono alcuni errori che ho trovato alla lettera.Si prega di correggere questi errori: -

Tutte le strutture di file, che avete menzionato nella questione all'interno del pool codice "local", avere un nome di cartella mancante all'interno della cartella "code" "app". Quindi ogni struttura di file del tuo modulo locale deve essere come: "app/code/local/[namespace]/Sales/...".

Se questa struttura di cartelle è errata, anche il tuo modulo [namespace]_Sales potrebbe non funzionare come previsto.

In secondo luogo, il contenuto del file "config.xml" è un po 'errato. Il corretto sarà: -

<?xml version="1.0"?> 
<config> 
    <modules> 
    <[namespace]_Sales> 
     <version>0.1.0</version> 
    </[namespace]_Sales> 
    </modules> 

    <global> 
    <helpers> 
     <!-- 
     This node will be the unique identifier of your module, 
     and it will be used every time your code requires referencing your own module. 
     This shouldn't clash with other unique identifiers used in your Magento system. 
     Normally all the characters are kept in small case for this, 
     however, I haven't tried with the upper case. 
     But it will be best to keep your unique identifier in small case only. 
     --> 
     <[namespace]sales> 
     <class>[namespace]_Sales_Helper</class> 
     </[namespace]sales> 
    </helpers> 

    <models> 
     <!-- 
     If this is not provided, then Magento will not know your module's starting part of Model Class Names. 
     --> 
     <[namespace]sales> 
     <class>[namespace]_Sales_Model</class> 
     </[namespace]sales> 
     <sales> 
     <rewrite> 
      <order_pdf_invoice>[namespace]_Sales_Model_Order_Pdf_Invoice</order_pdf_invoice> 
     </rewrite> 
     </sales> 
    </models> 
    </global> 
</config> 

Inoltre non credo che sarà necessario l'aggiunta di diverse classi qui (che avete fatto in "[namespace]_Sales_Model_Order_Pdf_Invoice" Pagina classe PHP). Questo perché Magento carica automaticamente tutte le definizioni delle librerie correlate (alcuni esempi di classi di libreria sono "Varien" e "Zend"). Dovrai solo creare un oggetto di quelle classi di librerie e sarai in grado di utilizzare pienamente i metodi.

Spero che aiuti.

+1

Sì, ho scritto la domanda un po 'veloce e erroneamente. Tutti i miei file sono ovviamente nella cartella app/code/local e non in app/local. Vedrò comunque i tuoi altri suggerimenti, grazie per il tuo aiuto :) – itd

+1

@itd - Più benvenuto –

+0

Grazie, ha funzionato. Il file config.xml ha avuto errori, proprio come hai detto tu. – itd

Problemi correlati