2012-07-18 16 views
7

Digamos que usted tiene un nombre de clase Space_Module_Model_LongModelName y quiere hacer referencia a ella como:¿Es posible utilizar los nombres de clase de CamelCase en los modelos de Magento?

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

Esto parece funcionar en algunos entornos de desarrollo, pero no parece funcionar en todos los ambientes. Probablemente tiene que ver con una configuración de sensibilidad de caso del sistema de archivos.

El error que se produce en entornos donde no funciona es que el include() para Space/Module/Model/Longmodelname.php falló.

Respuesta

16

Tiene un config-node en su config.xml llamado global/models/yourpackage en el que guarda su Prefix para sus modelos de clase.

Cuando llama a Mage :: getModel ('packagename/classname') Magento recupera este nodo de configuración, p. Company_Yourmodule_Models agrega un _ y después el nombre de clase con mayúscula la primera letra:

Company_Yourmodule_Models_Classname

si ha camelCase nombres de las clases, es de la misma manera. Digamos que su clase de nombre es NombredeClase entonces usted tiene que llamar Mago :: getModel ('nombrepaquete/className') y Magento Resuelve que: Company_Yourmodule_Models_ClassName

+1

Hola Schrank. Bienvenido @StackOverflow. –

+0

Gracias por la cálida bienvenida :) –

1

Seguramente existe la posibilidad de utilizar camelcase; puede ver el módulo, p. ImportExport en el núcleo de Magento. Creo que todo se trata de establecer nombres correctos (con camel case) en xmls

+0

Gracias Jerzy, pero creo que usted se refiere a nombres de los módulos de casos camello y no * * modelo nombres, diferentes cuestiones - pero ambos son posible ahora sé :) – kalenjordan

2

Tome un vistazo a app/code/core/Mage/Core/Model/Config.php específicamente getGroupedClassName(); como usted notará es uc_words usado en el método al construir el $className, que capitalizará cada dos palabras en la cadena de nombre de clase.

Así que su nombre de clase LongModelName se convertirá en Longmodelname para el incluir.

Podrías extender esto fácilmente para que funcione como quieres, pero como es una pieza principal de la generación de fábrica de Magento, personalmente no lo tocaría por miedo a romper otros módulos de terceros y vivir con el espacio de nombres no de camello .

La razón por la cual ImportExport funciona es porque es el nombre del módulo y no un nombre de clase. Me he encontrado con el mismo problema antes y, por molesto que sea, tiendo a mantener los nombres de las clases sin Camel.

+0

Gracias Boomer. Creo que uc_words() en realidad usa mayúscula la primera letra, pero no baja enérgicamente el resto de las letras. ¡Así que creo que la sugerencia de Fabian de camel-casing el alias de clase hace el truco! – kalenjordan

0

Cuatro años más tarde, otra nota:

Si desea utilizar nombres de las clases CamelCased además de los nombres de archivo, asegúrese de que la siguiente parte de su {} ModuleName /etc/config.xml se CamelCased así:

`` `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 porción debe CamelCased con el f primera letra minúsculaDe lo contrario, obtendrá una excepción de Can't retrieve entity config: yourmodule/longModelName

(ver Mage_Core_Model_Resource::getTableName())

Cuestiones relacionadas