Professional Documents
Culture Documents
Cambiar Enlaces rpidos de horizontal a vertical.................................................................................................4 Quitar el mensaje de bienvenida de la cabecera..................................................................................................4 Cambiar el texto del campo de Bsqueda...........................................................................................................4 Cambiar Top Links a columna derecha................................................................................................................4 Quitar Quick Access de la Cabecera (header).....................................................................................................5 Aadir una imagen en el lugar que ocupaban los Quick Access..........................................................................6 Poner el formulario de bsqueda en la Barra de navegacin de categoras.........................................................7 Cambiar la posicin de los bloques en la columna derecha (Enlaces, Carrito de compra, Comparar Productos). 7 Eliminar del pie el texto Aydenos a mantener sano a Magento..........................................................................8 Pasar la suscripcin del Boletn al lado derecho y Quitarlo del lado izquierdo en el Dashboard de la Cuenta de usuario................................................................................................................................................................8 ................................................................................................................................................................................................9 Quitar el enlace Mi Lista de Deseos de los Top Links..........................................................................................9 Quitar el enlace Mi Cuenta de los Top Links........................................................................................................9 Cmo incluir enlace a formulario de Registro en el bloque Top Links.................................................................10 Como incluir un botn de registro en el formulario mini.login.phtml....................................................................10 Cambiar de Derecha a Izquierda el carrito de compra........................................................................................11 Cambiar de Derecha a Izquierda el bloque de comparacin de productos.........................................................11 Crear un bloque de contenido con los Top Links................................................................................................12 Productos Configurables...................................................................................................................................14 Extensin imprescindible...................................................................................................................................14 Cmo quitar la doble seleccin de atributo en productos configurables.............................................................14 Traducir la etiqueta Price from.........................................................................................................................16 Solucionando el problema con el cdigo HTML en el precio en informacin adicional........................................16 Solucionando problema. El precio en la caja de aadir al carrito cuando se selecciona el atributo no cambia.. .17 Cambiar posicin del smbolo de la moneda......................................................................................................18 Problema Panel de Administracin Currency USD not found...........................................................................18 Hacer que las imgenes cambien ms rpido en SCP......................................................................................18 Implementando los Impuesto.............................................................................................................................19 Cmo ordenar el orden de aparicin de las Categoras.....................................................................................19 Cmo ordenar el orden de aparacin de los productos......................................................................................20 Cmo ordenar el orden de aparicin de los atributos en los productos configurables.........................................20 Establecer el nmero de niveles de categoras que se muestran en el men de navegacin.............................20
Modificando Magento (Ver. 1.0 octubre 2010) 1 / 61
Mostrar las categoras listadas en una pgina...................................................................................................20 Modificacin en el listado de subcategoras. Mostrando a dos columnas...........................................................43 Eliminar el filtro de Categoras en Comprar Por (Shop By)................................................................................44 Eliminar la opcin de Ordenar por en la vista de listado de productos................................................................46 Eliminar el Bloque Comparar Productos............................................................................................................46 Cmo modificar las plantillas de correo.............................................................................................................46 Quitar suscripcin a las Newsletter....................................................................................................................47 Cambiar de Posicin el Bloque Productos Vistos Recientemente......................................................................47 Colocando Banners en Magento........................................................................................................................48 Creando Enlaces a Archivos PDF en pginas html............................................................................................49 Incrementando la seguridad de la carpeta que contiene los PDF.......................................................................49 Traducir el valor del atributo Gender..................................................................................................................50 Traducir la etiqueta Availability: en la pgina de producto..................................................................................50 Habilitando el pago por transferencia y cambiando los textos............................................................................50 Resolviendo Problema en el Progreso de Compra: Card Verification Please verify the card with the issuer bank ..........................................................................................................................................................................51 Eliminando del Panel de Control de Mi Cuenta los enlaces Billing Agreements y Recurring Profiles..................52 (Pendiente finalizar) Extensin Auguria Sponsorship.........................................................................................52 El mdulo se compone de:................................................................................................................................52 Sobre la interfaz de administracin....................................................................................................................53 (Pendiente) Como crear un nuevo Banner lateral..............................................................................................54 Cambiando la fisonoma del Panel de Control del Cliente..................................................................................54 Traduciendo There are X items in your cart de carrito de compra de la columna.............................................56 Implementando el mdulo de pago Servired......................................................................................................57 Quitar el Callout del perrito..............................................................................................................................59 Incluir un texto en el formulario de Bsqueda Avanzada....................................................................................59 Borrando y Reiniciando Pedidos, Facturas, etc..................................................................................................60 Hacer convivir el Envo Gratis con la Tarifa Plana de envo................................................................................62 Configurando el mtodo de envo Table Rate....................................................................................................63 Una curiosidad: Ajustando el reloj en Centos mediante comando......................................................................64 Incluir enlaces en el pie de pgina.....................................................................................................................65 Feed RSS para el total del Catlogo..................................................................................................................65 Extensin: aheadWorks Blog Extension.............................................................................................................66 Corrigiendo un bug de la versin 1.0.21............................................................................................................66 Dando formato al Blog.......................................................................................................................................66
Modificando Magento (Ver. 1.0 octubre 2010) 2 / 61
Usando las Reglas de Promocin......................................................................................................................67 Migrando Magento de un Servidor a otro...........................................................................................................67 Actualizar Magento............................................................................................................................................68 Mostrar las categoras listadas en una pgina Modificacin despus de actualizar a Magento 1.5.................69
3 / 61
Modificando Magento
Todos estos cambios se realizan sobre la plantilla Default de Magento 1.4.1 Versin 1.0 del Documento (octubre de 2010) Modificado por actualizacin de Magento en febrero de 2011.
</block> Por si acaso: Fmula para cambiar posicin encontrada http://www.magentocommerce.com/boards/viewthread/19748/ <?=$this->getLayout()->getBlock('top.links')->toHtml()?> en el enlace:
Eliminamos las lneas que hacen referencia a la divisin quick access, que son esta: <div class="quick-access"> <?php echo $this->getChildHtml('topSearch') ?>
<?php echo $this->getChildHtml('topLinks') ?
<?php echo $this->getChildHtml('store_language') ?> </div> con lo que el cdigo nos quedara del siguiente modo: <div class="header"> <?php if ($this->getIsHomePage()):?> <h1 class="logo"><strong><?php echo $this->getLogoAlt() ?></strong><a href="<?php echo $this->getUrl('') ?>" title="<?php echo $this>getLogoAlt() ?>" class="logo"><img src="<?php echo $this->getLogoSrc() ?>" alt="<?php echo $this->getLogoAlt() ?>" /></a></h1> <?php else:?> <a href="<?php echo $this->getUrl('') ?>" title="<?php echo $this>getLogoAlt() ?>" class="logo"><strong><?php echo $this->getLogoAlt() ? ></strong><img src="<?php echo $this->getLogoSrc() ?>" alt="<?php echo $this>getLogoAlt() ?>" /></a> <?php endif?> <?php echo $this->getChildHtml('topContainer'); ?> </div>
5 / 61
?>"
Bien la imagen incluida se llama en el ejemplo cabecera.gif, y adems le hemos asignado un estilo de la hoja de estilo que se llama logoright. De este modo tambin podremos controlar determinados aspectos sobre como se muestra la imagen en la misma hoja de estilos. En el ejemplo el cdigo lo hemos incluido en la plantilla Default en la seccin HEADER, justo entre el estilo .header h1.logo y el estilo .header .quick-access. La lnea que hemos incluido es tal y como sigue: .header .logoright { float:right; margin:40px 0 3px 3px; } Con lo que en el contexto el cdigo de este archivo queda como sigue <div class="header-container"> <div class="header"> <?php if ($this->getIsHomePage()):?> <h1 class="logo"><strong><?php echo $this->getLogoAlt() ?></strong><a href="<?php echo $this->getUrl('') ?>" title="<?php echo $this>getLogoAlt() ?>" class="logo"><img src="<?php echo $this->getLogoSrc() ?>" alt="<?php echo $this->getLogoAlt() ?>" /></a></h1> <?php else:?> <a href="<?php echo $this->getUrl('') ?>" title="<?php echo $this>getLogoAlt() ?>" class="logo"><strong><?php echo $this->getLogoAlt() ? ></strong><img src="<?php echo $this->getLogoSrc() ?>" alt="<?php echo $this>getLogoAlt() ?>" /></a> <?php endif?> <div class="logoright"> <img src="<?php echo $this->getSkinUrl('images/cabecera.gif') ?>" alt="Alimentos de calidad" /> </div> <?php echo $this->getChildHtml('topContainer'); ?> </div> </div> <?php echo $this->getChildHtml('topMenu') ?>
</ul> </div> Si nos fijamos en la lnea de cdigo introducida le hemos asignado a la etiqueta <li> una nueva clase que tendremos que crear dentro de la seccin de Navigation de la hoja de estilos. Este nuevo estilo que agregamos nos centrar verticalmente el formulario de bsqueda y lo alinear a la derecha.
#nav .mini-search {float:right; margin:0 auto; padding:3px 0 0 0; }
Fijmonos tambin dnde hemos ubicado esta lnea: .nav-container { border-bottom:3px solid #866b07; background:#d7a900 url(../images/bkg_nav0.jpg) 50% 0 repeat-y; } #nav { width:918px; margin:0 auto; padding:0 16px; font-size:13px; } #nav .mini-search {float:right; margin:0 auto; padding:3px 0 0 0; } /* ALL Levels */ /* Style consistent throughout all nav levels */ Ahora vamos a perfeccionar nuestro formulario de bsqueda y elimnaremos la etiqueta (label) que adems aparece en ingls. Iremos al archivo: /app/design/frontend/default/mi_tema/template/catalogsearch/form.mini.pahtml y buscamos la siguiente lnea:
<label for="search"><?php echo $this->__('Search:') ?></label>
La comentamos y listo:
<!-- <label for="search"><?php echo $this->__('Search:') ?></label> -->
Cambiar la posicin de los bloques en la columna derecha (Enlaces, Carrito de compra, Comparar Productos)
Lo haremos todo desde los archivos de layuot (xml). Primero, en el archivo page.xml debemos aadir lo siguiente a la lnea que incluimos previamente para colocar los enlces en esta columna: <block type="page/template_links" before="-" name="top.links" as="topLinks"/> La instruccin before=- fuerza a que este bloque se coloque en primera posicin en la columna. No obstante si guardamos y actualizamos nuestra pgina nos damos cuenta de que no vara el orden. Hay que tocar un par de archivos ms. Abrimos el archivo checkout.xml y buscamos el siguiente cdigo: <reference name="right">
<block type="checkout/cart_sidebar" name="cart_sidebar" template="checkout/cart/sidebar.phtml" before="-">
Nos fijamos en la instruccin before=-, que tambin fuerza a que el carrito de compra se posicione el primero, y adems tendr prioridad por tratarse de un mdulo que dispone de su propio layout (o eso creo), bien lo cambiamos para que el carrito quede por encima del modulo de comparacin de productos, por lo que el cdigo nos queda: <reference name="right">
<block type="checkout/cart_sidebar" name="cart_sidebar" template="checkout/cart/sidebar.phtml" before="catalog.compare.sidebar">
Bien pues aqu vemos que el comparar productos tiene la instruccin before, con lo que entra en contradiccin con la modificacin que hicimos en el archivo checkout.xml, simplemente cambiamos la instruccin por after... y listo.
Modificando Magento (Ver. 1.0 octubre 2010) 7 / 61
Pasar la suscripcin del Boletn al lado derecho y Quitarlo del lado izquierdo en el Dashboard de la Cuenta de usuario
Con lo que haremos a continuacin pasaremos el bloque de suscripcin a boletines (Newletters) a la columna derecha, evidentemente aparecer cuando la columna derecha aparezca. De este modo, por ejemplo, al pasarlo a la columna derecha, las newletters nos desaparecern de la pgina de inicio de la cuenta de usuario puesto que este diseo est preparado para dos lumnas y una a la izquierda. Para hacer esto procederemos del siguiente modo: Editamos el archivo /app/design/frontend/default/mitema/layout/newsletter.xml y buscamos las siguientes lneas: <default> <!-- Mage_Newsletter -->
<reference name="left"> <block type="newsletter/subscribe" after="_" name="right.newsletter" template="newsletter/subscribe.phtml"/>
</reference>
</default>
Donde dice left ponemos right. Con este simple cambio hemos hecho todo lo dicho.
<!-- Mage_Customer --> <reference name="top.links"> <!--<action method="addLink" translate="label title" module="customer"><label>My Account</label><url helper="customer/getAccountUrl"/><title>My Account</title><prepare/><urlParams/><position>10</position></action>--> </reference>
</default>
Y aadimos la siguiente lnea justo en la ubicacin que se indica, la lnea est en negrita: <reference name="top.links"> <action method="addLink" translate="label title" module="customer"><label>Log In</label><url helper="customer/getLoginUrl"/><title>Log In</title><prepare/><urlParams/><position>100</position></action> <action method="addLink" translate="label title" module="customer"><label>Register</label><url helper="customer/getRegisterUrl"/><title>Register</title><prepare/><urlParams /><position>20</position></action> </reference>
el
fichero
<!-Load this update on every page when customer is logged out -->
Bien, si queremos publicarlo (sobre todo para ver como queda la inclusin de un nuevo botn en este bloque), simplmente descomentamos el cdigo. Para incluir el botn tenemos que editar el fichero de plantilla correspondiente a este mini formulario: /app/design/frontend/default/mi_tema/template/customer/form Y justo despues de la etiqueta que cierra el formulario (</form) y antes de la que etiqueta con la que finaliza el fichero (</div>), incluimos el siguiente cdigo: <div class="actions"> <button class="button" onclick="location.href='/customer/account/create'"><span><span><?php echo $this->__('Register') ?></span></span></button>
</div>
Ahora solo tenemos que ajustar los estilos que le estamos aplicando al botn.
<block type="checkout/cart_sidebar" name="cart_sidebar" template="checkout/cart/sidebar.phtml" before="catalog.compare.sidebar"> <action method="addItemRender"><type>simple</type><block>checkout/cart_item_renderer< /block><template>checkout/cart/sidebar/default.phtml</template></action> <action method="addItemRender"><type>grouped</type><block>checkout/cart_item_renderer _grouped</block><template>checkout/cart/sidebar/default.phtml</template></act ion> <action method="addItemRender"><type>configurable</type><block>checkout/cart_item_ren derer_configurable</block><template>checkout/cart/sidebar/default.phtml</temp late></action> </block> </reference> Cambiamos right por left.
<reference name="right"> <block type="catalog/product_compare_sidebar" after="cart_sidebar" name="catalog.compare.sidebar" template="catalog/product/compare/sidebar.phtml"/> <block template="callouts/right_col.phtml"> type="core/template" name="right.permanent.callout" <action method="setImgSrc"><src>images/media/col_right_callout.jpg</src></action> <action method="setImgAlt" translate="alt" module="catalog"><alt>Keep your eyes open for our special Back to School items and save A LOT!</alt></action> </block> </reference>
Bien, cortamos esta lnea (en negrita) y la ubicamos en el bloque izquierda, justo encima de este bloque, quedara as: <reference name="left"> <block type="catalog/product_compare_sidebar" after="cart_sidebar" name="catalog.compare.sidebar" template="catalog/product/compare/sidebar.phtml"/> <block type="core/template" name="left.permanent.callout" template="callouts/left_col.phtml"> <action method="setImgSrc"><src>images/media/col_left_callout.jpg</src></action> <action method="setImgAlt" translate="alt" module="catalog"><alt>Our customer service is available 24/7. Call us at (555) 555-0123.</alt></action> <action method="setLinkUrl"><url>checkout/cart</url></action> </block>
</div> <div class="block-content-per"> <ul class=""block-content-per li""<?php if($this->getName()): ?> id="<?php echo $this->getName() ?>"<?php endif;?>> <?php foreach($_links as $_link): ?> <li<?php if($_link->getIsFirst()||$_link->getIsLast()): ?> class="<? php if($_link->getIsFirst()): ?>first<?php endif; ?><?php if($_link>getIsLast()): ?> last<?php endif; ?>"<?php endif; ?> <?php echo $_link>getLiParams() ?>><?php echo $_link->getBeforeText() ?><a href="<?php echo $_link->getUrl() ?>" title="<?php echo $_link->getTitle() ?>" <?php echo $_link->getAParams() ?>><?php echo $_link->getLabel() ?></a><?php echo $_link->getAfterText() ?></li> <?php endforeach; ?> </ul> </div> </div> <?php endif; ?> Nos fijamos en el archivo y observamos los siguiente: 1.Hemos incluido un div en el que indicamos que la clase de estilo a aplicar es block block-account-per. Es un estilo que deberemos aadir a la hoja de estilos, y que contendrs el resto de estilos declarados: block-title-per, block-content-per y block-content-per li 2.Hemos incluido un ttulo de forma manual. Ojo con esto puesto que si tenemos la web en varios idiomas hacerlo as no nos sirve, puesto que tendramos que en lugar de incluir el ttulo como quien dice a pelo, tendramos que declarar la variable correspondiente y hacerla traducible. No me preguntes cmo, an no lo se. 3.Por ltimo cerramos los nuevos divs que hemos creado. Segundo paso: vamos a referenciar nuestro bloque desde el archivo page.xml del layout. Pero fijaos como los hacemos porque me volv loco hasta dar con la clave:
<block type="page/template_links" template="page/template/links2.phtml"/> before="-" name="top.links" as="topLinks"
Lo nico que cambiamos respecto a la lnea inicial es la ruta del archivo de la plantilla, el resto es igual. Es decir en block type, pese a que referencia la ruta, no la cambiamos la dejamos como incialmente, tampoco cambiamos el nombre (name) ni la forma de referenciarlo (as), slo la ruta y el archivo al que apunta la referencia. Esta lnea, en mi caso, la he incluido en el bloque derecho por lo que su ubicacin es como sigue: <block type="core/text_list" name="right" as="right" translate="label"> <label>Right Column</label> <!-- <block type="page/template_links" before="-" name="top.links" as="topLinks"/>--> <block type="page/template_links" before="-" name="top.links" as="topLinks" template="page/template/links2.phtml"/> </block> Hay que observar que la lnea comentada es precisamente la original, que previamente se encontraba dentro de la cabecera pero que yo la cambi al lboque derecho anteriormente. Tercer paso: por ltimo, debemos crear los estilos que hemos asignado a links2.phtml. Yo me he limitado a copiar el estilo de la seccin Block: Account, pegndolo como una nueva seccin justo debajo de la orginal, y posteriormente renombrndolo:
/* Block: Account Personalizado */ .block-account-per { border-color:#bbb; } .block-account-per .block-title-per { background:#fc9d36 url(../images/bkg_blocktitle-account.gif) 0 100% repeat-x; border:0; padding:3px 10px; } .block-account-per .block-title-per strong { font-size:12px; color:#fff; } .block-account-per .block-content-per { background:#fbfaf6; padding:7px 10px 7px; } .block-account-per .block-content-per li a { display:block; border-bottom:1px solid #ddd; padding:3px 0; color:#5f5d5c; text-decoration:none !important; }
Modificando Magento (Ver. 1.0 octubre 2010) 12 / 61
.block-account-per .block-content-per .block-account-per .block-content-per .block-account-per .block-content-per padding:3px 0; color:#ea7900; } .block-account-per .block-content-per
li a:hover { color:#ea7900; } li.last a { border-bottom:0; } li.current { border-bottom:1px solid #ddd; li.current.last { border-bottom:0; }
Y eso es todo. Cunto trabajo me cost, cunto tiempo, para algo que as visto parece muy simple.
>getAllowAttributes()); ?> <?php if ($_product->isSaleable() && count($_attributes)):?> <dl> <?php foreach($_attributes as $_attribute): ?> <dt><label><?php echo $_attribute->getLabel() ?><span class="required"> *</span></label></dt> <dd<?php if ($_attribute->decoratedIsLast){?> class="last"<?php }?>> <select name="super_attribute[<?php echo $_attribute>getAttributeId() ?>]" id="attribute<?php echo $_attribute>getAttributeId() ?>" class="required-entry super-attribute-select"> <option><?php echo $this->__('Choose an Option...') ?></option> </select> </dd> <?php endforeach; ?> </dl> <script type="text/javascript"> var spConfig = new Product.Config(<?php echo $this->getJsonConfig() ?>); </script>
<?php endif;?>
Pues borramos o comentamos las siguientes lneas con lo que el archivo no queda as (en el caso de borrado): <?php /** * Magento * * NOTICE OF LICENSE * * This source file is subject to the Academic Free License (AFL 3.0) * that is bundled with this package in the file LICENSE_AFL.txt. * It is also available through the world-wide-web at this URL: * http://opensource.org/licenses/afl-3.0.php * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@magentocommerce.com so we can send you a copy immediately. * * DISCLAIMER * * Do not edit or add to this file if you wish to upgrade Magento to newer * versions in the future. If you wish to customize Magento for your * needs please refer to http://www.magentocommerce.com for more information. * * @category design * @package base_default * @copyright Copyright (c) 2009 Irubin Consulting Inc. DBA Varien (http://www.varien.com) * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> <?php $_product = $this->getProduct(); $_attributes = Mage::helper('core')->decorateArray($this>getAllowAttributes()); ?> <?php if ($_product->isSaleable() && count($_attributes)):?> <script type="text/javascript"> var spConfig = new Product.Config(<?php echo $this->getJsonConfig() ?>); </script>
Modificando Magento (Ver. 1.0 octubre 2010) 14 / 61
<?php endif;?>
Por ejemplo.
bug
here:
Solucionando problema. El precio en la caja de aadir al carrito cuando se selecciona el atributo no cambia.
La respuesta me la da San Matt Dean, en un correo electrnico cuya primera parte dice: So did you try changing price_clone.phtml so that it uses $this->getPrice($_product, false) instead of $this->getPrice($_product, false, '_clone')
16 / 61
->Configuracin). 1.Cofiguracin General -> General. Aqu debemos establecer el pas por defecto de la tienda y los dems parmetros que nos solicitan sobre opciones locales y paises en los que se habilita la venta. 2.Configuracin General ->Ventas -> Impuestos. Aqu estableceremos todas las opciones generales sobre la aplicacin de impuestos, incluyendo si incluiremos los precios con IVA, si se mostrarn con IVA o sin IVA, etc. Esto ltimo es interesante saberlo puesto que nos permitir meter los precios de los artculos incluso antes de establecer las relgas de impuestos, ya que los podremos meter con IVA o si l y en la opcin de configuracin le diremos a Magento si lo hemos incluido con o sin IVA.
18 / 61
Ir a General Information y elegir una imagen para la categora en Entonces clikear en la categora madre que tiene subcategorias, ir a la solapa Display Settings. Llenar los campos de la siguiente manera: Display Mode: Static Block Only CMS Block: Sub Category Listing Is Anchor: Yes Contenido de los ficheros: Contenido del archivo Category.php (ocupa 20 pginas)
<?php
/** * Magento * * NOTICE OF LICENSE * * This source file is subject to the Open Software License (OSL 3.0)
Modificando Magento (Ver. 1.0 octubre 2010) 19 / 61
* that is bundled with this package in the file LICENSE.txt. * It is also available through the world-wide-web at this URL: * http://opensource.org/licenses/osl-3.0.php * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@magentocommerce.com so we can send you a copy immediately. * * DISCLAIMER * * Do not edit or add to this file if you wish to upgrade Magento to newer * versions in the future. If you wish to customize Magento for your * needs please refer to http://www.magentocommerce.com for more information. * * @category Mage * @package Mage_Catalog * @copyright Copyright (c) 2009 Irubin Consulting Inc. DBA Varien (http://www.varien.com) * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) */ /** * Catalog category model * * @category Mage * @package Mage_Catalog * @author Magento Core Team <core@magentocommerce.com> */ class Mage_Catalog_Model_Resource_Eav_Mysql4_Category extends Mage_Catalog_Model_Resource_Eav_Mysql4_Abstract { /** * Category tree object * * @var Varien_Data_Tree_Db */ protected $_tree; /** * Catalog products table name * * @var string */ protected $_categoryProductTable; /** * Id of 'is_active' category attribute * * @var int */ protected $_isActiveAttributeId = null; /** * Store id * * @var int */ protected $_storeId = null; /** * Class constructor
Modificando Magento (Ver. 1.0 octubre 2010) 20 / 61
*/ public function __construct() { $resource = Mage::getSingleton('core/resource'); $this->setType('catalog_category') ->setConnection( $resource->getConnection('catalog_read'), $resource->getConnection('catalog_write') ); $this->_categoryProductTable = $this>getTable('catalog/category_product'); } /** * Set store Id * * @param integer $storeId * @return Mage_Catalog_Model_Resource_Eav_Mysql4_Category */ public function setStoreId($storeId) { $this->_storeId = $storeId; return $this; } /** * Return store id * * @return integer */ public function getStoreId() { if (is_null($this->_storeId)) { return Mage::app()->getStore()->getId(); } return $this->_storeId; } /** * Retrieve category tree object * * @return Varien_Data_Tree_Db */ protected function _getTree() { if (!$this->_tree) { $this->_tree = Mage::getResourceModel('catalog/category_tree') ->load(); } return $this->_tree; } /** * Process category data before delete * update children count for parent category * delete child categories * * @param Varien_Object $object * @return Mage_Catalog_Model_Resource_Eav_Mysql4_Category */ protected function _beforeDelete(Varien_Object $object)
Modificando Magento (Ver. 1.0 octubre 2010) 21 / 61
{ parent::_beforeDelete($object); /** * Update children count for all parent categories */ $parentIds = $object->getParentIds(); $childDecrease = $object->getChildrenCount() + 1; // +1 is itself $this->_getWriteAdapter()->update( $this->getEntityTable(), array('children_count'=>new Zend_Db_Expr('`children_count`-'. $childDecrease)), $this->_getWriteAdapter()->quoteInto('entity_id IN(?)', $parentIds) ); /** * Recursion use a lot of memmory, that why we run one request for delete children */ /*if ($child = $this->_getTree()->getNodeById($object->getId())) { $children = $child->getChildren(); foreach ($children as $child) { $childObject = Mage::getModel('catalog/category')>load($child->getId())->delete(); } }*/ $select = $this->_getWriteAdapter()->select() ->from($this->getEntityTable(), array('entity_id')) ->where($this->_getWriteAdapter()->quoteInto('`path` LIKE ?', $object->getPath().'/%')); $childrenIds = $this->_getWriteAdapter()->fetchCol($select); if (!empty($childrenIds)) { $this->_getWriteAdapter()->delete( $this->getEntityTable(), $this->_getWriteAdapter()->quoteInto('entity_id IN (?)', $childrenIds) ); } /** * Add deleted children ids to object * This data can be used in after delete event */ $object->setDeletedChildrenIds($childrenIds); return $this; } /** * Process category data before saving * prepare path and increment children count for parent categories * * @param Varien_Object $object * @return Mage_Catalog_Model_Resource_Eav_Mysql4_Category */ protected function _beforeSave(Varien_Object $object) { parent::_beforeSave($object);
Modificando Magento (Ver. 1.0 octubre 2010) 22 / 61
if (!$object->getId()) { $object->setPosition($this->_getMaxPosition($object->getPath()) + 1); $path = explode('/', $object->getPath()); $level = count($path); $object->setLevel($level); if ($level) { $object->setParentId($path[$level - 1]); } $object->setPath($object->getPath() . '/'); $toUpdateChild = explode('/',$object->getPath()); $this->_getWriteAdapter()->update( $this->getEntityTable(), array('children_count'=>new Zend_Db_Expr('`children_count`+1')), $this->_getWriteAdapter()->quoteInto('entity_id IN(?)', $toUpdateChild) ); } return $this;
/** * Process category data after save category object * save related products ids and update path value * * @param Varien_Object $object * @return Mage_Catalog_Model_Resource_Eav_Mysql4_Category */ protected function _afterSave(Varien_Object $object) { /** * Add identifier for new category */ if (substr($object->getPath(), -1) == '/') { $object->setPath($object->getPath() . $object->getId()); $this->_savePath($object); } $this->_saveCategoryProducts($object); return parent::_afterSave($object); } /** * Update path field * * @param Mage_Catalog_Model_Category $object * @return Mage_Catalog_Model_Resource_Eav_Mysql4_Category */ protected function _savePath($object) { if ($object->getId()) { $this->_getWriteAdapter()->update( $this->getEntityTable(), array('path'=>$object->getPath()), $this->_getWriteAdapter()->quoteInto('entity_id=?', $object>getId())
Modificando Magento (Ver. 1.0 octubre 2010) 23 / 61
); } return $this; } protected function _getMaxPosition($path) { $select = $this->getReadConnection()->select(); $select->from($this->getTable('catalog/category'), 'MAX(position)'); $select->where('path ?', new Zend_Db_Expr("regexp '{$path}/[0-9]+\ $'")); $result = 0; try { $result = (int) $this->getReadConnection()->fetchOne($select); } catch (Exception $e) { } return $result; } /** * Save category products * * @param Mage_Catalog_Model_Category $category * @return Mage_Catalog_Model_Resource_Eav_Mysql4_Category */ protected function _saveCategoryProducts($category) { $category->setIsChangedProductList(false); /** * new category-product relationships */ $products = $category->getPostedProducts(); /** * Example re-save category */ if (is_null($products)) { return $this; } /** * old category-product relationships */ $oldProducts = $category->getProductsPosition(); $insert = array_diff_key($products, $oldProducts); $delete = array_diff_key($oldProducts, $products); /** * Find product ids which are presented in both arrays */ $update = array_intersect_key($products, $oldProducts); /** * Use for update just products with changed position */ $update = array_diff_assoc($update, $oldProducts); $productTable = $this->getTable('catalog/product'); $productUpdateSql = sprintf('UPDATE `%s` AS `e` SET `category_ids`=(SELECT
Modificando Magento (Ver. 1.0 octubre 2010) 24 / 61
GROUP_CONCAT(`category_id`) FROM `%s` AS `cp` WHERE `cp`.`product_id`=`e`.`entity_id`) WHERE `e`.`entity_id` IN(?)', $productTable, $this>_categoryProductTable); /** * Delete products from category * */ if (!empty($delete)) { $deleteIds = array_keys($delete); $this->_getWriteAdapter()->delete($this->_categoryProductTable, $this->_getWriteAdapter()->quoteInto('product_id in(?)', $deleteIds) . $this->_getWriteAdapter()->quoteInto(' AND category_id=?', $category->getId()) ); $sql = $this->_getWriteAdapter()->quoteInto($productUpdateSql, $deleteIds); } /** * Add products to category * */ if (!empty($insert)) { $insertSql = array(); foreach ($insert as $k => $v) { $insertSql[] = '('.(int)$category->getId().','.(int)$k.','. (int)$v.')'; } $sql = sprintf( 'INSERT INTO `%s` (`category_id`,`product_id`,`position`) VALUES%s', $this->_categoryProductTable, join(',', $insertSql) ); $this->_getWriteAdapter()->query($sql); $insertIds = array_keys($insert); $sql = $this->_getWriteAdapter()->quoteInto($productUpdateSql, $insertIds); } /** * Update product positions in category * */ if (!empty($update)) { foreach ($update as $k => $v) { $cond = array( $this->_getWriteAdapter()->quoteInto('category_id=?', (int)$category->getId()), $this->_getWriteAdapter()->quoteInto('product_id=?', (int)$k) ); $where = join(' AND ', $cond); $bind = array(
Modificando Magento (Ver. 1.0 octubre 2010) 25 / 61
$this->_getWriteAdapter()->query($sql);
$this->_getWriteAdapter()->query($sql);
'position' => (int)$v ); $this->_getWriteAdapter()->update($this>_categoryProductTable, $bind, $where); } } if (!empty($insert) || !empty($delete)) { $productIds = array_unique(array_merge(array_keys($insert), array_keys($delete))); Mage::dispatchEvent('catalog_category_change_products', array( 'category' => $category, 'product_ids' => $productIds )); } if (!empty($insert) || !empty($update) || !empty($delete)) { $category->setIsChangedProductList(true); $categoryIds = explode('/', $category->getPath()); $this->refreshProductIndex($categoryIds); } return $this; } /** * Get store identifiers where category is presented * * @param Mage_Catalog_Model_Category $category * @return array */ public function getStoreIds($category) { if (!$category->getId()) { return array(); } $nodePath = $this->_getTree() ->getNodeById($category->getId()) ->getPath(); $nodes = array(); foreach ($nodePath as $node) { $nodes[] = $node->getId(); } $stores = array(); $storeCollection = Mage::getModel('core/store')->getCollection()>loadByCategoryIds($nodes); foreach ($storeCollection as $store) { $stores[$store->getId()] = $store->getId(); } $entityStoreId = $category->getStoreId(); if (!in_array($entityStoreId, $stores)) { array_unshift($stores, $entityStoreId); } if (!in_array(0, $stores)) { array_unshift($stores, 0); } return $stores;
Modificando Magento (Ver. 1.0 octubre 2010) 26 / 61
} /** * Get positions of associated to category products * * @param Mage_Catalog_Model_Category $category * @return array */ public function getProductsPosition($category) { $select = $this->_getWriteAdapter()->select() ->from($this->_categoryProductTable, array('product_id', 'position')) ->where('category_id=?', $category->getId()); $positions = $this->_getWriteAdapter()->fetchPairs($select); return $positions; } /** * Get chlden categories count * * @param int $categoryId * @return int */ public function getChildrenCount($categoryId) { $select = $this->_getReadAdapter()->select() ->from($this->getEntityTable(), 'children_count') ->where('entity_id=?', $categoryId); $child = $this->_getReadAdapter()->fetchOne($select); return $child; } /** * Move category to another parent * * @param int $categoryId * @param int $newParentId * @return Mage_Catalog_Model_Resource_Eav_Mysql4_Category */ public function move($categoryId, $newParentId) { $category = Mage::getModel('catalog/category')->load($categoryId); $oldParent = $category->getParentCategory(); $newParent = Mage::getModel('catalog/category')->load($newParentId); $childrenCount = $this->getChildrenCount($category->getId()) + 1; // update children count of new parents $parentIds = explode('/', $newParent->getPath()); $this->_getWriteAdapter()->update( $this->getEntityTable(), array('children_count' => new Zend_Db_Expr("`children_count` + {$childrenCount}")), $this->_getWriteAdapter()->quoteInto('entity_id IN (?)', $parentIds) ); // update children count of old parents
Modificando Magento (Ver. 1.0 octubre 2010) 27 / 61
$parentIds = explode('/', $oldParent->getPath()); $this->_getWriteAdapter()->update( $this->getEntityTable(), array('children_count' => new Zend_Db_Expr("`children_count` {$childrenCount}")), $this->_getWriteAdapter()->quoteInto('entity_id IN (?)', $parentIds) ); // update parent id $this->_getWriteAdapter()->query("UPDATE {$this->getEntityTable()} SET parent_id = {$newParent->getId()} WHERE entity_id = {$categoryId}"); return $this; } /** * Check if category id exist * * @param int $id * @return bool */ public function checkId($id) { $select = $this->_getReadAdapter()->select() ->from($this->getEntityTable(), 'entity_id') ->where('entity_id=?', $id); return $this->_getReadAdapter()->fetchOne($select); } /** * Check array of category identifiers * * @param array $ids * @return array */ public function verifyIds(array $ids) { $validIds = array(); $select = $this->_getWriteAdapter()->select() ->from($this->getEntityTable(), 'entity_id') ->where('entity_id IN(?)', $ids); $query = $this->_getWriteAdapter()->query($select); while ($row = $query->fetch()) { $validIds[] = $row['entity_id']; } return $validIds; } /** * Get count of active/not active children categories * * @param Mage_Catalog_Model_Category $category * @param bool $isActiveFlag * @return int */ public function getChildrenAmount($category, $isActiveFlag = true) { $storeId = Mage::app()->getStore()->getId(); $attributeId = $this->_getIsActiveAttributeId();
Modificando Magento (Ver. 1.0 octubre 2010) 28 / 61
$table = Mage::getSingleton('core/resource')>getTableName('catalog/category') . '_int'; $select = $this->_getReadAdapter()->select() ->from(array('m'=>$this->getEntityTable()), array('COUNT(m.entity_id)')) ->joinLeft( array('d'=>$table), "d.attribute_id = '{$attributeId}' AND d.store_id = 0 AND d.entity_id = m.entity_id", array() ) ->joinLeft( array('c'=>$table), "c.attribute_id = '{$attributeId}' AND c.store_id = '{$storeId}' AND c.entity_id = m.entity_id", array() ) ->where('m.path like ?', $category->getPath() . '/%') ->where('(IFNULL(c.value, d.value) = ?)', $isActiveFlag); } return $this->_getReadAdapter()->fetchOne($select);
/** * Get "is_active" attribute identifier * * @return int */ protected function _getIsActiveAttributeId() { if (is_null($this->_isActiveAttributeId)) { $select = $this->_getReadAdapter()->select() ->from(array('a'=>$this->getTable('eav/attribute')), array('attribute_id')) ->join(array('t'=>$this->getTable('eav/entity_type')), 'a.entity_type_id = t.entity_type_id') ->where('entity_type_code = ?', 'catalog_category') ->where('attribute_code = ?', 'is_active'); $this->_isActiveAttributeId = $this->_getReadAdapter()>fetchOne($select); } return $this->_isActiveAttributeId; } /** * Rebuild associated products index * * @param array $categoryIds * @return Mage_Catalog_Model_Resource_Eav_Mysql4_Category */ public function refreshProductIndex($categoryIds = array(), $productIds = array(), $storeIds = array()) { /** * Prepare visibility and status attributes information */ $statusAttribute = Mage::getSingleton('eav/config')>getAttribute('catalog_product', 'status'); $visibilityAttribute = Mage::getSingleton('eav/config')Modificando Magento (Ver. 1.0 octubre 2010) 29 / 61
>getAttribute('catalog_product', 'visibility'); $statusAttributeId = $statusAttribute->getId(); $visibilityAttributeId = $visibilityAttribute->getId(); $statusTable = $statusAttribute->getBackend()->getTable(); $visibilityTable = $visibilityAttribute->getBackend()>getTable(); /** * Select categories data */ $select = $this->_getReadAdapter()->select() ->from($this->getTable('catalog/category')) ->order('level') ->order('path'); if (is_array($categoryIds) && !empty($categoryIds)) { $select->where('entity_id IN (?)', $categoryIds); } elseif (is_numeric($categoryIds)) { $select->where('entity_id=?', $categoryIds); } $categories = $this->_getWriteAdapter()->fetchAll($select); $storesCondition = ''; if (!empty($storeIds)) { $storesCondition = $this->_getWriteAdapter()->quoteInto( ' AND s.store_id IN (?)', $storeIds ); } /** * Get information about stores root categories */ $stores = $this->_getWriteAdapter()->fetchAll(" SELECT s.store_id, s.website_id, c.path AS root_path FROM {$this->getTable('core/store')} AS s, {$this->getTable('core/store_group')} AS sg, {$this->getTable('catalog/category')} AS c WHERE sg.group_id=s.group_id AND c.entity_id=sg.root_category_id {$storesCondition} "); $indexTable = $this->getTable('catalog/category_product_index'); foreach ($stores as $storeData) { $storeId = $storeData['store_id']; $websiteId = $storeData['website_id']; $rootPath = $storeData['root_path']; $productCondition = ''; if (!empty($productIds)) { $productCondition = $this->_getWriteAdapter()->quoteInto( ' AND product_id IN (?)', $productIds ); } $insProductCondition = str_replace('product_id', 'cp.product_id', $productCondition);
Modificando Magento (Ver. 1.0 octubre 2010) 30 / 61
foreach ($categories as $category) { $categoryId = $category['entity_id']; $path = $category['path']; $this->_getWriteAdapter()->delete( $indexTable, 'category_id='.$categoryId. ' AND store_id='.$storeId. $productCondition ); if (strpos($path.'/', $rootPath.'/') === false) { continue; } $query = "INSERT INTO {$indexTable} (`category_id`, `product_id`, `position`, `is_parent`, `store_id`, `visibility`) SELECT {$categoryId}, cp.product_id, cp.position, {$categoryId}=cp.category_id as is_parent, {$storeId}, IFNULL(t_v.value, t_v_default.value) FROM {$this->getTable('catalog/category_product')} AS cp INNER JOIN {$this->getTable('catalog/product_website')} AS pw ON pw.product_id=cp.product_id AND pw.website_id={$websiteId} INNER JOIN {$visibilityTable} AS `t_v_default` ON (t_v_default.entity_id = cp.product_id) AND (t_v_default.attribute_id='{$visibilityAttributeId}') AND t_v_default.store_id=0 LEFT JOIN {$visibilityTable} AS `t_v` ON (t_v.entity_id = cp.product_id) AND (t_v.attribute_id='{$visibilityAttributeId}') AND (t_v.store_id='{$storeId}') INNER JOIN {$statusTable} AS `t_s_default` ON (t_s_default.entity_id = cp.product_id) AND (t_s_default.attribute_id='{$statusAttributeId}') AND t_s_default.store_id=0 LEFT JOIN {$statusTable} AS `t_s` ON (t_s.entity_id = cp.product_id) AND (t_s.attribute_id='{$statusAttributeId}') AND (t_s.store_id='{$storeId}') WHERE category_id IN( SELECT entity_id FROM {$this>getTable('catalog/category')} WHERE entity_id = {$category['entity_id']} OR path LIKE '{$path}/%') AND (IFNULL(t_s.value, t_s_default.value)=".Mage_Catalog_Model_Product_Status::STATUS_ENABLED.") {$insProductCondition} GROUP BY product_id ORDER BY is_parent desc"; $this->_getWriteAdapter()->query($query); } }
31 / 61
return $this; } public function findWhereAttributeIs($entityIdsFilter, $attribute, $expectedValue) { $select = $this->_getReadAdapter()->select() ->from($attribute->getBackend()->getTable(), array('entity_id')) ->where('attribute_id = ?', $attribute->getId()) ->where('value = ?', $expectedValue) ->where('entity_id in (?)', $entityIdsFilter); return $this->_getReadAdapter()->fetchCol($select); } /** * Get products count in category * * @param unknown_type $category * @return unknown */ public function getProductCount($category) { $productTable =Mage::getSingleton('core/resource')>getTableName('catalog/category_product'); $select = $this->getReadConnection()->select(); $select->from( array('main_table'=>$productTable), array(new Zend_Db_Expr('COUNT(main_table.product_id)')) ) ->where('main_table.category_id = ?', $category->getId()) ->group('main_table.category_id'); $counts =$this->getReadConnection()->fetchOne($select); } return intval($counts);
/** * Deprecated since 1.1.7 * * @param Varien_Object $object * @return Mage_Catalog_Model_Resource_Eav_Mysql4_Category */ protected function _saveCountChidren($object) { $chidren = $object->getChildren(); if (strlen($chidren)>0) { $chidrenCount = count(explode(',', $chidren)); } else { $chidrenCount = 0; } $this->_getWriteAdapter()->update($this->getEntityTable(), array('children_count'=>$chidrenCount), $this->_getWriteAdapter()->quoteInto('entity_id=?', $object>getId()) ); return $this;
Modificando Magento (Ver. 1.0 octubre 2010) 32 / 61
} /** * Deprecated * * @param Varien_Object $object * @return unknown */ protected function _saveInStores(Varien_Object $object) { if (!$object->getMultistoreSaveFlag()) { $stores = $object->getStoreIds(); foreach ($stores as $storeId) { if ($object->getStoreId() != $storeId) { $newObject = clone $object; $newObject->setStoreId($storeId) ->setMultistoreSaveFlag(true) ->save(); } } } return $this; } /** * Deprecated */ protected function _updateCategoryPath($category, $path) { return $this; if ($category->getNotUpdateDepends()) { return $this; } foreach ($path as $pathItem) { if ($pathItem->getId()>1 && $category->getId() != $pathItem>getId()) { $category = Mage::getModel('catalog/category') ->load($pathItem->getId()) ->save(); } } return $this; } /** * Retrieve categories * * @param integer $parent * @param integer $recursionLevel * @param boolean|string $sorted * @param boolean $asCollection * @param boolean $toLoad * @return Varien_Data_Tree_Node_Collection| Mage_Catalog_Model_Resource_Eav_Mysql4_Category_Collection */ public function getCategories($parent, $recursionLevel = 0, $sorted=false, $asCollection=false, $toLoad=true) { $tree = Mage::getResourceModel('catalog/category_tree'); /** @var $tree Mage_Catalog_Model_Resource_Eav_Mysql4_Category_Tree */
Modificando Magento (Ver. 1.0 octubre 2010) 33 / 61
$nodes = $tree->loadNode($parent) ->loadChildren($recursionLevel) ->getChildren(); $tree->addCollectionData(null, $sorted, $parent, $toLoad, true); if ($asCollection) { return $tree->getCollection(); } return $nodes;
/** * Return parent categories of category * * @param Mage_Catalog_Model_Category $category * @return array */ public function getParentCategories($category) { $pathIds = array_reverse(explode(',', $category->getPathInStore())); $categories = Mage::getResourceModel('catalog/category_collection') ->setStore(Mage::app()->getStore()) ->addAttributeToSelect('name') ->addAttributeToSelect('url_key') ->addAttributeToSelect('image') ->addFieldToFilter('entity_id', array('in'=>$pathIds)) ->addFieldToFilter('is_active', 1) ->load() ->getItems(); return $categories; } /** * Enter description here... * * @param Mage_Catalog_Model_Category $category * @return unknown */ public function getChildrenCategories($category) { $collection = $category->getCollection(); /* @var $collection Mage_Catalog_Model_Resource_Eav_Mysql4_Category_Collection */ $collection->addAttributeToSelect('url_key') ->addAttributeToSelect('name') ->addAttributeToSelect('image') ->addAttributeToSelect('all_children') ->addAttributeToSelect('is_anchor') ->addAttributeToFilter('is_active', 1) ->addIdFilter($category->getChildren()) ->setOrder('position', 'ASC') ->joinUrlRewrite() ->load(); return $collection; } /** * Return children ids of category * * @param Mage_Catalog_Model_Category $category
Modificando Magento (Ver. 1.0 octubre 2010) 34 / 61
* @param boolean $recursive * @return array */ public function getChildren($category, $recursive = true) { $attributeId = $this->_getIsActiveAttributeId(); $select = $this->_getReadAdapter()->select() ->from(array('m' => $this->getEntityTable()), 'entity_id') ->joinLeft( array('d' => $this->getEntityTable() . '_int'), "d.attribute_id = '{$attributeId}' AND d.store_id = 0 AND d.entity_id = m.entity_id", array() ) ->joinLeft( array('c' => $this->getEntityTable() . '_int'), "c.attribute_id = '{$attributeId}' AND c.store_id = '{$category->getStoreId()}' AND c.entity_id = m.entity_id", array() ) ->where('(IFNULL(c.value, d.value) = ?)', '1') ->where('path LIKE ?', "{$category->getPath()}/%"); if (!$recursive) { $select->where('level <= ?', $category->getLevel() + 1); } $_categories = $this->_getReadAdapter()->fetchAll($select); $categoriesIds = array(); foreach ($_categories as $_category) { $categoriesIds[] = $_category['entity_id']; } return $categoriesIds; // // } /** * Return all children ids of category (with category id) * * @param Mage_Catalog_Model_Category $category * @return array */ public function getAllChildren($category) { $children = $this->getChildren($category); $myId = array($category->getId()); $children = array_merge($myId, $children); return $children; // // // // // // // // // // $this->_getTree()->load(); $children = $this->_getTree()->getChildren($category->getId()); $myId = array($category->getId()); if (is_array($children)) { $children = array_merge($myId, $children); } else { $children = $myId; }
35 / 61
// }
return $children;
/** * Check is category in list of store categories * * @param Mage_Catalog_Model_Category $category * @return boolean */ public function isInRootCategoryList($category) { $innerSelect = $this->_getReadAdapter()->select() ->from($this->getEntityTable(), new Zend_Db_Expr("CONCAT(path, '/ %')")) ->where('entity_id = ?', Mage::app()->getStore()>getRootCategoryId()); $select = $this->_getReadAdapter()->select() ->from($this->getEntityTable(), 'entity_id') ->where('entity_id = ?', $category->getId()) ->where(new Zend_Db_Expr("path LIKE ({$innerSelect>__toString()})")); return (bool) $this->_getReadAdapter()->fetchOne($select); // $tree = $this->_getTree(); // $tree->load(); // $children = $tree->getChildren(Mage::app()->getStore()>getRootCategoryId(), true); // if (!in_array($category->getId(), $children)) { // return false; // } // return true; }
}
Contenido del archivo sub_category_listing.phtml <?php $category = $this->getCurrentCategory(); $id = $category->getId(); ?> <?php $_categories=$this->getCurrentChildCategories(); ?> <?php foreach ($_categories as $_category): ?> <div class="categorylisting"> <?php if($_category->getIsActive()): ?> <div class="product-image"> <a href="<?php echo $_category->getURL() ?>" title="<?php echo $this->htmlEscape($_category->getName()) ?>"> <img src="<?php echo $_category->getImageUrl() ?>" width="140" alt="<?php echo $this->htmlEscape($_category->getName()) ?>" /> </a> <?php /* echo "Find this item->" */ ?> </div> <h2><a href="<?php echo $_category->getURL() ?>" title="<?php echo $this->htmlEscape($_category->getName()) ?>"><?php echo $this->htmlEscape($_category->getName()) ?></a></h2> <?php echo $_category->getDescription() ?> <?php endif; ?> </div> <?php endforeach; ?>
36 / 61
<?php echo $_category->getDescription() ?> <?php endif; ?> </li> <?php ($i = $i+1); ?> <?php if($i==2):?> </ol> <?php ($i = 0); ?> <?php endif; ?> <?php endforeach ?> <script type="text/javascript">decorateGeneric($$('.grid-row'), ['last', 'odd', 'even']);</script>
</div>
http://www.magentocommerce.com/boards/viewthread/28220/P15/ Y dice lo siguiente: Otro camino para hacer esto es va CSS, necesitar aadir el siguiente trozo de cdigo al archivo siguiente: \app\design\frontend\default\theme\template\catalog\layer\view.phtml <?php $tmpTitle = $this->htmlEscape($this->__($_filter->getName())); $tmpTitle = strtolower($tmpTitle); $tmpTitle = preg_replace("/[\s]+/", "-", $tmpTitle); ?> <dt class="<?=$tmpTitle?>"><?php echo $this->__($_filter->getName()) ?></dt> <dd class="<?=$tmpTitle?>"> <?php echo $_filter->getHtml() ?> </dd> Lo que la primera parte hace es tomar el "ttulo" de los atributos (Fijado en la seccin de Gestin de atributos en back end) y cambia el "ttulo" a minsculas y los espacios por "-" (en el caso de que el nombre del atributo tenga ms de una palabra). Entonces la segunda parte inyecta la variable $ tmpTitle como una etiqueta de "clase" para su uso por CSS con un poco de magia!. Ahora todo los que se necestia hacer es ir al archivo CSS y por ejemplo, si queremos ocultar un atributo como la Categora, hacer una entrada CSS como la siguiente: .layered-nav .category { display: none; } O si queremos ocultar el precio: .layered-nav .price { display: none; } He encontrado que esta tcnica me da ms control general. Por ejemplo, en algunas categoras, puede ser que se desee mostrar Precio mientras que en otras no. Opcin 2. No funciona Del enlace: http://www.imagedia.com/2010/04/remove-categories-from-shop-by-options-in-magento/ Consiste en sustituir el contenido del archivo: app/design/frontend/default/your_template/template/catalog/layer/view.phtml Por el siguiente cdigo: <?php /** * Category layered navigation * * @see Mage_Catalog_Block_Layer_View */ ?> <?php if($this->canShowBlock()): ?> <div class=box layered-nav> <div class=head> <h3><?php echo $this->__(Shop by) ?></h3> </div> <div class=border-creator> <?php echo $this->getStateHtml() ?> <?php if($this->canShowOptions()): ?> <div class=narrow-by> <h4><?php echo $this->__(Browsing Options) ?></h4> <dl id=narrow-by-list> <?php $_filters = $this->getFilters() ?> <?php foreach ($_filters as $_filter): ?> <?php if($_filter->getItemsCount()): ?>
Modificando Magento (Ver. 1.0 octubre 2010) 38 / 61
<?php if($_filter->getName() != Category){ ?> <dt><?php echo $this->__($_filter->getName()) ?></dt> <dd> <?php echo $_filter->getHtml() ?> </dd> <?php } endif; ?> <?php endforeach; ?> </dl> <script type=text/javascript>decorateDataList(narrow-by-list)</script> </div> <?php endif; ?> </div> </div> <?php endif; ?> <! [ends] .browse-by // > Opcin 3: Funciona pero hay que tocar el Core Del enlace: http://www.magentocommerce.com/boards/viewthread/33199/ Editamos el archivo go to app/code/core/Mage/Catalog/Block/Layer/View.php Y comentamos la siguiente lnea: $filters[] = $categoryFilter; Opcin 4: Usando una extensin. No la he probado, aunque dice que vale para todas las versiones de Magento. La llave de la extensin es: magento-community/Adtrak_DisableCategoryFilter-0.1.0 El enlace donde se encuentra: http://www.magentocommerce.com/extension/packages/module/1678/disablelayered-nav-category-filter#releases
//app/design/frontend/default/mi_tema/layout/newsletter.xml:
<!--
<default> <!-- Mage_Newsletter --> <reference name="right"> <block type="newsletter/subscribe" after="_" name="right.newsletter" template="newsletter/subscribe.phtml"/> </reference> </default> --> Las lneas evidentemente ya aparecen comentadas. De este modo ya nos aparece a la izquierda menos en la vista
<label>Catalog Category (Without Subcategories)</label> <remove name="right.reports.product.viewed" /> <reference name="left"> <block type="reports/product_viewed" before="right.permanent.callout" name="left.reports.product.viewed" template="reports/product_viewed.phtml" /> </reference> </catalog_category_layered_nochildren> estas lneas se encuentran en la seccin del fichero Category layered navigation layout Lo que he hecho es comentar la lnea que referencia a product_viewed.phtml para mantener el original, y despus la he copiado y modificado segn aparece en el resultado final a continuacin, tambin he cambiado la posicin de right a left en la etiqueta <reference name>:
<remove name="right.reports.product.viewed" />
<reference name="left"> <!-<block type="reports/product_viewed" before="right.permanent.callout" name="left.reports.product.viewed" template="reports/product_viewed.phtml" />--> <block type="reports/product_viewed" name="left.reports.product.viewed" template="reports/product_viewed.phtml" /> </reference> </catalog_category_layered_nochildren> Bien mediante este cambio conseguimos que en la vista de catlogo los productos vistos recientemente aparezcan a la izquierda, pero como las pginas de vistas de subcategoras realmente son listados o lo que es lo mismo reportes, entonces me dirijo al archivo reports.xml. El contenido de este archivo se limita a:
<layout version="0.1.0">
<default>
40 / 61
<!-- Mage_Reports --> <reference name="right"> <block type="reports/product_viewed" before="right.permanent.callout" name="right.reports.product.viewed" template="reports/product_viewed.phtml" /> <block type="reports/product_compared" before="right.permanent.callout" name="right.reports.product.compared" template="reports/product_compared.phtml" /> </reference> </default> </layout> Bien pues tendremos que cambiarlo para que cambie de posicin el bloque de productos vistos recientemente que est referenciado en el primer block type. Dejando el contenido del archivo del siguiente modo:
<layout version="0.1.0"> <default>
<!-- Mage_Reports --> <block type="reports/product_viewed" before="right.permanent.callout" name="right.reports.product.viewed" template="reports/product_viewed.phtml" /> </reference> <reference name="right">
<!--<block type="reports/product_viewed" before="right.permanent.callout" name="right.reports.product.viewed" template="reports/product_viewed.phtml" />--> <reference name="left">
41 / 61
As nos mostrar la tpica pgina de Apache con el Forbidden...perooo....en esta pgina se nos muestra tanto el sistema operativo como el apache y su versin, tampoco me gusta. As que busqu un poco ms, y de nuevo el ficherito .htaccess nos va a ser til. Inclu la siguiente lnea en el mismo, y listo, ahora la pgina que me muestra es la que tiene por defecto Magento para las pginas no encontradas:
ErrorDocument 403 /html/errors/404.php
Con estas dos lneas y el ficherito hemos contribuido en algo a la seguridad de nuestra tienda.
La inclusin del texto es otra historia. En la versin 1.4.1.1 he encontrado algunos post en los que se dice que presenta problemas con la traduccin inline. Intent incluir un texto que luego fuera traducible en el fichero /app/design/frontend/default/mitema/template/payment/form/checkmo.phtml mediante la siguiente lnea que coloqu al final del fichero: <?php echo $this->__('This payment method means that shipments are not processed until the transfer is not confirmed, so delivery time may be delayed 48 hours.') ?> Y no me funcion, en el progreso de compra no pasaba del mtodo de envo. Pero como no se PHP no se si esto era lo adecuado. As que me he conformado con incluir un texto en castellano, agregando antes del <?php endif; ?>
<spam class="success-msg">Esta mtodo de pago retrasa la entrega en al menos 48 horas por requerir confirmacin de transferencia</spam>
Si alguien que lea este documento sabe como hacerlo, pues que aporte.
Resolviendo Problema en el Progreso de Compra: Card Verification Please verify the card with the issuer bank
Resulta que en el progreso de compra en el paso 5 que dice Revisin del Pedido me apareca un mensaje tal que as: Card Verification Please verify the card with the issuer bank. Y no apareca nada ms, slo un cuadro en blanco, pero de revisin de pedido nada. Bien parece que es un Bug de la versin, pero se soluciona de una forma poco adecuada, pero se soluciona, consiste en desactivar el modo centinela. Para ello iremos a Sistema Configuracin Avanzado Avanzado y deshabilitaremos el mdulo Mage_Centinel. Se puede encontrar informacin sobre esto en el post: http://www.magentocommerce.com/boards/viewthread/196550/
Eliminando del Panel de Control de Mi Cuenta los enlaces Billing Agreements y Recurring Profiles
Del Enlace: http://www.magentocommerce.com/boards/viewthread/197799/#t248148 Estos dos enlaces estn incluidos en la versin 1.4.1.1. Pero no existe documentacin respecto a su funcionalidad, adems en el panel de administracin slo he visto una referencia a Billing Agreements en la forma de Pago PayPal. En consecuencia, tanto si no vamos a usar PayPal como si no queremos complicarnos la vida hasta que no haya una documentacin en condiciones lo mejor es quitar estos enlaces. El caso es que quitarlos no es tan sencillo porque por lo visto van embebidos en el cdigo y no hay archivo n del template ni del layuot que tocar. Pero en el enlace apuntado al principio de este epgrafe nos dan una solucin sencilla. Dentro del layout creamos una carpeta sales y ah incluimos dos archivos con el contenido que se indica. De este modo procederemos as: 1.Dentro de /app/design/frontend/default/mi tema/layout creamos la carpeta sales. 2.Dentro de /app/design/frontend/default/mi tema/layout/sales creamos dos archivos: billing_agreement.xml y recurring_profile.xml 3.El contenido de ambos archivos es exactamente el mismo que se indica: <?xml version="1.0"?> <layout version="0.1.0"> </layout>
Modificando Magento (Ver. 1.0 octubre 2010) 44 / 61
En ese mismo post viene otra forma de hacerlo pero es algo ms complicada. A mi esta me funcion.
registrado, y el identificador (ID) del cliente tambin. Las invitaciones pueden ser enviadas con OpenInviter.
Un sistema de Afiliacin: podemos aadir el parmetro sponsor_id a cada pgina, que crer una cookie y una
sesin para identificar una persona invitada. Podemos igualmente poner esos enlaces en sitios web de terceros. Y reescribimos el mdulo Magentix_SocialBookmarking para habilitar el patrocinio con estos sitios.
Creacin de Cuenta: cuando se crea una cuenta, se comprueba si una invitacin fue enviada al correo
electrnico usado para el registro. Si este no es el caso, se comprueba si una cookie de sesin o afiliacin existe. Si hay un enlace, el usuario que se registra se convierte en el ahijado del cliente que lo invit.
Un seguimiento de puntos para el cliente: el cliente tiene una interfaz para el seguimiento de puntos en su
cuenta. El puede ver sus ahijados. Puede preguntar por el canje de sus puntos.
Incremento de puntos: los puntos de fidelidad y los puntos de patrocinio son insertados en la orden en el carrito
fidelidad o los puntos de patrocinio. Habilitar o no el intercambio por dinero, regalo o cupn. Tambin podemos definir el mximo de dinero sin nmero siret, el periodo de clculo del mximo de dinero, si un pedido es requerido para patrocinio, el periodo de validez para una invitacin, el preiodo de validez de un patrocinador sin un pedido, nmero de niveles para el clculo de puntos del patrocinador, el porcentaje sobre las ventas indirectas de un patrocinador, el nmero mximo de invitaciones que alguien puede enviar por horas, el mensaje de cabecera, el mensaje del cuerpo y el mensaje del pie de pgina.
Una interfaz de administrador: nos permite ver la lista de invitaciones enviadas, monitorizar las solicitudes de
Patrocinio para que los clientes puedean invitar a su listas de contactos de msn, yahoo, etc.. de forma masiva.
3.Perodo de clculo del mximo permitido para un usuario (das). Un usuario no puede cambiar ms que el mximo definido para el perodo que definamos aqu. 4.Tiempo de inactividad antes de retirar el enlace de patrocinio (das). Este campo se emplea para el caso de que tengamos pginas que nos esponsoricen. Podemos habilitar el cron de Magento y si un cliente no incluye una orden en un sitio que nos esponsorice en este periodo de tiempo, el enlace ser eliminado. 5.Cantidad mxima permitida sin nmero de compaa. Nos permite definir el montante mximo que se permite para cambiar puntos por dinero. 6.En lo que se refiere a las acciones que esta extensin incluye dentro de las Reglas del Carrito o del Catlogo, vamos a aclarar las siguientes: a)Puntos de Patrocinio por porcentaje del precio orginal. Si el producto tiene un valor de 200 y el valor es igual a 10, el importe ser 20 por cada producto. b)Puntos de patrocinio por importe fijo. Si el producto tiene un valor de 200 y el valor es igual a 10, el importe ser de 10 por cada producto. c)Puntos de patrocinio por un importe fijo para el total del carrito. Si el valor es 10, el importe ser de 10 para el total del carrito.
(Pendiente) Como crear un nuevo Banner lateral Cambiando la fisonoma del Panel de Control del Cliente
Lo primero el Panel de Control del Cliente (en la interfaz Mi Panel de Control), carga el diseo a dos columnas con una a la izquierda. En la columna de la izquiera nos aparece el men de navegacin Mi Cuenta, Los productos vistos recientemente, Una llamada (la del perrito) y el carrito de compras. Para cambiar el diseo a dos columnas pero una de ellas a la derecha vamos a editar el fichero; /app/design/frontend/default/mi tema/layout/customer.xml Buscamos la siguiente seccin dentro del archivo:
<!--
Customer account home dashboard layout --> Y ah la lnea que dice lo siguiente:
<action method="setTemplate"><template>page/2columns-left.phtml</template></action>
Y la sustituimos por:
<action method="setTemplate"><template>page/2columns-right.phtml</template></action>
Ok...si ahora refrescamos la pgina (teniendo la cach de Magento deshabilitada), veremos que la columna aparece a la derecha pero que los bloques han cambiado, no nos aparece el Men de Mi Cuenta, ni el carrito, ni el perrito, etc....Por qu?. Veamos la seccin justo anterior a la que hemos visto de este archivo, donde pone:
<!--
Customer account pages, rendered for all tabs in dashboard --> Nos fijamos en la lnea siguiente:
<reference name="root"> <action method="setTemplate"><template>page/2columnsleft.phtml</template></action>
Bien pues en ambas lneas vamos a cambiar la palabra left por right. Ahora si nos aparece el men de Mi Cuenta y el Carrito, es ms ste nos aparece duplicado. Pero no nos aparece los productos vistos
Modificando Magento (Ver. 1.0 octubre 2010) 46 / 61
recientemente y el perrito. Ese me da igual porque no lo quiero en esta pgina, pero quiero que aparezcan los productos vistos recientemente y obviamente quitar un carrito de la compra, as como otro men que tengo yo de opciones de usuario creado con los toplinks. Para eso slo tenemos que repasar el cdigo de ambas secciones y veremos las referencias a lo que queremos o no queremos. Bien para quitar el men opciones de usuario que yo tengo (que son los toplinks convertidos en bloque, ya hemos visto como hacerlo en este documento), y que segn revisamos en el fichero customer.xml se cargan en todas aquellas pginas en lo que no se diga lo contrario, tendremos que hacer precisamente eso: Decirle lo contrario. Y para eso nos sirve la etiqueta <remove> En la seccin:
<!--
Que lo que nos dice es que son las pginas de la cuenta del cliente, que se reproducen para todas las etiquetas (enlaces) en el panel de control, aadimos los siguiente antes del final de la seccin, quedando tal que as:
</reference>
<remove name="top.links"></remove> </customer_account> As evitamos que el bloque que cre con los toplinks aparezca. Ahora vamos a quitar uno de los carritos....queremos que nos compren pero mejor no ser pesados. En la misma seccin que en el caso anterior vamos a comentar las lneas que referencian el bloque del Carrito, por lo que la seccin quedara as:
<reference name="right">
<block type="customer/account_navigation" name="customer_account_navigation" before="-" template="customer/account/navigation.phtml"> <action method="addLink" translate="label" module="customer"><name>account</name><path>customer/account/</path><label>Ac count Dashboard</label></action> <action method="addLink" translate="label" module="customer"><name>account_edit</name><path>customer/account/edit/</path ><label>Account Information</label></action> <action method="addLink" translate="label" module="customer"><name>address_book</name><path>customer/address/</path><lab el>Address Book</label></action> </block>
<!--<block type="checkout/cart_sidebar" name="cart_sidebar" template="checkout/cart/sidebar.phtml">
<action method="addItemRender"><type>simple</type><block>checkout/cart_item_renderer< /block><template>checkout/cart/sidebar/default.phtml</template></action> <action method="addItemRender"><type>grouped</type><block>checkout/cart_item_renderer _grouped</block><template>checkout/cart/sidebar/default.phtml</template></act ion> <action method="addItemRender"><type>configurable</type><block>checkout/cart_item_ren derer_configurable</block><template>checkout/cart/sidebar/default.phtml</temp late></action> </block> --> Como se ve hemos comentado el bloque al completo, y as eliminamos uno de los carritos de compra. Ms cosas, ahora queremos que debajo del carrito nos aparezca el bloque de productos vistos recientemente, Para eso en la misma seccin debemos aadir el bloque de productos vistos recientemente y decirle que debe
Modificando Magento (Ver. 1.0 octubre 2010) 47 / 61
<action method="addItemRender"><type>simple</type><block>checkout/cart_item_renderer< /block><template>checkout/cart/sidebar/default.phtml</template></action> <action method="addItemRender"><type>grouped</type><block>checkout/cart_item_renderer _grouped</block><template>checkout/cart/sidebar/default.phtml</template></act ion> <action method="addItemRender"><type>configurable</type><block>checkout/cart_item_ren derer_configurable</block><template>checkout/cart/sidebar/default.phtml</temp late></action> </block> --> <!--<block type="catalog/product_compare_sidebar" name="catalog.compare.sidebar" template="catalog/product/compare/sidebar.phtml"/>--> <block type="sales/reorder_sidebar" name="sale.reorder.sidebar" as="reorder" template="sales/reorder/sidebar.phtml"/> A que molan los layout...parecen complejos pero cuando le coges el rollo facilitan mucho las cosas.
Bien pues el problema reside en las etiquetas strong, si las quitamos el texto se traduce perfectamente, y adems el enlace aparece en negrita igualmente. Las lneas quedaran as:
"There are <a href=""%s"">%s items</a> in your cart.","Hay <a href=""%s"">%s artculos</a> en su cesta." "There is <a href=""%s"">1 item</a> in your cart.","Hay <a href=""%s"">1 artculo</a> en su cesta."
Y listo.
Adems del sitio oficial de Magento, existen otro foro en castellano que parece que se mueve ms que el oficial (cosa que no es difcil). El otro foro esta en el siguiente enlace: http://foros.mgnt.es/showthread.php?332-Metodo-de-pago-Servired-para-Magento El caso es que te dice que el mdulo no es compatible con la versin 1.4, pero bicheando en los foros al final se encuentra que si. Para ello hay que hacer una pequea modificacin en el fichero /app/code/local/Mage/Servired/Model/Standard.php, consistente en moficar la siguiente lnea: $currency = $this->convertToServiredCurrency($order->getOrderCurrency()); Por: $currency = $this->convertToServiredCurrency($order->getOrderCurrencyCode()); La informacin anterior la encontris en el siguiente enlace: http://www.magentocommerce.com/boards/viewthread/77950/ Una vez hecha esta modificacin es el momento de entrar en el Panel de Administracin Mtodos de Pago Servired, y cumplimentar los datos con los que nos proporciona la entidad con la que hayamos contratado. Este paso es sencillo, pero tres apuntes. El primero es que en Nuevo estado del pedido debemos poner Procesando. El segundo es que en Mtodo para la firma hay que poner (a no ser que el banco nos diga lo contrario) Completo ampliado. Y el tercero es que es conveniente que en Estado de la Ventana seleccionemos Full Screen Same Windows (2), por aquello del bloqueo de los pop ups. Bien hecho esto ya estamos en condiciones de probar el mdulo. Cuando yo lo prob me encontr que me lanzaba el siguiente error: Invalid entity supplied: Mage_Sales_Model_Mysql4_Order_Address Object ...y un chorizaco de cdigo. Despus de algunas horas de desesperacin encontr algo en un foro: http://www.magentocommerce.com/boards/viewthread/200324/P0/ Que vena a decir que el problema era el paquete de actualizacin de la versin 1.4 a la 1.4.1, y sobre la pgina 3 de este post empiezas a encontrar gente que dice algo as como a mi me funcion...y los encuentras a mogolln, luego habr que probar. El problema en s es que los seores de Varien (yo creo que a posta) mandan el paquete de actualizacin de forma incorrecta, de tal modo que en el paquete van archivos antiguos. La solucin, descargarse el paquete completo de instalacin de la versin 1.4.1, extraerlo y machacar (no sin antes hacer copia de seguridad) la carpeta core/Mage/Sales/Model/Mysql4/Order/ to local/Mage/Sales/Model/Mysql4/Order/ . Y listo. Tenemos un segundo problema. De esta forma el mdulo no actualiza los pedidos ni para el cliente ni para el Panel de Administracin, de tal forma que el cliente no ve un historial de los pedidos, y el administrador no puede cambiar el estado de los mismos. Encontr dos posible soluciones. Una parte de realizar dos modificaciones, y la otra de sustituiir un fichero entero. Con ambas me ha funcionado, aunque la primera ha sido finalmente ms fiable. Solucin 1: Del Enlace: http://onestic.com/pasarela-de-pago-servired-para-magento-bug/ Esta es la solucin que yo he implementado. En este caso lo que hacemos es sustituir varias lneas en el fichero StandardController.php del mdulo de Servired que est en la ruta: /app/code/local/Mage/Servired/controllers. He de decir que yo he hecho una interpretacin de lo que el enlace mencionado comenta, porque como veris no indica exactamente cules son la lneas a sustituir. Y lo he hecho mediante pruebas de ensayo y error, hasta que me ha funcionado. As que lo que veris a continuacin es mi interpretacin de las modificaciones. Buscamos la funcin "public function successAction() " , mediante una bsqueda de este texto. Al principio de la funcin comentaremos las tres primeras lneas, ahora copiamos la dos primeras y las pegamos pero intercambiamos su orden. Con lo que nos queda tal que as: public function successAction() {
Modificando Magento (Ver. 1.0 octubre 2010) 49 / 61
Un detalle de mucho inters. Resulta que la lnea comment=null la coment en modo pruebas y funcion el mdulo. Cuando pas al modo REAL el mdulo no funcionaba y siempre me daba error de Nmero de Pedido Repetido, la descoment y el mdulo sali andando. Ahora no vamos al final de la funcin mencionada, justo antes de $order->save(); y buscamos la lnea (que est justo antes de order->save), y delante de ella pegamos el cdigo que se muestra a continuacin, quedando el final de la funcin como se ve: if (!$orderStatus) { $orderStatus = $order->getConfig()->getStateDefaultStatus($orderState); } $order->setState($orderState, $orderStatus,$comment,true);
$order->save();
Solucin 2: Del enlace: http://foros.mgnt.es/showthread.php?332-Metodo-de-pago-Servired-paraMagento/page30&highlight=magento+1.4+servired Consiste en sustituir el fichero StandardController.php del mdulo por el que deja el usuario mac75a. El fichero se encuentra en: /app/code/local/Mage/Servired/controllers. Si bien esta solucin tiene el visto bueno del creador del mdulo (defcon2), tambin es cierto que el que la crea pide que la gente la pruebe...luego...no est muy probada que digamos. En esta solucin si es necesario que en el TPV de LA Caixa (la interfaz web que nos facillita) se cumplimenten los datos de URLOK y URLKO, porque de lo contrario cuando la operacin se realiza, bien o mal, te manda a la pgina de pgina no encontrada. La URL de OK es: http://www.midominio.com/checkout/onepage/success/ Aunque en un post he visto que esta direccin se escribe con una sola c en success. La URL de KO es: http://www.mi_temadetarifa.es/checkout/cart/ A mi no me funciona del todo correctamente.
<action method="setImgSrc"><src>images/media/col_left_callout.jpg</src></action> <action method="setImgAlt" translate="alt" module="catalog"><alt>Servicio Tecnico</alt></action> <action method="setLinkUrl"><url>customerservice</url></action> -->
</block>
50 / 61
.error-msg { border-color:#f16048; background-color:#faebe7; backgroundimage:url(../images/i_msg-error.gif); color:#df280a; } .success-msg { border-color:#446423; background-color:#eff5ea; backgroundimage:url(../images/i_msg-success.gif); color:#3d6611; } .note-msg, .notice-msg { border-color:#fcd344; background-color:#fafaec; backgroundimage:url(../images/i_msg-note.gif); color:#3d6611; } .notice-msg-propio { border-color:#fcd344; background-color:#fafaec; background-image:url(../images/i_msg-note.gif); color:#3d6611; }
TRUNCATE `sendfriend_log`; TRUNCATE `tag`; TRUNCATE `tag_relation`; TRUNCATE `tag_summary`; TRUNCATE `wishlist`; TRUNCATE `log_quote`; TRUNCATE `report_event`; ALTER TABLE `sales_flat_creditmemo` AUTO_INCREMENT=1; ALTER TABLE `sales_flat_creditmemo_comment` AUTO_INCREMENT=1; ALTER TABLE `sales_flat_creditmemo_grid` AUTO_INCREMENT=1; ALTER TABLE `sales_flat_creditmemo_item` AUTO_INCREMENT=1; ALTER TABLE `sales_flat_invoice` AUTO_INCREMENT=1; ALTER TABLE `sales_flat_invoice_comment` AUTO_INCREMENT=1; ALTER TABLE `sales_flat_invoice_grid` AUTO_INCREMENT=1; ALTER TABLE `sales_flat_invoice_item` AUTO_INCREMENT=1; ALTER TABLE `sales_flat_order` AUTO_INCREMENT=1; ALTER TABLE `sales_flat_order_address` AUTO_INCREMENT=1; ALTER TABLE `sales_flat_order_grid` AUTO_INCREMENT=1; ALTER TABLE `sales_flat_order_item` AUTO_INCREMENT=1; ALTER TABLE `sales_flat_order_payment` AUTO_INCREMENT=1; ALTER TABLE `sales_flat_order_status_history` AUTO_INCREMENT=1; ALTER TABLE `sales_flat_quote` AUTO_INCREMENT=1; ALTER TABLE `sales_flat_quote_address` AUTO_INCREMENT=1; ALTER TABLE `sales_flat_quote_address_item` AUTO_INCREMENT=1; ALTER TABLE `sales_flat_quote_item` AUTO_INCREMENT=1; ALTER TABLE `sales_flat_quote_item_option` AUTO_INCREMENT=1; ALTER TABLE `sales_flat_quote_payment` AUTO_INCREMENT=1; ALTER TABLE `sales_flat_quote_shipping_rate` AUTO_INCREMENT=1; ALTER TABLE `sales_flat_shipment` AUTO_INCREMENT=1; ALTER TABLE `sales_flat_shipment_comment` AUTO_INCREMENT=1; ALTER TABLE `sales_flat_shipment_grid` AUTO_INCREMENT=1; ALTER TABLE `sales_flat_shipment_item` AUTO_INCREMENT=1; ALTER TABLE `sales_flat_shipment_track` AUTO_INCREMENT=1; ALTER TABLE `sales_invoiced_aggregated` AUTO_INCREMENT=1; ALTER TABLE `sales_invoiced_aggregated_order` AUTO_INCREMENT=1; ALTER TABLE `sales_order_aggregated_created` AUTO_INCREMENT=1; ALTER TABLE `sendfriend_log` AUTO_INCREMENT=1; ALTER TABLE `tag` AUTO_INCREMENT=1; ALTER TABLE `tag_relation` AUTO_INCREMENT=1; ALTER TABLE `tag_summary` AUTO_INCREMENT=1; ALTER TABLE `wishlist` AUTO_INCREMENT=1; ALTER TABLE `log_quote` AUTO_INCREMENT=1; ALTER TABLE `report_event` AUTO_INCREMENT=1; SET FOREIGN_KEY_CHECKS=1; Nota: Las lneas en castellano debemos borrarlas si no, nos dar error de sintxis. Las lneas estn simplemente para indicar que hace cada bloque de cdigo. Guardamos este fichero y desde la consola ejecutamos lo siguiente: mysql -u nombre_usuario -p nombre_base_de_datos < borra_ordenes.sql Cuando vuelvas a entrar en tu cuenta de cliente o como administrador vers que no hay pedidos, y en el panel de administracin los importes estn a cero.
importe supere el marcado para los envos gratuitos, no nos aparezca la opcin de la tarifa plana. En este post nos dan la solucin: http://www.magentocommerce.com/boards/viewthread/53031/ A continuacin la explico. En el Panel de Administracin en Configuracin Ventas Mtodos de Envo, tenemos que hacer lo siguiente: 1.El orden que pongamos para Envos Gratuitos debe ser siempre inferior (es decir que aparezca primero) que para Tarifa Plana. 2.El ttulo de los Envos gratis los ponemos como Transporte Gratis. Cuando veas el cdigo vers el porqu, y tambin vers como puedes cambiar esto. 3.El ttulo de la Tarifa Plana la ponemos como Tarifa Plana. Del mismo modo que en el caso anterior podrs ver el porqu en el cdigo, y si quieres podrs cambiarlo. A continuacin de guardar estos cambios editamos el archivo: /app/design/frontend/default/mi_tema/template/checkout/onepage/shipping_method/available.phtml Buscamos la siguiente lnea de cdigo: <dl class="sp-methods"> Y justo debajo aadimos una lnea, quedando tal que as:
<dl class="sp-methods"> <?php /* Agregamos 1 linea aqui */ ?>
Ahora buscamos foreach ($_shippingRateGroups as $code => $_rates): ?> que estar justo debajo de lo que acabamos de aadir y que si estamos en la versin 1.4 de Magento la lnea aparece tal que as: <?php $_sole = count($_shippingRateGroups) == 1; foreach ($_shippingRateGroups as $code => $_rates): ?> Bien, pues justo debajo de esto aadimos dos lneas ms quedando tal que as: <?php $_sole = count($_shippingRateGroups) == 1; foreach ($_shippingRateGroups as $code => $_rates): ?> <?php /* Added 2 lines here */ ?>
<?php if($this->getCarrierName($code)=='Transporte Gratis') $freeshipping_available_flag=1;?> <?php if(($this->getCarrierName($code)=='Tarifa Plana') and ($freeshipping_available_flag)) continue; ?>
<dt><?php echo $this->getCarrierName($code) ?></dt> Ahora cuando el pedido supere el importe marcado para el envo gratuito slo nos aparece este mtodo y no ambos. En este mismo post dice que cambiando determinada lnea el botn de chequeo del mtodo de envo nos aparecer marcado, pero a mi no me ha funcionado. Este mtodo consiste en sustituir la lnea: <input name="shipping_method" type="radio" value="<?php echo $_rate>getCode() ?>" id="s_method_<?php echo $_rate->getCode() ?>"<?php if($_rate>getCode()===$this->getAddressShippingMethod()) echo ' checked="checked"' ?> class="radio" /> Por: <input name="shipping_method" type="radio" value="<?php echo $_rate>getCode() ?>" id="s_method_<?php echo $_rate->getCode() ?>"<?php if(($_rate>getCode()===$this->getAddressShippingMethod()) or ($_rate->getMethodTitle() == 'Transporte Gratis')) echo ' checked="checked"'?> class="radio" /> Si alguien sabe dnde est el error o como hacerlo para que as sea, pues que contribuya.
habituales de los envos que nos solicita (si habilitado o no, paises que se permiten, costes de manipulacin, etc..), debemos bajarnos un archivo en el que incluyamos los datos. Para bajar este archivo debemos ir a Sistema - Configuracin Ventas Mtodos de Envo, pero tenemos que tener seleccionado en Alcance de la Configuracin (arriba de la columna de opciones de la configuracin) Main Website, entonces es cuando nos aparece la opcin para descargarnos el fichero. El fichero no es ms que la fila de ttulos de las columnas, es decir, nos muestra los encabezados de los campos a rellenar. "Pas","Regin/Estado","Cdigo postal","Peso (and above)","Precio de envo" El Pas lo tenemos que incluir con la codificacin ISO, para ello podemos buscarlo en el enlace http://www.iso.org/iso/english_country_names_and_code_elements Si no tenemos que diferenciar entre regiones y Cdigos postales podemos usar el carcter comodn * El peso es en Kg o en gramos, o en la unidad que tengamos configurada por defecto, luego unidades por debajo de esta tienen que ser nmeros decimales. El precio es el precio final del envo. COMO NO FUNCIONA HE MODIFICADO el archivo avalaible.phtml y lo he vuelto a su versin orginal. Tambin he modificado el core segn las indicaciones de este enlace: http://magebase.com/magento-tutorials/enable-free-shipping-promotions-with-magento-table-rate-method/ Activo el registro de Magento y me lanza un error. Pero no me dice exactamente en que archivo XML se produce. Para ver en que archivo se produce, sigo la informacin del siguiente enlace: http://www.magentocommerce.com/boards/viewthread/56831/ El registro indica que hay parse error segn el archivo update.phtml del core. Lo que hay que hacer es lo que dice el post: before $fileXml = simplexml_load_string($fileStr, add libxml_use_internal_errors(true); and after if(!$fileXml){ print($file); exit();} This may help you. It shows the bad xml file. Then, remove all from Update.php (it is just a debug edit so it has to be removed) Despus que localizas el archivo puedes verificarlo copiando el contenido y pegndolo en cualquier verificador de XML, yo us: http://www.xmlvalidation.com/index.php?id=1&L=0 Bueno al final era una carajera....semana y media de trabajo para que al final el problema es que al ajustar Table Rate no tengo que seleccional Mainsite, sino el sitio en el que quiero aplicarlo.
$elementClass); add
in
Update.php
http://elgamusino.es/ajustar-fecha-y-hora-en-centos/ Para comprobar la hora usamos el comando date, este comando permite opciones de tal manera que se puede ajustar la hora a mano. Pero no es nuestra intencin hacerlo a diario, as que, si nuestro servidor est conectado a Internet (obviamente en el caso de un servidor web es as) ah va lo que en el enlace mencionado explican estupendamente. Lo primero que debemos hacer es una copia de seguridad del fichero localtime -->mv /etc/localtime /etc/localtime-old Cambiamos el timezone por el de Espaa, sin o lo tuviramos ya cambiado: -->ln -sf /usr/share/zoneinfo/Europe/Madrid /etc/localtime Sincronizamos la hora con el servidor que deseemos, en Espaa y en mi caso considero que el mejor es el de la Red Iris. -->/usr/sbin/ntpdate -u hora.rediris.es Si os da fallo porque no se tenga el comando ntp, instalamos con yum (yum -y install ntp). Verificamos que en el fichero /etc/sysconfig/clock la entrada ZONE tiene el valor correcto. Aqu el fichero tendra que contener lo siguiente: ZONE="Europe/Madrid" UTC=true ARC=false Ahora pasamos el valor al reloj hardware: -->/sbin/hwclock --systohc Ahora realizamos un cron para que sincronice a diario el reloj con el servidor NTP. El cron tendr las dos lneas siguientes: /usr/sbin/ntpdate -u hora.rediris.es /sbin/hwclock --systohc
Pero que ocurre cuando damos de alta nuestra en tienda en aquellos buscadores que pueden listar nuestros productos y para ello te piden el feed RSS. Magento no me da la opcin de obtener un feed para todo el catlogo, solo para las categoras principales. Pues bien, si hemos tenido la precaucin de incluir nuestros productos en la Categora por defecto, la obtencin de la URL del Feed para todo el catlogo es sencilla. Si le pedimos el feed de una categora y nos fijamos en la URL, obtenemos: http://www.mitienda.com/rss/catalog/category/cid/3/store_id/2/ Bien, cid/3 es el identificador de la categora, mientras que store_id/2 es el identificador de la tienda. Modificando el cid/3 por cid/2 obtendremos el feed de la categora por defecto (default category) y todos los productos, siempre que como se ha dicho los hayamos incluido en esta categra, sino tendremos que hacerlo. Cuando demos de alta la tienda en el buscador, solo tendremos que proporcionar esta URL para pasar el fichero al completo.
skin/frontend/default/default/aw_blog/ Los movemos a: app/design/frontend/mi/tema/layout/aw_blog.xml app/design/frontend/mi/tema/template/aw_blog/ skin/frontend/mi/tema/aw_blog/ Luego vamos a darle formato al men de categora del blog, para ello editamos el fichero app/design/frontend/mi/tema/template/aw_blog/menu.phtml de la forma habitual veremos como se asignan estilos a las diferentes partes del men. Yo simplemente he usado Firebug para ver los estilos aplicados a otros bloques de mi pgina, y despus he adaptado la hoja de estilo propia que trae esta extensin que est en la ruta skin/frontend/mi/tema/aw_blog/style.css . La adaptacin ha consistido en crear estilos o modificar los existentes segn los valores que me interesen de los otros bloques de mi pgina. Cuando ya tengo adaptado el men, para que en la primera pgina y en el resto de pginas del catlogo haya un enlace al blog en forma de banner y una vez entramos en el mismo nos aparezca el men de categoras del blog, en la parte de administracin de este componente en la seccin Mens and Links he seleccionado habilitar el men derecho solo en las pginas del blog. As slo aparece el men cuando pico en el banner lateral. El problema que se me presentaba es que al crear el banner en el layout (fichero catalgo.xml), al entrar en el blog no solo me apareca el men de categoras, sino tambin el banner lateral. Aqu es dnde uno se da cuenta de la utilidad del layout y de sus etiquetas. Usando la etiqueta <remove> se puede quitar este banner lateral de la pgina del blog que es donde aparece el men de categoras. Para ello he editado el fichero app/design/frontend/mi/tema/layout/aw_blog.xml, y he usado la etiqueta tal que as:
<blog_index_index>
5.Actualizamos la configuracin con la nueva url: UPDATE core_config_data SET value = 'http://www.yourdomine.com/' WHERE path LIKE 'web/%/base_url'; Y obtendremos esto: config_id | scope | scope_id | path | value | | 2 | DEFAULT | 0 | web/unsecure/base_url | http://www.tudominio.com.ar/magento/| | 3 | DEFAULT | 0 | web/secure/base_url | http://www.tudominio.com.ar/magento/| Y aqu se acab.
Actualizar Magento
Lo vamos a hacer con el MCM. Parto de la versin 1.4.1.1 Entro en MCM, le doy al botn Comrpobar Actualizaciones. Se pega un rato pensando y nos muestra en diferente color aquellas actualizaciones que estn disponibles. Como partimos de 1.4.1.1 la primera actualizacin que nos muestra 1.4.2. Vamos a seleccionar para actualizar Mage_All_Latest que ser a la versin 1.4.2.1, y le damos a Commit Changes...Magento empezar a actualizar a la nueva versin de MCM y luego de forma automtica todo ir actualizndose a la versin 1.4.2.1 de forma global. Cuando termine, refrescamos la cach en el panel de administracin, y si queremos ms seguridad a travs de FTP o SSH borramos el contenido de la carpeta var/cache. Es imprescindible que durante todo los procesos vigilemos los que nos lanza la consola de MCM. Por ejemplo descubr que la extensin canonnical_url es incompatible con la nueva versin 1.5 y no me dejaba actualizar. As que, una vez que hemos refrescado la cach y antes de pasar a actualizar, la desinstalamos si la tuviramos, y del mismo modo procederamos con cualquier otra extensin que nos genere conflicto. Adems, como la estructura de la carpeta var/ vara,, debemos intentar revisarla, ya que nos habr creado una carpeta llamada packages que contiene todo lo instalado y actualizado hasta el momento. Despues de muchos intentos frustrados de actualizar sin xito ya que cuando terminaba me lanzaba un error tanto en el panel de administracin como en el front end, me d cuenta que me dejaba rastro de la extension canonnical_url as que borr el archivo xml que estaba dentro de esta carpeta y otro fichero llamado package que estba en la ruta /package/tmp que si lo abra contena referencias a la extensin canonical_url. Lo curioso es que las veces que fall, al buscar los errores del back-end y front-end en el foro, las soluciones que me lanzaban siempre eran relacionadas a una referencia que quedaba por ah dentro de los ficheros de configuracin (xml). Una vez deinstalada la extensin conflictiva, y borrados los rastros en la nueva carpeta packages, si salimos de MCM, nos daremos cuenta de que resulta que no tenemos el enlace en el men configuracin del panel. No importa, podemos entrar tecleando www.mitienda.com/downloader Otra vez en el MCM, volvemos a dar al botn comprobar actualizaciones, y ahora seleccionamos Mage_core_module como la extensin a actualizar a la versin 1.5.0.1. Debe empezar con la actualizacin de todo el core, si al finalizar no nos ha actualizado todos los componentes del core de Magento, entonces, los seleccinaremos manualmente, pero OJO, creo por precaucin que es mejor seleccionar de momento actualizaciones relativas al core y no a extensiones que tengamos instaladas. Haremos todo el proceso, vigilaremos la consola y si todo va bien, refrescamos cach. Ahora si debera aparecernos el men de MCM en el panel de administracin. Volvemos a entrar y procedemos a actualizar las extensiones instaladas una a una, y comprobando despus el funcionamiento general de nuestro sitio tanto del back com del front end. Un enlace que es bastante explicativo al respecto es el correspondiente artculo de la Wiki: http://www.magentocommerce.com/wiki/magento_connect_manager_upgrade
59 / 61
Mostrar las categoras listadas en una pgina Modificacin despus de actualizar a Magento 1.5
Una vez que se realiza una actualizacin de Magento es cuando de verdad nos creemos eso de que es mejor no tocar los ficheros del Core. Como vimos en la epgrafe Mostrar las categoras listadas en una pgina( pgina 19), para hacer esto nos decargbamos dos ficheros desde el enlace: http://foros.mgnt.es/showthread.php?1840-Soluci%F3n-ver-categor%EDas&highlight=solucion+categorias , y uno de ellos era para sustituir el fichero del Core que se encuentra en la ruta: app/code/Mage/Catalog/Model/Resource/Eav/Mysql4/Category.php Bien, pues con la actualizacin el problema es que el fichero Category.php es modificado y sustituido por el de la versin 1.5.x. Y me dirs, bueno pues te lo descargas y lo sustituyes de nuevo y listo. Pues no, pega un casque, el tpico error de llamada a un algo que no existe. Este error me lo daba en la lnea 841 y esa lnea lo que contena eran asteriscos de comienzo de un comentario...en fin que voy listo. El problema es que en las pginas de las categora no se mostraban las imgenes de las subcategoras, se muestra la descripcin y encima la etiqueta que le hayamos puesto a la imagen, pero no la imagen. Pasando Firebus descubro que el problema es que la plantilla que se emplea sub_category_listing.phtml (el segundo archivo que nos teniamos que bajar) no llama a la imagen. Reviso la plantilla y est bien, pero cuando ves el cdigo con Firebug te encuentras que src= .....es decir nada de nada. Bueno, pues con ms suerte que un quebrao, us la herramienta WinMerge y compar el archivo descargado con el archivo propio de la nueva versin de Magento. A parte de muchas diferencias encontr algo que era indicativo, en el archivo de la nueva versin de Magento, en la lnea 557 aproximandamente, encuentro la siguiente funcin: public function getParentCategories($category) { $pathIds = array_reverse(explode(',', $category->getPathInStore())); $categories = Mage::getResourceModel('catalog/category_collection') ->setStore(Mage::app()->getStore()) ->addAttributeToSelect('name') ->addAttributeToSelect('url_key') ->addFieldToFilter('entity_id', array('in'=>$pathIds)) ->addFieldToFilter('is_active', 1) ->load() ->getItems(); return $categories; } Y si la comparo con el archivo descargado encuentro que en este la funcin tiene la siguiente lnea: ->addAttributeToSelect('image') As que muy valiente yo, cojo y la copia en la misma posicin quedando tal que asi: public function getParentCategories($category) { $pathIds = array_reverse(explode(',', $category->getPathInStore())); $categories = Mage::getResourceModel('catalog/category_collection') ->setStore(Mage::app()->getStore()) ->addAttributeToSelect('name') ->addAttributeToSelect('url_key') ->addAttributeToSelect('image') ->addFieldToFilter('entity_id', array('in'=>$pathIds)) ->addFieldToFilter('is_active', 1) ->load() ->getItems(); return $categories; } Ahora seguimos buscando algo ms abajo y en la lnea 605 aproximandamente encuentro lo siguiente: /* @var $collection
Modificando Magento (Ver. 1.0 octubre 2010) 60 / 61
Mage_Catalog_Model_Resource_Eav_Mysql4_Category_Collection */ $collection->addAttributeToSelect('url_key') ->addAttributeToSelect('name') ->addAttributeToSelect('all_children') ->addAttributeToSelect('is_anchor') ->addAttributeToFilter('is_active', 1) ->addIdFilter($category->getChildren()) ->setOrder('position', 'ASC') ->joinUrlRewrite() ->load(); return $collection; } La nica diferencia con respecto al archivo descargado es que este ltimo tiene una lnea ms, que casualmente es como en el caso anterior:: ->addAttributeToSelect('image') As que cojo y la copio directamente, quedando como sigue: /* @var $collection Mage_Catalog_Model_Resource_Eav_Mysql4_Category_Collection */ $collection->addAttributeToSelect('url_key') ->addAttributeToSelect('name') ->addAttributeToSelect('image') ->addAttributeToSelect('all_children') ->addAttributeToSelect('is_anchor') ->addAttributeToFilter('is_active', 1) ->addIdFilter($category->getChildren()) ->setOrder('position', 'ASC') ->joinUrlRewrite() ->load(); return $collection; } Guardo el fichero (no sin antes hacer copia de seguridad del original), y recargo mi front-end, y sopresa las fotos de las subcategoras vuelven a aparecer con estos dos simples cambios.
61 / 61