Magento Best Practices

Preview:

DESCRIPTION

Curso de Magento que aborda la administración, el diseño de frontend y el desarrollo de módulos.

Citation preview

Magento Best Practices

Angel Villaashiak@on4u.es

@ashiak

Olmo Gonzálezolmox@on4u.es

@olmox

Mikel Ruizmikel@on4u.es

@mkruiz

Alberto Goyaagoya@on4u.es

@aGoya

www.on4u.es

Why Magento?

Día 1: Magento Admin

Día 2: Magento Design

Día 3: Magento Development

¿Descansos?

©nicmcphee at Flickr

Magento AdminDía 1:

http://www.on4u.es/docs/doc/ManualMagento.pdf

Manual de Magento

Let's go!

Checklist (I)

✔ Instalación

✔ Permisos

✔ GIT

✔ Compilación

✔ Gestión de divisas

✔ Emails transaccionales

✔ Permisos

✔ Magento Connect

✔ Caches e índices

Checklist (II)

✔ Gestionar tiendas.

✔ Configuración [scope]

✔ Conf>Web: urls y usar CDN. Certificados SSL.

✔ Conf>Diseño>Encabezado-> Robots.txt

✔ Conf>Catálogo>SEO

✔ Configuración de divisas, precios (global o website)

✔ Conf->WYSIWYG

✔ Conf->Catálogo (tablas flat)

✔ Buscador y Términos de búsqueda

✔ Inventario

Checklist (III)

✔ Clientes-> Scope, impuestos, asignaciones a grupos

✔ Clientes->Carrito persistente

✔ Ventas->Impuestos, FPT

✔ Checkout->Métodos de envío

✔ Checkout->Métodos de pago

✔ Avanzado->Desarrollador

✔ Estados de pedidos

✔ Conjunto de atributos

✔ Categorías

✔ Poner el CRON de Magento

Recursos útiles

Guía de uso de GIT con Magento

https://www.sonassi.com/knowledge-base/our-magento-git-guide-and-work-flow/

Mejorar buscador

http://magento.stackexchange.com/questions/1137/search-type-like-full-text-or-combined

http://www.magentocommerce.com/magento-connect/catalog-search-refinement-free.html

Robots.txt para Magento

http://turnkeye.com/blog/optimize-robots-txt-for-magento/

Workflow de pedidos

http://go.magento.com/support/kb/entry/name/order-workflow

Cron en Magento

http://www.magentocommerce.com/wiki/1_-_installation_and_configuration/how_to_setup_a_cron_job

Caso práctico Distribuciones Exclusivas de Vinos de La Rioja, S.A (a.k.a. DEVILAR)

está orientada al mercado Europeo, por lo que tendrá 2 tiendas:

España en castellano y Reino Unido en inglés.

Algún producto sólo se puede vender en UK.

La de UK en libras con tasa de cambio fija (1GBP = 1,2349 EUR)

Los clientes con CIF válido entran al grupo de Clientes VIP.

Clientes VIP con precios especiales en algunos producto.

Para el producto Oferton de día, si te gastas más de 120€,

dicho producto tiene un 80% de descuento.

Filtros por: precio, graduación, municipio, añada.

Buscador busca en nombre, descripción y municipio.

El catálogo se muestra con IVA del 21% incluido.

El email de creación de pedido para usuarios registrados y no

registrados es el mismo y pone sólo “PEDIDO REGISTRADO”.

Crear sitemap.xml para es y uk.

Envío gratis para España con pedidos de >100€ y el resto 10€ de gastos.

Optimizar rendimiento para puesta en producción.

Aceptar Condiciones de compra al hacer el pedido y cumplir con EU Cookie.

Magento DesignDía 2:

La vista

MVC?Prácticamente sí, pero no.

CONSECUENCIAS

1. Bloques y plantillas

2. Un bloque Una plantilla→

3. Objeto $this

app/design/frontend/base/default/template/page/1column.phtml

Anidamiento de bloques

Aquí falta algo...1. ¿Cómo le digo qué bloques quiero utilizar?

2. ¿Cómo especifico un bloque hijo?

Layout (XML)

Comprendiendo el Layout XML

- Etiquetas XML

- Añaden/modifican/eliminan relaciones entre bloques

- Relacionan bloques estructurales con bloques de contenido

- Controlar funciones y añadir contenido HTML

- En app/design/frontend/[package]/[theme]/layout

- Un archivo XML de Layout por cada módulo Magento

Handles(manejadores)

- Elementos de primer nivel del nodo <layout>

- Cada uno representa un actualización del layout

- [nombre_modulo][nombre_controller][nombre_accion]

Ejemplocontacs.xml

Elementos del Layout

Reference

- Referenciar un bloque ya definido.

- Debe coincidir con el atributo name del bloque

Block

- Define un nuevo bloque

- Obligatorios los campos name y type

- <block type="page/html" template="example/view.phtml">

Elementos del Layout

Remove

Action

- Define una acción a ejecutar

- Puede ser colocado dentro de reference o block

Update

- Carga un handle dentro de otro. Actualiza un bloque con el

contenido de otro.

Ejemplocustomer.xml

local.xml

HERENCIA

Proceso derenderizado

- Se instancian los bloques.

- Solo los bloques de tipo output son añadidos al response.

- Page.xml.

- Bloque raíz (root)

- Los bloques hijos se renderizan con la llamada getChildHtml()

- Proceso recursivo

Bloques

Tipos de bloques

1. Bloques estructurales

2. Bloques dinámicos

3. Bloques dinámicos con datos personalizados

4. Bloques estáticos

Tipos de bloques

1. Bloques estructurales

2. Bloques dinámicos

3. Bloques dinámicos con datos personalizados

4. Bloques estáticos

Bloques estructurales

- Encapsulan los bloques de contenido organizando

visualmente los bloques.

- Se pueden crear bloques estructurales personalizados

- Todos los bloques hijos de uno estructural se muestran automáticamente

sin tener que usar el método getChildHtml() para cada uno de ellos.

(Ejemplo: newreference.phtml)

Bloques dinámicos (phtml) - Bloques Magento ( categoría, carrito, usuario,...)

- Representan el contenido y las funcionalidades

1. Vía layout XML (Ejemplo: review_form)

2. Desde el CMS

3. Desde la plantilla

Bloques dinámicos personalizados

1. Vía layout XML

- Bloques personalizados

- Creamos un bloque y una plantilla asociada a este

personalizada.

2. Desde el CMS (Ejemplo: bestsellers)

Bloques estáticos (CMS Blocks)

- Se crean desde el admin. CMS Bloques estáticos→

- Útil para que los clientes.

1. Vía layout XML

2. Desde el CMS

3. Desde la plantilla

Tipos de bloque (Layout XML)

1. page/html

2. page/html_head

3. page/html_header

4. page/html_wrapper

5. page/html_breadcrumbs

6. page/html_footer

7. page/template_links

8. page/switch

9. core/messages

10. core/text_list

11. core/proofiler

12. page/html_noticies

¿Y tú que eres?Yo soy explorador de Magento

Rutas en plantilla

Sistema -> Configuración -> Developer -> Depurar

Frontend de Magento

Paquetes y temas

Paquete

1. Colección de temas relacionados.

2. En Magento por defecto es “base”.

Tema

1. Varios por paquete.

2. Determina el contenido visual de nuestra tienda.

3. Solo puede pertenecer a un paquete.

Tema

App/design

Archivos que controlan como se representan las plantillas.

Skin

Archivos que controlan el aspecto visual del tema (css, javascript).

App/design

Layout

Contiene los archivos básicos XML que definen la estructura de bloque para

diferentes páginas.

Template

Archivos que contienen el PHP y el XHTML necesario para la representación

visual.

Locale

Contiene los CSV de traducción organizados por lenguaje.

Tema por defecto

Todos los paquetes tiene el tema por defecto “default”.

Directorios

Creando un nuevo tema

1. /app/design/frontend/new_package/new_theme/

2. /app/design/frontend/new_package/new_theme/layout

3. /app/design/frontend/new_package/new_theme/template

4. /skin/frontend/new_package/new_theme/

5. /skin/frontend/new_package/new_theme/css/

6. /skin/frontend/new_package/new_theme/images/

Archivos1. /app/design/frontend/new_package/new_theme/layout/local.xml

2. /skin/frontend/new_package/new_theme/css/local.css

A practicar(crear nuestro tema)

Admin CMS

Páginas (CMS Pages)

Bloques estáticos (Static blocks)

Aplicaciones (Widgets)

Tareas comunes en Magento

- Añadir/quitar archivos/librerías

- Añadir/quitar enlaces a bloques

En plantilla

- Cambiar parámetros de los bloques

- Diferentes acciones para logueados/no-logueados

- Añadir imágenes

En plantilla

- Diseño personalizable por categoría Navegación por capas : Display settings Is Anchor → → yes

Incluir texto estático o imágenes.

- Navegación por capas Ocultar/Mostrar atributos.

Atributos filtrables con/sin resultados

- Página de producto Layout de la página de producto

Galería de imágenes

En el administrador

Snippets

Url de la página

<?php echo $this->getUrl('mypage'); ?>

Url de la imagen

<?php echo $this->getSkinUrl('images/button.gif'); ?>

Url del producto

<?php echo $this->getProductData()->getProductUrl(); ?>

Nombre del producto

<?php echo $this->htmlEscape($this->getProductData()->getName()); ?>

Mostrar todos los productos de una categoría

$categories = $_product->getCategoryIds();

foreach($categories as $k => $_category_id):

$_category = Mage::getModel('catalog/category')->load($_category_id);

<a href="<?php echo $_category->getUrl() ?>"><?php echo $_category->getName() ?>

<?php endforeach; ?>

Comprobar si un usuario esta logueado

$logged_in = Mage::getSingleton('customer/session')->isLoggedIn();

Cargar producto según su SKU

$_product = Mage::getModel('catalog/product')->loadByAttribute('sku', $product_sku);

Cargar producto según su ID

$_product = Mage::getModel('catalog/product')->load($product_id);

Cargar categoría según su ID

$_category = Mage::getModel('catalog/category')->load($category_id);

Obtener categoría actual

$_category = Mage::getModel('catalog/layer')->getCurrentCategory();

Obtener literal (para traducciones)

$text = $this->__('Content');

La práctica

1- Añadir enlace de Twitter en el apartado “Company” del pie.

2- Crear página “Condiciones de compra” y añadirla en los enlaces de la cabecera “Mi

Cuenta”.

3- Añadir un bloque estructural encima del pie donde aparezca un eslogan

4- Añadir un imagen (Enpresa Digitala) y que sea un enlace que lleve a su web en la

columna de la izquierda de la vista de categoría

5- Añadir una imagen/slider en nuestra “home”.

6- Modificar el valor “nofollow” al Meta tag robots

Recursos útiles

Oficial Magento designer guide

http://www.magentocommerce.com/resources/magento-user-guide

Magento: The right way

http://magentotherightway.com/

Magento Cheat Sheet

http://www.richdynamix.com/mcheat/

Magento DevelopmentDía 3:

¿Herramientas?

Herencia

Local Community Core→ →

Crear un móduloapp/code/local/On4u/Holamundo/etc/config.xml

app/etc/modules/On4u_Holamundo.xml

Registro de Helpers, Bloques y Modelos (I)

app/code/local/On4u/Holamundo/etc/config.xml

Registro de Helpers, Bloques y Modelos (II)

app/code/local/On4u/Holamundo/Helper/Data.php

Lo mismo para:

app/code/local/On4u/Holamundo/Block

app/code/local/On4u/Holamundo/Model

La nomenclatura sigue la convención:

<Vendor namespace>_<Modulename>_<Objecttype>_<Classname>

Y para cargarlos:

Mage::getModel(“holamundo/ejemplo”);

Mage::helper(“holamundo/data”);

Crear página

app/code/local/On4u/Holamundo/etc/config.xml

app/code/local/On4u/Holamundo/controllers/IndexController.php

http://mi-magento.com/holamundo/index/hola/

app/code/local/On4u/Holamundo/etc/config.xml

~/layout/holamundo.xml

~/controllers/IndexController.php

Cargar layout

app/code/local/On4u/Holamundo/etc/config.xml

Traducciones

Creamos el fichero app/locale/xx_XX/On4u_Holamundo.csv con las traducciones:

“Literal”, “Traducción”

Y para utilizarlo:

echo $this­>__(“Literal a traducir”);

app/design/frontend/mitema/default/template/holamundo/newproducts.html

app/design/frontend/mitema/default/layout/holamundo.xml

app/code/local/On4u/Holamundo/Block/Newproducts.php

Bloques

app/code/local/On4u/Holamundo/etc/config.xml

app/code/local/On4u/Holamundo/Model/Catalog/Product.php

Reescribir una clase del core

+350 tablas

2 tipos de entidades (flat y EAV)

Convención de nombres

Algunas tablas

de core

Tablas FLAT

Conectar con BD de Magento

Conectar con otra BD externa

Trabajando con SQL Querys

Trabajando con Colecciones (Mejor opción)

Las entidades flat

La tabla de la base de datos

El objeto Model (lógica negocio)

El objeto Resource Model (conecta con BD p.e. save())

El objeto Resource Collection

Tablas EAV

Tipos de entidades:

catalog_category

catalog_product

creditmemo

customer

customer_address

invoice

order

shipment

Tipos de atributos:

Datetime

Decimal

Int

Varchar

Text

Tablas EAV para productos

Tablas Flat para entidades EAV

Ventajas:

Rendimiento

Desventajas:

Sincronización entre tablas (Magento Index)

Crece el tamaño del a base de datos

app/code/local/On4u/Holamundo/etc/config.xml

Scripts de

instalación(core_resource)

app/code/local/On4u/Holamundo/sql/holamundo_setup/install­0.0.1.php

Crear tablas flat desde el modelo

app/code/local/On4u/Holamundo/etc/config.xml

Crear tablas flat desde el modelo (II)

Crear tablas flat desde el modelo (III)

Crear tablas flat desde el modelo (IV)

Crear tablas flat desde el modelo (V)app/code/local/On4u/Holamundo/Model/Resource/Subscription/Collection.php

app/code/local/On4u/Holamundo/Model/Resource/Subscription.php

app/code/local/On4u/Holamundo/Model/Subscription.php

Crear tablas flat desde el modelo (V)

app/code/local/On4u/Holamundo/controllers/IndexControllers.php

Coleccionesapp/code/local/On4u/Holamundo/controllers/IndexControllers.php

Filtros

­>addAttributeToFilter('entity_id', array ('in' => array(1, 7, 11)))

­>addAttributeToFilter('name', array ('like' => '%Oxford%'))

Mostrar la Query

$productCollection­>load();

Echo $productCollection­>getSelect()­>__toString();

Modificar datos

$productCollection­>setDataToAll('price', 20);  (al hacer save())

Backend

app/code/local/On4u/Holamundo/etc/config.xml

app/code/local/On4u/Holamundo/controllers/Adminhtml/Holamundo/IndexController.php

http://mimagento.com/index.php/admin/holamundo_index

Backend Menu

Backend ACL

Mage::getSingleton('admin/session')­>isAllowed('all')

Configuración del

sistema

Mage::getStoreConfig('<path>')

app/code/local/On4u/Holamundo/controllers/Adminhtml/Holamundo/SubscriptionController.php

Datagrid

app/code/local/On4u/Holamundo/Block/Adminhtml/Subscription.php

Datagrid (II)app/code/local/On4u/Holamundo/Block/Adminhtml/Subscription/Grid.php

Datagrid (III)

Datagrid (IV)

Clientesapp/code/local/On4u/Holamundo/sql/holamundo_setup/upgrade­0.0.2­0.0.3.php

Source models

Eventos (crear)

app/code/local/On4u/Holamundo/controllers/IndexController.php

Eventos (observer)app/code/local/On4u/Holamundo/etc/config.xml

app/code/local/On4u/Holamundo/Model/Observer.php

Eventos (observer)app/code/local/On4u/Holamundo/etc/config.xml

app/code/local/On4u/Holamundo/Model/Observer.php

Cronjobsapp/code/local/On4u/Holamundo/etc/config.xml

app/code/local/On4u/Holamundo/Model/Observer.php

Para qué sirve un API

Interconectar sistemas para que se entiendan entre ellos (internet of things)

Aplicaciones distribuidas.

El servidor ofrece unos servicios y el cliente envía peticiones.

Interfaz abstracta reusable

Marshalling / Unmarshalling

REST vs SOAP

● SOAP– Pros

● Fácil de automatizar (sobre todo Java y cía)

● Wsdl

– Contras● Implementaciones

anti-interoperabilidad● Demasiado verboso

● REST– Pros:

● Ubicuo● Estándar● Caching● Statleeess (escalabilidad)● JSON o XML o lo que sea.

– Contras● Herramientas● Autodocumentación /

Autogeneracion● Verbos limitados

REST vs SOAP

Seguridad

● Oauth● Basic● Tokens (!= sesiones, pero la misma idea)● Por oscuridad (NO USAR)

API+

● Acceso granular (recuperar sólo lo necesario) y filtrado● Tipos bien definidos● “Desnormalizar” (reducir nº de peticiones)● Multiformato● Documentación y buenos errores *● Versionado● Disponibilidad y velocidad *

*Qué bueno es que haya niños Magentos para echarles la culpa.

API REST Magento

● http(s)://magentohost/api/rest● Clientes, productos, inventario, pedidos(lectura)● OAuth1.0a● Métodos: GET, POST, PUT, DELETE● Filtros: page, order, dir, limit, etc.● ACL (admin, customer, guest) + roles +attributes● JSON + XML

Elementos del API REST

● Módulo: Mage_Api2– API SOAP v1 → API SOAP v2 (1.3) != API REST

– No se trata de extenderlo sino de usarlo

● Request Interpreters y response renderers– URL query, json y xml

● Auth Adapters– Oauth

● User Types– Guest, customer, admin

● Route– entity / collection

● Request → Dispatcher → Response

Elementos del API REST

● ACL:– Global y filter

– Deciden qué roles acceden a qué atributos. Se usa también como “filtro” para eliminar campos.

● Validator– Comprueba que los parámetros de entrada sean

correctos.

● Resource– Implementa la lógica de cada recurso

Extendiendo un recurso

● La implementación está en cada módulo– Model/Api2/

● {Resourcename}.php● {Resourcename}/

– Rest.php– Rest/{Admin|Guest|Customer}/

● V{n}.php

– P.ej “CatalogInventory/Model/Api2/Stock”● Item.php● Item/Rest.php● Item/Rest/Admin/V1.php● Item/Validator/Item.php

api2.xml

● El pegamento que une todas las partes● En /etc de cada módulo

– Resources (modelos)

– Atributos y roles (ACL)

– Rutas

– Validators

– Versiones disponibles

Config (api2.xml)

app/code/core/Mage/CatalogInventory/etc/api2.xml

Resource (Stock/Item.php)

app/code/core/Mage/CatalogInventory/Model/Api2/Stock/Item.php

app/code/core/Mage/CatalogInventory/Model/Api2/Stock/Item/Rest.php

GET _retrieve→

POST _create→

PUT _update→

DELETE _delete→

app/code/.../CatalogInventory/Model/Api2/Stock/Item/Rest/Admin/V1.php

Recursos útiles

Guía de uso de GIT con Magento

https://www.sonassi.com/knowledge-base/our-magento-git-guide-and-work-flow/

Scripts para administrar Magento desde consola

https://github.com/classyllama/Wiz

Herramienta para reparar la Base de datos de Magento

http://www.magentocommerce.com/wiki/1_-_installation_and_configuration/db-repair-tool

Trabajar con colecciones

http://www.magentocommerce.com/wiki/1_-_installation_and_configuration/using_collections_in_magento

Caso práctico● Hola Mundo por pantalla

● Hola Mundo en un bloque con traducciones

● Crear bloque de nuevos productos

● Reescribir model de Product para poner CURSO delante del nombre

● Instalador que cree un atributo a producto

● Actualización que cree tabla de suscriptores

● Colección que muestre los productos que tiene una 'A'

● Acceso en menú de backend

● ACL de permisos

● Gestión de configuración

● Actualización que cree atributo a cliente

Gracias ;)

www.on4u.es

Recommended