crear un modulo: parte I
Esta forma modular de trabajar nos permite modificar el funcionamiento de nuestra tienda sin tocar el core de la aplicación y así aprovecharnos de sus actualizaciones sin perder lo que hemos hecho.
El primer paso es crear un Packagename, un Namespace: un espacio donde vamos a guardar nuestro código. En general se usa el nombre de la empresa. Realmente da igual el nombre que usamos, lo único es que tiene ser único (vaya redondencia). El mio es OSdave.
Creamos entonces el directorio app/code/local/OSdave/.
En el, creamos una carpeta que se llama como el módulo que estamos creando: ya que esto es un ejemplo, le llamo Helloworld/, pero lo suyo es llamarlo de manera más descriptiva de lo que hace. En esta carpeta creamos 6 más: Block/, controllers/, etc/, Helper/, Model/ y sql/.
8 razones porque no aparecen los productos
Cuando creamos un producto en magento, muchas veces no aparece en el catálogo cuando pensamos que sí deberia aparecer. Esto se debe a la gran capacidad que nos provee magento para gestionar nuestros productos: hay varios atributos que hacen que un producto sea visible en el catálogo o no. Puede ser desesperante averiguar cual es el (o los) que hace(n) que no aparece tal producto.
Para ayudarnos a determinar que es lo que falla, Joe de Mastering Magento ha recopilado 8 (bueno, 8 y media) razones que hacen que los productos sean visibles o no. Aqui van en castellano.
- en la pestaña General, Status tiene que estar a "Habilitado"
- en esta misma pestaña, Visibility tiene que estar "Catálogo, Búsqueda" o "Catálogo"
- pestaña Inventario, aquí empiezan las sutilidades:
- si permitimos los Pedidos de artículos agotados, da igual, podemos dejar 0 en el campo Cantidad
- si no estan permitidos, el número que hay que poner tiene que ser mayor que el número que hemos indicado como "Mínima cantidad permitida en el carrito de compras"
- cabe resaltar que incluso si se ha seleccionado "No" en el desplegable de Manage Stock hay que indicar un stock más alto que la cantidad mínima en el carrito
- todavía en la pestaña Inventario, el campo Disponibilidad en existencia tiene que estar a "En existencia"
- en la pestaña Categorías, el producto tiene que pertenecer a por lo menos una categoría activa
- si hay varios Websites, hay que indicar a cual pertenece el producto. Esto no hace que el producto sea visible o no directamente, pero si no esta indicado problemas podrian ocurrir a la hora de hacer ex/importaciones
- para los productos de tipo "bundle" y "agrupados" aseguraros de que todos los productos que los constituyen son visible, que pasan esta lista.
- indexes y el cache: si todos estos puntos estan correctos, intentar el cache y los indexes
Además de preparar esta lista, Joe ha preparado una extensión que comprueba estos puntos. Despues de comprarla (4.99$) recibimos un fichero zip. Lo descomprimos y subimos los ficheros siguiendo la estructura en que vienen. Flusheamos (vaciamos) los caches, logout-login del admin y ahora cuando editamos un producto vemos una nueva pestaña, la última:
A mi me parece una extensión muy interesante que instalar en las tiendas de nuestros clientes, así seguro que nos ahorramos unas cuantas llamadas de: "lo hago todo bien pero el producto no aparece".
evento change de un desplegable con jQuery en IE
una pequeña nota para quitar un poco el polvo e iniciar una nueva fase en la vida de este blog.
Estas 3 ultimas semanas me lo he pasado pipa reuniendo los pasos del checkout de una tienda OSCommerce en uno solo, a ver si algún dia me animo a preparar una contribución...
Como siempre cuando desarollo, lo hago con firefox y al final abro el putoIE a ver que le parece. El hecho de usar jQuery facilita mucho, muchissimo este proceso.
Me he encontrado con un problema hoy, y es que aparentemente hay un bug (o es que es un feature...) en la versión 1.4.2 de jQuery que hace que putoIE no entiende el evento .change().
Por lo cual, en vez de tener un código que se entiende perfectamente, así:
tengo que hacerlo así:
Vale, se entiende también bastante bien, pero realmente lo que me interesa es cuando se cambia el desplegable, no cuando le clickeo. Además, para debugearlo en putoIE le pongo un alert, pero claro, entonces no me deja seleccionar un valor de la lista ya que al hacer clic me salta el alert y no puedo hacer nada más
Enfín, nada grave, pero como he tenido que buscar esta info varias veces he pensado que estaría bien tenerla a mano, y también que estaba buscando un tema para volver a escribir algo.
slideshow en la home
Viendo esta tienda, he decidido hacerme mi propio slideshow.
En el foro americano he encontrado este hilo donde el trabajo ya estaba casi todo hecho, solo he cambiado la disposición de las divs, colocandolas encima una de otras gracias a la propiedad css z-index, y he añadido una pequeña función para que el slideshow se pare cuando el ratón pasa encima.
Gracias a script.aculo.us (que viene ya instalado con Magento) es realmente muy facil conseguir unos efectos muy chulos.
Entonces, para tener un slideshow en la home, primero vamos a crear un bloque estático: CMS->Bloques Estáticos->Agregar un nuevo bloque. Le damos un nombre y un identificador, lo habilitamos y en el campo Contenido de la pestaña Información general añadimos un poco de JavaScript:
<script type="text/javascript">start_slideshow(1, 3, 3000);
function start_slideshow(start_frame, end_frame, delay) {
id = setTimeout(switch_slides(start_frame,start_frame,end_frame, delay), delay);
}
function switch_slides(frame, start_frame, end_frame, delay) {
return (function() {
Effect.Fade('slide' + frame, { duration: 1.0 });
if (frame == end_frame) { frame = start_frame; } else { frame = frame + 1; }
Effect.Appear('slide' + frame, { duration: 1.0 });
if (delay == 1000) { delay = 3000; }
id = setTimeout(switch_slides(frame, start_frame, end_frame, delay), delay);
})
}
function stop_slideshow() {
clearTimeout(id);
}
</script>
y el contenido html con las divs y sus imagenes linkeadas:
<div id="introhomepage" style="height: 230px; position: relative;" onmouseover="stop_slideshow()" onmouseout="start_slideshow(1, 3, 1000)">
<div id="slide1" class="slide" style="position: absolute; top: 0pt; left: 0pt; display: block; z-index: 3; opacity: 1;"><a href='http://www.yourdomain.com/path/to/webpage1.html'><img border='0' src='{{skin url='path/to/image.jpg'}}' /></a></div>
<div id="slide2" class="slide" style="position: absolute; top: 0pt; left: 0pt; display: none; z-index: 2; opacity: 0;"><a href='http://www.yourdomain.com/path/to/webpage2.html'><img border='0' src='{{skin url='path/to/image.jpg'}}' /></a></div>
<div id="slide3" class="slide"style="position: absolute; top: 0pt; left: 0pt; display: none; z-index: 1; opacity: 0;"><a href='http://www.yourdomain.com/path/to/webpage3.html'><img border='0' src='{{skin url='path/to/image.jpg'}}' /></a></div>
</div>
Ahora solo queda incluir este bloque donde queramos, en este caso la homepage, vamos a editarla: CMS->Gestionar las páginas->HomePage y en el campo Contenido de la pestaña Información general añadimos:
{{block type="cms/block" block_id="el_identificador" template="cms/content.phtml"}} Esta claro que hay que adaptar los enlaces y las rutas a las imagenes (estas imagenes tienen que estar en /skin/frontend/default/tutema/images/).
mi primer modulo
¡Porfin pongo las manos dentro del código! Voy a repasar los pasos para conseguir el ejercicio del capitulo 6 del libro Guide to E-commerce Programming with MAGENTO. Este ejercicio consiste en reemplazar el cuadro de texto para introducir la cantidad que se quiere comprar de un articulo en su ficha por un desplegable con unos valores de tipo (x*1) - (x*2) - (x*3) - (x*4): pensar por ejemplo en cajas de huevos, se puede comprar una o más cajas de 6, por lo cual la cantidad pedida sera siempre un multiplo de 6. Pero no para todos los productos de la tienda (seria demasiado facil), sino solo los que elegimos.
Ademas del libro (que no tiene toda la información y parte de ella no es correcta) me he ayudado del tutorial de Fido para crear un modulo simple, que el sí esta muy bien hecho, completo y correcto.
- Ya sabemos que es mejor no tocar el código original de Magento. Lo que se recomienda es crear un directorio dentro de app/code/local/ que llamamos al nombre de la empresa (por ejemplo). La empresa para quien trabajo se llama amantis por lo cual he creado el directorio app/code/local/Amantis/ (primera letra en mayuscula, el resto en minuscula: es importante). Dentro de esta carpeta almacenaremos todos los modulos que desarollamos para esta empresa. Empezamos directamente con este: voy a trabajr con las cantidades, creo un directorio app/code/local/Amantis/Cantidades/.
Amantis es el namespace y Cantidades es el modulo. - Indicamos a Magento que hay que cargar este modulo, y como lo más probable es que haya más modulos despues, voy a reunirles todos en un fichero: app/etc/modules/Amantis_All.xml. Contiene:
<?xml version="1.0"?> <config> <modules> <Amantis_Cantidades> <active>true</active> <codePool>local</codePool> </Amantis_Cantidades> </modules> </config> - Creo app/code/local/Amantis/Cantidades/etc/config.xml para una configuración minima del modulo. Contiene:
<?xml version="1.0"?> <!-- more at http://www.magentocommerce.com/wiki/custom_module_with_custom_database_table#create_configuration_xml --> <config> <!--turn on our module, required for install support --> <modules> <Amantis_Cantidades> <version>1.0</version> </Amantis_Cantidades> </modules> <global> <blocks> <amantis_cantidades> <class>Amantis_Cantidades_Block</class> </amantis_cantidades> </blocks> </global> </config>Estos 2 pasos son fundamentales para que el modulo se active cuando se carga la pagina pero no tienen mucho misterio. Lo unico importante es respetar el UpperCamelCase. El resto habla por si solo: es la versión 1.0 del modulo, es activo, esta dentro del pool local y contiene ficheros de Block cuyas classes empezaran con Amantis_Cantidades_Block.
:: Next >>