Académique Documents
Professionnel Documents
Culture Documents
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.
Eliminamos la lnea:
<p class="welcome-msg"><?php echo $this->getWelcome()?></p>
Y lo ubicamos en el lugar donde se referencia la columna derecha quedando el cdigo como sigue:
<block type="core/text_list" name="right" as="right" translate="label">
<label>Right Column</label>
<block type="page/template_links" name="top.links" as="topLinks"/>
</block>
Por si acaso:
Fmula
para
cambiar
posicin
encontrada
http://www.magentocommerce.com/boards/viewthread/19748/
en
el
enlace:
<?=$this->getLayout()->getBlock('top.links')->toHtml()?>
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') ?
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>
</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; }
La comentamos y listo:
<!-- <label for="search"><?php echo $this->__('Search:') ?></label> -->
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">
</reference>
</default>
Donde dice left ponemos right. Con este simple cambio hemos hecho todo lo dicho.
<customer_account>
<reference name="customer_account_navigation">
<action method="addLink" translate="label"
module="downloadable"><name>downloadable_products</name><path>downloadable/cu
stomer/products</path><label>My Downloadable Products</label></action>
</reference>
</customer_account>
-->
<downloadable_customer_products translate="label">
</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>
<customer_logged_out>
<reference name="right">
fichero
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
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-accountper. 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; }
.block-account-per .block-content-per li a:hover { color:#ea7900; }
.block-account-per .block-content-per li.last a { border-bottom:0; }
.block-account-per .block-content-per li.current { border-bottom:1px solid #ddd;
padding:3px 0; color:#ea7900; }
.block-account-per .block-content-per li.current.last { border-bottom:0; }
Y eso es todo. Cunto trabajo me cost, cunto tiempo, para algo que as visto parece muy simple.
Productos Configurables
Extensin imprescindible
Simple Configurable Products. Esta extensin permite que los productos configurables cojan el precio del
producto simple asociado y no el folln que monta Magento al respecto. Pero tambin permite que los datos
del producto simple asociado sean mostrados cuando se selecciona el atributo que le corresponde, inclusive
la imagen. Lo que la hace una extensin imprescindible.
* 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)):?>
<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>
<?php endif;?>
Por ejemplo.
bug
here:
Signature
- Magento ver. 1.3.2.4, 1.4.0.1
/var/cache
/var/locks
/var/report
Bueno esto est hecho para monos amaestrados como yono pregunten si se puede hacer esto o lo otro.
No entiendo absolutamente nada de los cdigos. Pero funciona de maravillas.
Bajar
los
dos
archivos
adjuntos
y
hacer
lo
app/code/Mage/Catalog/Model/Resource/Eav/Mysql4/Category.php y
Category.php (antes hacer backup del que ya se encuentra en tu web).
siguiente.
Ir
a
magento
reemplazarlo por el adjunto
Tambien
copiar
el
archivo
adjunto
sub_category_listing.phtml
default/tutemplate/template/catalog/navigaton/sub_navigation.html
en
app/design/frontend/
Despues ir a CMS > Static Blocks. Click en Add New Block y llenar as
Block Title: Sub Category Listing
Identifier: sub_category_listing
Status: Enabled
Content: {{block type="catalog/navigation" template="catalog/navigation/sub_category_listing.phtml"}}
Click Save
Ahora
hay
que
habilitar
Ir a: Catalog > Manage Categories.
el
static
blok
en
las
categoras
madres
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.
examinar
/**
* Magento
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* 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
/**
* Class constructor
*/
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)
{
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'))
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())
);
}
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
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);
$this->_getWriteAdapter()->query($sql);
}
/**
* 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);
$this->_getWriteAdapter()->query($sql);
}
/**
* 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(
'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;
}
/**
* 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
$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')
*/
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')>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');
/**
* 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;
}
/**
* 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
*/
$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
* @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;
//
//
$this->_getTree()->load();
return $this->_getTree()->getChildren($category->getId(), false);
}
/**
* Return all children ids of category (with category id)
*
$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;
}
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;
}
}
<li class="item">
<?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>
</div>
<h5><a href="<?php echo $_category->getURL() ?>" title="<?php echo
$this->htmlEscape($_category->getName()) ?>"><?php echo $this->htmlEscape($_category>getName()) ?></a></h5>
$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): ?>
idioma de la tienda.
<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
<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>
<!-- 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>
<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" />-->
<block type="reports/product_compared"
before="right.permanent.callout" name="right.reports.product.compared"
template="reports/product_compared.phtml" />
</reference>
</default>
</layout>
Se usa Dreamweavwer.
Crearemos el Banner con la imagen a nuestro gusto. Lo subiremos mediante FTP a nuestro sitio, en el
ejemplo usan la carpeta media, y yo tambin. Tendremos cuidado de darle permisos a la imagen (777) y que
el propietario sea el mismo que el del resto de las carpetas.
Ahora en nuestro navegador incluiremos la direccin de nuestro banner, por ejemplo:
http://www.midominio.com/media/mibanner.jpg
Debemos de ver la imagen en el navegador, si as es, copiamos la ruta. Abrimos el DreamWeaver y en un
nuevo documento HTML incluimos una imagen que es la ruta ruta que hemos copiado. Cuando Dreamweaver
cargue la imagen, seleccionamos la imagen y se activir la herramienta mapa. Ahora, y antes de marcar las
zonas que sern enlaces, iremos a nuestra pgina al primer contenido que deseemos mostrar en los enlaces
de nuestro banner, y copiamos la ruta. Ahora si en Dreamweaver, insertamos la imagen como hemos dicho
antes y en la ruta del enlace pegamos la que hemos copiado previamente. As lo haremos sucesivamente por
cada parte mapeada de la imagen que represente un enlace. Yo lo he hecho con el banner entero
directamente.
Ahora nos vamos al panel de administracin de Magento, abrimos el gestor de categora, en Dreamweaver
vamos a cambiar de vista, a vista Cdigo, seleccionamos el cdigo html que se ha generado entre las
etiquetas <body> y </body>, lo copiamos en en el campo descripcin de la pestaa general de la categora
pegamos el cdigo. Ea, ya tenemos el banner.
Options -Indexes
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.
Para habilitarlo rellenamos los campos de este Mtodo de pago del siguiente modo:
Habilitado: Si
Ttulo: Pondremos el ttulo que queremos que aparezca en el Front End por ejemplo: Pago por
Transferencia.
New Order Status: Lo suyo es dejarlo en pendiente.
Payment from Applicable Countries: Podemos indicar Todos los paises permitidos o especificar en la lista
que vendr justo a continuacin los pises en los que permitiremos esta forma de pago.
Payment from Specific Countries: Aqu seleccionaremos los pases en los que queremos tener esta forma
de pago. Se activa si en el campo anterior hemos seleccionado Especificar pases.
Make Check Payable to: Este lo dejamos en blanco.
Enviar cheque a: Aqu pondremos los datos del banco y del IBAN si hacemos comercio exterior.
Mnimo pedido: El pedido mnimos que aceptamos para esta forma de pago.
Mximo pedido: Justo lo contrario que lo anterior.
Ordenar Pedido: No estoy seguro, pero me da que es el orden en que queremos que aparezca esta forma
de pago respecto al resto que tengamos configuradas.
Bueno pues ya est disponible esta forma de pago, solo que en el front end nos aparece el siguiente texto
Enviar Cheque a
Bien vamos a cambiar este texto y adems vamos a incluir otro para avisar el cliente que el pedido no es
procesado hasta tanto no se verifique la transferencia, por lo que los envos pueden retrasarse 48 horas.
Bueno, para cambiar el texto Enviar Cheque a:, vamos a hacerlo desde el fichero de traduccin
/app/locale/es_ES/Mage_Payment.csv . Buscamos el texto y cambiamos la traduccin.
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.
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/
tema/layout/sales
creamos
dos
archivos:
Un formulario para enviar invitaciones: cuando una invitacin es enviada, el correo electrnico del
invitado es 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 de compra. A la orden de pago, los puntos son adjudicados al cliente.
Definicin de Reglas: la gestin de puntos puede ser hecha a travs de las Reglas de Precio del
Catlogo o las Reglas de Precios del Carrito de compras.
Configuracin del Mdulo: La interfaz de administracin nos permite habilitar o deshabilitar los puntos
de 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 canjeo de puntos.
Crear una o varias Reglas de Precios del Catlogo o del Carrito de compras para incrementar la
fidelidad y los puntos del patrocinador.
Crear una cuenta de OpenInviter, y activar esta caracterstica dentro de la configuracin del mdulo
de Patrocinio para que los clientes puedean invitar a su listas de contactos de msn, yahoo, etc.. de
forma masiva.
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:
<!--
</reference>
Y tambin en la lnea:
<reference name="left">
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
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 ir despus del carrito de compra. Pues nada incluimos la siguiente lnea:
<block type="reports/product_viewed" before="right.permanent.callout"
name="left.reports.product.viewed" template="reports/product_viewed.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>
-->
<!--<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.
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() {
$orderState = Mage_Sales_Model_Order::STATE_PROCESSING;
$orderStatus = Mage::getModel('servired/standard')>getConfigData('order_status');
//$orderStatus = Mage::getModel('servired/standard')>getConfigData('order_status');
//$orderStatus = Mage_Sales_Model_Order::STATE_PROCESSING;
//$comment=null;
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>
-->
>)</small>
</div>
<div><spam class="notice-msg-propio">Utilice la tecla Ctrl para selecciones
multiples.</spam></div>
<?php break;
case 'select': ?>
El estilo que he aplicado al texto es una copia del estilo notice-msg, y lo he llamado notice-msg-propio, al
objeto de ajustarlo a esta plantilla y no modificar el original con lo que me podra encontrar con sorpresas
desagradables.
Ahora en la hoja de estilos crearemos este estilo, y hay que hacerlo en dos lneas, porque existen dos lneas
que lo referencian. Lo que hacemos es copiar esas dos lneas y duplicarlas, cambiarles el nombre y luego
ajustar los valores a nuestra conveniencia. A continuacin se muestran esta lneas en negrita y en la posicin
en que yo las he puesto:
.notice-msg { border-style:solid !important; border-width:1px !important;
background-position:10px 9px !important; background-repeat:no-repeat !
important; min-height:24px !important; padding:8px 8px 8px 32px !important;
font-size:11px !important; font-weight:bold !important; }
.notice-msg-propio { border-style:solid
background-position:5px 5px !important;
height:17px !important; padding:8px 8px
important; font-weight:bold !important;
float:left !important; }
TRUNCATE `sales_flat_creditmemo_grid`;
TRUNCATE `sales_flat_creditmemo_item`;
TRUNCATE `sales_flat_invoice`;
TRUNCATE `sales_flat_invoice_comment`;
TRUNCATE `sales_flat_invoice_grid`;
TRUNCATE `sales_flat_invoice_item`;
TRUNCATE `sales_flat_order`;
TRUNCATE `sales_flat_order_address`;
TRUNCATE `sales_flat_order_grid`;
TRUNCATE `sales_flat_order_item`;
TRUNCATE `sales_flat_order_payment`;
TRUNCATE `sales_flat_order_status_history`;
TRUNCATE `sales_flat_quote`;
TRUNCATE `sales_flat_quote_address`;
TRUNCATE `sales_flat_quote_address_item`;
TRUNCATE `sales_flat_quote_item`;
TRUNCATE `sales_flat_quote_item_option`;
TRUNCATE `sales_flat_quote_payment`;
TRUNCATE `sales_flat_quote_shipping_rate`;
TRUNCATE `sales_flat_shipment`;
TRUNCATE `sales_flat_shipment_comment`;
TRUNCATE `sales_flat_shipment_grid`;
TRUNCATE `sales_flat_shipment_item`;
TRUNCATE `sales_flat_shipment_track`;
TRUNCATE `sales_invoiced_aggregated`;
TRUNCATE `sales_invoiced_aggregated_order`;
TRUNCATE `sales_order_aggregated_created`;
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;
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; ?>
$elementClass);
in
Update.php
add
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
Cuando demos de alta la tienda en el buscador, solo tendremos que proporcionar esta URL para pasar el
fichero al completo.
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>
<reference name="content">
<block type="blog/blog" name="blog"
template="aw_blog/blog.phtml"/>
<remove name="right.permanent.callout"></remove>
</reference>
</blog_index_index>
|
3
|
DEFAULT
|
http://www.tudominio.com.ar/magento/|
|
|
|
web/unsecure/base_url
web/secure/base_url
|
|
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
->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
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.