Hacía mucho tiempo que no escribía nada, hemos ido un poco liados con el lanzamiento/creación de dos nuevas tiendas en Magento.
Para estas dos nuevas tiendas en Magento hemos tenido que desarrollar varios módulos y tocar la configuración de Magento, así que hoy vamos a intentar explicar de forma resumida cómo se podemos crear menus de configuración para el administrador de Magento. Todo esto gracias a Alanstorm .
La primera vez que desarrolléis algo para Magento os parecerá un mundo (la verdad es que si no habéis usado un framework alguna vez se hace complicado, hasta que lo entiendes claro
)
El "módulo" que vamos a desarrollar no tiene ninguna funcionalidad, pero si explica parte por parte los elementos necesarios para su creación. Lo único que no vamos a hacer es una nueva entrada en el administrador con un par de campos.
Vamos por partes:
Creación del fichero de configuración
Lo primero que vamos a necesitar es un fichero para la configuración del sistema llamado system.xml (no confundir con config.xml)
CODE:
app/code/local/Alanstormdotcom/Helloworld/etc/system.xml
Un pequeño truco si necesitamos ver el contenido de la configuración es ejecutar desde cualquier página el siguiente código en PHP:
PHP:
//header('Content-Type: text/xml');
header ( 'Content-Type: text/plain' ) ;
echo $config = Mage::
getConfig ( )
->loadModulesConfiguration ( 'system.xml' )
->getNode ( )
->asXML ( ) ;
El método
loadModulesConfiguration buscará en todos los módulos configurados el fichero
system.xml . Magento dispone de otros ficheros además de este (api.xml, convert.xml, wsdl.xml, compilation.xml, install.xml).
Añadir una solapa en el administrador de Magento
La siguiente operación que vamos a realizar es añadir un "Tab" o solapa en el administrador de Magento (System->Configuration). Como solapas generales podemos encontrar la de General, Catálogo, Ventas, Servicios y Avanzado.
Ahora vamos a crear una nuevo llamada "Hello Config".
PHP:
Ubicación: app/code/local/Alanstormdotcom/Helloworld/etc/
system .xml
<config>
<tabs>
<helloconfig translate="label" module="helloworld" >
<label>Hello Config</label>
<sort_order>99999 </sort_order>
</helloconfig>
</tabs>
</config>
Algunas aclaraciones sobre el código del xml. El nombre
helloconfig es totalmente arbitrario, pero debe ser único entre todos los tabs que tenemos en el sistema. Nos servirá como identificador. Es mejor utilizar nombres que referencien lo que hace nuestro "módulo" para no liarse después.
El atributo module="helloworld" identifica del módulo al que pertenece,
indica el nombre del Tab y determina el orden de aparicion con respecto a los demás tabs en la columna de la izquierda del administrador.
Breve ayuda sobre las Helper Classes
Magento cuenta como muchos otros sistemas MVC con Helper classes, las cuales son usadas para una gran variedad de tareas que no encajan ni el Modelo, ni en la vista ni el controlador. Como desarrolladores de módulos podemos utilizar las Helper Classes del sistema o las nuestras propias (en el caso de nuestro módulo Helloworld).
Lo primero será añadirlo en el fichero config.xml (ojo, no el system.xml)
XML:
Fichero: app/code/local/Alanstormdotcom/Helloworld/etc/config.xml
<!-- ... -->
<global>
<!-- ... -->
<helpers>
<helloworld>
<class> Alanstormdotcom_Helloworld_Helper</class>
</helloworld>
</helpers>
<!-- ... -->
</global>
<!-- ... -->
La única parte "rara" que podemos encontrar aquí es la que hace referencia al nombre de la clase. Como sabréis la notación para esto debe seguir la siguiente estructura:
CODE:
Nombredelpaquete_Nombredelmodulo_Helper
Los Helpers se cargaran en el global Mage. La siguiente llamada servirá (teniendo en cuenta la configuración que hemos ido dando)
CODE:
Mage::helper ( 'helloworld/foo' ) ;
...cargará la siguiente clase
CODE:
app/code/local/Alanstormdorcom/Helper/Foo.php
class Alanstormdotcom_Helloworld_Helper_Foo
Magento también permite el concepto de "Helper por defecto" para un módulo, lo que significa que podíamos haber usado esta llamada:
CODE:
Mage::helper ( 'helloworld' ) ;
lo que hubiera provocado que se hubiera buscado en:
CODE:
app/code/local/Alanstormdorcom/Helper/Data.php
class Alanstormdotcom_Helloworld_Helper_Dara
Con esto llegamos a la conclusión de que es lo mismo poner estas dos líneas:
CODE:
Mage::helper ( 'helloworld' ) ;
Mage::helper ( 'helloworld/data' ) ;
Supongo que estas líneas os habrán aclarado más de una duda (o eso espero)
Por último tenemos que añadir el Helper class actual.
CODE:
Fichero: app/code/local/Alanstormdorcom/Helper/Data.php
class Alanstormdotcom_Helloworld_Helper_Data extends Mage_Core_Helper_Abstract
{
}
Si hemos seguido los pasos y hemos borrado la cache, ya no deberíamos tener ningún error en el administrador. Eso si, todavía no podremos ver nuestro nuevo Tab.
Añadir una Nueva Sección
El siguiente paso es saber por qué nuestra ficha no aparece todavía en el administrador. Cada Tab/ficha dispone de una serie de secciones. Por ejemplo, el Tab "Avanzado" por defecto tiene una de Administrador, Sistema, Avanzado y Desarrollador.
Si creamos un Tab sin secciones no se mostrará, por eso vamos a añadir un nodo llamado :
XML:
Ubicación: app/code/local/Alanstormdotcom/Helloworld/etc/system.xml
<config>
<tabs>
<helloconfig translate ="label" module ="helloworld" >
<label> Hello Config</label>
<sort_order> 99999</sort_order>
</helloconfig>
</tabs>
<sections>
<helloworld_options translate ="label" module ="helloworld" >
<label> Hello World Config Options</label>
<tab> helloconfig</tab>
<frontend_type> text</frontend_type>
<sort_order> 1000</sort_order>
<show_in_default> 1</show_in_default>
<show_in_website> 1</show_in_website>
<show_in_store> 1</show_in_store>
</helloworld_options>
</sections>
</config>
helloworld_options , como antes, un nombre arbitrario, usado para identificar nuestra nueva sección.
label , define lo que se mostrará en la interfaz. Es decir, la etiqueta.
tab , identifica bajo que Tab estará agrupada nuestra nueva sección.
frontend_type , esta no está muy clara. Parece que no sirve para nada (corregirme si me equivoco), yo la pongo por si las moscas
sort_order , determina el orden de aparición (vertical) con respecto a las otras secciones.
show_in_default , , , determina el nivel la granularidad que tiene esta sección. Los valores son 0 y 1.
Con todo esto claro ya deberíamos ver la nueva Ficha con su sección. Si queremos añadir nuevas secciones únicamente tenemos que introducir nuecas .
Control de Acceso
Si pulsamos en la nueva sección que acabamos de crear obtendremos una página en blanco. Esto se debe a que el Adminhtml no puede encontrar la entrarda de nuestra nueva sección en el ACL (Access Control List) - Lista de control de acceso.
La gente de Magento decidió en su momento que las secciones de configuración de Sistema deberían tener porotección ACL.
Los recursos son definidos mendiante URI's. Por ejemplo, la sección de configuración "web" se define de la siguiente forma:
en nuestro caso...
CODE:
admin/system/config/helloworld_options
La sección del administrador (conocida como Adminhtml) está desarrollada con el mismo framework que la tienda. Cada vez que un usuario accede a un recurso del admin, el adminhtml debe:
Deducir la URI donde el usuario quiere acceder
Comprobar la URI contra el sistema ACL y determinar si el usuario tiene permisos sobre este recurso
Si el usuario no tiene privilegios informar
Para los que estéis interesados en esta parte el método usado es _isSectionAllowed que podemos encontrar en el siguiente controlador:
CODE:
app/code/core/Mage/Adminhtml/controllers/System/ConfigController.php
Como todos sabréis, una forma de ver los Roles asignados en el administrador es desde Sistema-> Permisos -> Roles
Añadir Roles. ACL
Para entender esta sección hay que leer la anterior. Para los despistados
Editamos el fichero que controla los permisos necesarios para acceder a nuestra nueva sección:
XML:
Fichero: app/code/local/Alanstormdotcom/Helloworld/etc/config.xml
<config>
<!-- ... -->
<adminhtml>
<acl>
<resources>
<admin>
<children>
<system>
<children>
<config>
<children>
<helloworld_options>
<title> Store Hello World Module Section</title>
</helloworld_options>
</children>
</config>
</children>
</system>
</children>
</admin>
</resources>
</acl>
</adminhtml>
<!-- ... -->
</config>
Resumiendo:
XML:
<adminhtml>
<acl>
<resources>
</resource>
</acl>
</adminhtml>
Dentro del recurso, cada nodo hijo representa una porción de la URI. Por ejemplo:
nos devuelve la siguiente URI
Si has seguido todos los pasos, tenemos las siguiente configuración:
XML:
<helloworld_options>
<title> Store Hello World Module Section</title>
</helloworld_options>
Para ver todos estos cambios desde el administrador, como siempre, borrar la cache, cerrar sesión y volver a iniciarla. Si todo ha ido bien, deberíamos ver una nueva página de llamada “Hello World Config Options”.
Añadir Grupos
Ya tenemos nuestra página de configuración (en blanco) con los permisos adecuados. Vamos a crear grupos para las secciones.
XML:
Ubicación: app/code/local/Alanstormdotcom/Helloworld/etc/system.xml
<config>
<tabs>
<helloconfig translate ="label" module ="helloworld" >
<label> Hello Config</label>
<sort_order> 99999</sort_order>
</helloconfig>
</tabs>
<sections>
<helloworld_options translate ="label" module ="helloworld" >
<label> Hello World Config Options</label>
<tab> helloconfig</tab>
<frontend_type> text</frontend_type>
<sort_order> 1000</sort_order>
<show_in_default> 1</show_in_default>
<show_in_website> 1</show_in_website>
<show_in_store> 1</show_in_store>
<groups>
<messages translate ="label" >
<label> Demo Of Config Fields</label>
<frontend_type> text</frontend_type>
<sort_order> 1</sort_order>
<show_in_default> 1</show_in_default>
<show_in_website> 1</show_in_website>
<show_in_store> 1</show_in_store>
</messages>
</groups>
</helloworld_options>
</sections>
</config>
Guardamos y recargamos la página. ¿Veís la caja con el título “Demo Of Config Fields”. ? (espero que si, sino mal vamos....)
Añadir campos de configuración. Config fields
Y ya por último, vamos a introducir los campos necesarios para la configuración de nuestro módulo. Esto se hace con el nodo
Por ejemplo, un campo con el nombre "hello_message".
XML:
<!-- ... -->
<messages translate ="label" >
<label> Demo Of Config Fields</label>
<frontend_type> text</frontend_type>
<sort_order> 1</sort_order>
<show_in_default> 1</show_in_default>
<show_in_website> 1</show_in_website>
<show_in_store> 1</show_in_store>
<fields>
<hello_message>
<label> Message</label>
<frontend_type> text</frontend_type>
<sort_order> 1</sort_order>
<show_in_default> 1</show_in_default>
<show_in_website> 1</show_in_website>
<show_in_store> 1</show_in_store>
</hello_message>
</fields>
</messages>
<!-- ... -->
Os acordáis que antes comentábamos la finalidad del campo frontend_type , bueno, pues aquí tenéis la explicación. En esta sección si tiene sentido. Si recargamos la página deberíamos ver un text field.
Vamos ahora con otro tipo de campo, uno de tipo time.
XML:
<!-- ...-->
<fields>
<hello_message>
<label> Message</label>
<frontend_type> text</frontend_type>
<sort_order> 1</sort_order>
<show_in_default> 1</show_in_default>
<show_in_website> 1</show_in_website>
<show_in_store> 1</show_in_store>
</hello_message>
<hello_time>
<label> Time to Say Hello</label>
<frontend_type> time</frontend_type>
<sort_order> 1</sort_order>
<show_in_default> 1</show_in_default>
<show_in_website> 1</show_in_website>
<show_in_store> 1</show_in_store>
</hello_time>
</fields>
<!-- ... -->
La única diferencia entre ambos nodos es el tipo. time
Para ver los tipos soportados por Magento podemos ir a lib/Varien/Data/Form/Element. No están todos, pero si la mayoría...
Ahora vamos a cambiar el text de hello_message por un combo.
XML:
<!-- ... -->
<hello_message>
<label> Message</label>
<frontend_type> select</frontend_type>
<sort_order> 1</sort_order>
<show_in_default> 1</show_in_default>
<show_in_website> 1</show_in_website>
<show_in_store> 1</show_in_store>
</hello_message>
<!-- ... -->
pero... el combo no tiene datos, no hay problema, tenemos que indicarle el origen de datos:
XML:
<hello_message>
<label> Message</label>
<frontend_type> select</frontend_type>
<!-- adding a source model -->
<source_model> helloworld/words</source_model>
<sort_order> 1</sort_order>
<show_in_default> 1</show_in_default>
<show_in_website> 1</show_in_website>
<show_in_store> 1</show_in_store>
</hello_message>
El elemento source_model define el URI de un Model class que usaremos para meter datos en el combo. Como siempre, este cambio lo metemos en el config.xml (dentro de la sección de models):
XML:
Ubicación: app/code/local/Alanstormdotcom/Helloworld/etc/config.xml
<config>
<!-- ... -->
<global>
<!-- ... -->
<models>
<!-- ... -->
<helloworld>
<class> Alanstormdotcom_Helloworld_Model</class>
</helloworld>
<!-- ... -->
</models>
</global>
</config>
Si recargamos la página nos dará un error, claro, no hemos definido la fuente de nuestro Model class.
CODE:
Warning: include( Alanstormdotcom/Helloworld/Model/Words.php )
Nota: si en el error vemos algo parecido a "Mage/Helloworld/..." significa que no hemos creado bien la sección de models . Revisar el config.xml
Para definir la fuente del Modelo:
PHP:
File : app/code/local/Alanstormdotcom/Helloworld/Model/Words.php
class Alanstormdotcom_Helloworld_Model_Words
{
public function toOptionArray( )
{
array ( 'value' =>
1 ,
'label' =>Mage::
helper ( 'helloworld' ) ->__
( 'Hello' ) ) ,
array ( 'value' =>
2 ,
'label' =>Mage::
helper ( 'helloworld' ) ->__
( 'Goodbye' ) ) ,
array ( 'value' =>
3 ,
'label' =>Mage::
helper ( 'helloworld' ) ->__
( 'Yes' ) ) ,
array ( 'value' =>
4 ,
'label' =>Mage::
helper ( 'helloworld' ) ->__
( 'No' ) ) ,
) ;
}
}
El método devuelve un array con los valores que usaremos posteriormente. Al recargar la página veremos el combo con nuestros datos. Fijaros que hemos usaros el método (__) para las traducciones. Ya que lo hacemos lo hacemos bien, no?
Recogiendo valores
Hemos visto cómo desarrollar formularios para crear valores de configuración. Para obtenerlos desde nuestro código y poder utilizarlos tenemos que usar un método llamado getStoreConfig. Por ejemplo:
PHP:
Mage::getStoreConfig ( 'helloworld_options/messages/hello_message' ) ;
El método getStoreConfig acepta como parámetro la URI:
PHP:
section_name/group_name/field_name
Mage::getStoreConfig ( 'helloworld_options/messages' ) ;
Mage::getStoreConfig ( 'helloworld_options' ) ;
Por útlimo, si quieremos grabar un valor para una tienda en concreto, getStoreConfig acepta un segundo valor, el storeID:
PHP:
Mage::getStoreConfig ( 'helloworld_options' ,1 ) ;
Y para los que no tengáis ganas de estar copiando y pegando, como siempre, os dejamos directamente el código.
Descargar
Compartir:
jorge #
14 de Junio de 2010 a las 21:54