2012-07-18 9 views
7

Diciamo che si dispone di un nome di classe Space_Module_Model_LongModelName e si desidera fare riferimento come:È possibile utilizzare i nomi delle classi CamelCase nei modelli Magento?

Mage::getModel('module/longmodelname'); 

Questo sembra funzionare in alcuni ambienti di sviluppo, ma non sembra funzionare in tutti gli ambienti. Probabilmente ha a che fare con l'impostazione della distinzione tra maiuscole e minuscole del file system.

L'errore che si ottiene in ambienti in cui non funziona è che il include() per Space/Module/Model/Longmodelname.php non è riuscito.

risposta

16

Si ha un nodo di configurazione nel proprio file config.xml denominato global/models/yourpackage in cui si salva il prefisso per i modelli di classe.

Quando si chiama Mage :: getModel ('nomepacchetto/nomecampo') Magento recupera questo nodo di configurazione, ad es. Company_Yourmodule_Models aggiunge un _ e poi il nome di classe con la prima lettera maiuscola:

Company_Yourmodule_Models_Classname

se avete CamelCase classnames, è allo stesso modo. Quindi diciamo che la classe nome è ClassName allora dovete chiamare Mage :: getModel ('packagename/className') e Magento risolve a: Company_Yourmodule_Models_ClassName

+1

Ciao Schrank. Benvenuto @StackOverflow. –

+0

Grazie per il caloroso benvenuto :) –

1

Di sicuro c'è la possibilità di usare il camelcase - puoi vedere il modulo ad es. ImportExport nel nucleo di Magento. Penso che tutto riguardi l'impostazione di nomi corretti (con casi cammello) in xmls

+0

Grazie Jerzy, ma credo che ti riferisci a nomi di modulo di casi di cammello e non * Modello * nomi, hanno problemi diversi - ma entrambi sono possibile ora lo so :) – kalenjordan

2

Date un'occhiata a app/code/core/Mage/Core/Model/Config.php specificamente getGroupedClassName(); come si noterà uc_words è utilizzato nel metodo durante la creazione dello $className, che capitalizzerà ogni altra parola nella stringa del nome della classe.

Quindi il nome della classe LongModelName diventerà Longmodelname per l'inclusione.

Si potrebbe facilmente estendere questo per funzionare nel modo desiderato ma dal momento che è un pezzo così importante della generazione di fabbrica di Magento personalmente non lo toccherei per paura di rompere altri moduli di terze parti e vivere con lo spazio dei nomi di caso non-cammello .

La ragione per cui ImportExport funziona è perché è il nome del modulo e non il nome di una classe. Mi sono imbattuto nello stesso problema in passato e, per quanto fastidioso, tendo a mantenere solo i nomi delle classi non-cammelli.

+0

Grazie Boomer. Penso che uc_words() in realtà metta in maiuscolo la prima lettera ma non forzatamente con lettere maiuscole e minuscole. Quindi penso che il suggerimento di Fabian di camel-incassare l'alias della classe faccia il trucco! – kalenjordan

0

Quattro anni più tardi, un'altra nota:

Se si desidera utilizzare classnames formato camelCase oltre a nomi di file, assicurarsi che la parte seguente del vostro {} moduleName /etc/config.xml è formato camelCase così:

`` `xML

<global> 
    <models> 
     <ProbablyYourCompanyOrModuleName> 
      <ModuleName_resource> 
       <entities> 
        <!-- "longModelName" below should be CamelCased, but prob the first letter will be lowercased --> 
        <longModelName> 
         <table>your_db_table_name</table> 
        </longModelName> 
       </entities> 
      </ModuleName_resource> 
     </ProbablyYourCompanyOrModuleName> 
    </models> 
</global> 

` ``

la porzione dovrebbe essere formato camelCase con la f prima lettera minuscola.In caso contrario, si otterrà un'eccezione di Can't retrieve entity config: yourmodule/longModelName

(vedi Mage_Core_Model_Resource::getTableName())

Problemi correlati