Modelo - Vista - Controlador
1) Modelo: Gestiona los datos y la lógica de la aplicación.
2) Vista: Presenta el modelo en una representación adecuada para el usuario final.
3) Controlador: El proceso que responde a eventos de usuario.
Handles - Blocks - Reference
HANDLES____
Si el nombre del tag es <default>, la aplicación sabe que sus actualizaciones de anidado se deben cargar en casi todas las páginas de la tienda antes de la carga de las páginas específicas de diseño ("casi todos" porque algunas páginas excepcionales, como la imagen del producto emergente no carga el diseño en el rango <default>).
Si Magento encuentra un tag distinto a <default> asignará las actualizaciones de anidado dentro de los tags de la página según indique el identificador. Por ejemplo, <catalog_product_view> contiene las actualizaciones de diseño para la página "ver producto", mientras que <catalog_product_compare_index> contiene los de la página de producto de comparación. Los tags están establecidos sin una comprensión amplia de la programación en Magento.
BLOCKS_____
Los atributos disponibles para <block> son los siguientes:
• type - Este es el identificador de la clase de módulo que define la funcionalidad del bloque. Este atributo no debe ser modificado.
• name - Este es el nombre con el que otros bloques puede hacer referencia al bloque en el que se asigna este atributo.
• before (and) after - Se trata de dos formas de colocar un bloque de contenido dentro de un bloque estructural. before="-" y after="-" son comandos que se utilizan para colocar el bloque en consecuencia en la parte superior o inferior de un bloque estructural.
• template - Este atributo determina la plantilla que representará a la funcionalidad del bloque en el que se asigna este atributo. Por ejemplo, si este atributo se le asigna "catalog/category/view.phtml, la aplicación se carga en app/design/frontend/template/catalog/category/view.phtml.
• action - <acción> se utiliza para controlar las funcionalidades de la tienda tales como la carga o descarga de un JavaScript. Una lista completa de los métodos de acción muy pronto estarán disponibles, pero mientras tanto la mejor manera de aprender acerca de los métodos de acción es jugar con ellos en el diseño disponible.
• as - Este es el nombre con el que una plantilla llama al bloque en el que se asigna este atributo. Cuando vea el getChildHtml (block_name) método de PHP llamado desde una plantilla, se refiere al bloque cuyo atributo "como" se le asigna "block_name el nombre. (Es decir, el método de =$this->getChildHtml("header")?> en la plantilla sería <block as="header">).
REFERENCE_____
<reference> se utiliza para hacer referencia a otro bloque. Al hacer una referencia a otro bloque, las actualizaciones dentro de <reference> se aplicarán al <block> correspondiente.
Para hacer la referencia, debe utilizar la referencia a un bloque con el atributo "name". Este atributo tendrá la etiqueta "name" del atributo <block>. Por lo tanto, si usted fuera a hacer una referencia por ejemplo a <reference name="right">, se dirigirá al bloque llamado name="right".
Mage::getModel
Mage::getModel('core/store')
significa lo siguiente: Coger modelo de app->code->core->Mage->Core->Model->Store.php
Layouts
<default> : será en todas las páginas por defecto
<catalog_category_default> : será la página de categorías
<catalog_category_layered> : será la página de categorías con filtros (los filtros serían a partir de atributos)
Css - Js
Añade css/js a partir de skin/frontend/default/default/ /nombre.js:
<action method="addItem">
<type>skin_js</type>
<name>ajax_catalog_list/jquery-1-4-1.min.js</name>
</action>
Añade css/js a partir de la raiz a la carpeta css o js segun addCss o addJs:
//xml
<action method="addCss"><stylesheet>my_ibanner/css/styles.css</stylesheet></action>
<action method="addJs"><script>my_ibanner/jquery.pikachoose.js</script></action>
Migraciones Magento
Al migrar de un servidor a otro hay que tener en cuenta lo siguiente:
1) El export con phpMyAdmin debes marcar el checkbox "Deshabilitar la revisión de las llaves extranjeras (foreign keys)". Si importas un SQL añadir --> SET FOREIGN_KEY_CHECKS = 0;
2) Modificar el fichero app/etc/local.xml para modificar la nueva conexión de base de datos.
3) Modificar de la tabla core_config_data de la base de datos los 2 siguientes registros:
a) path: web/unsecure/base_url ponerle el dominio de donde cuelga el magento nuevo.
b) path: web/secure/base_url ponerle el dominio de donde cuelga el magento nuevo.
Lenguajes Magento
Los lenguajes están en CSV's en app->locale->es_ES donde por código php se llama así:
$this->__('Loading next step...');
donde en el CSV debes poner 2 campos en
la misma linea separados por una coma (,) con el siguiente formato --> "Loading next step...", "Cargando ..."
Si quieres el proyecto en tu lenguaje debes bajarte el paquete primero desde http://www.magentocommerce.com/translations
Base de datos Magento
En app->etc->local.xml
Añadir bloque new products
Añadir el siguiente contenido en la parte administración, en CMS, el que tenga como id "home".
//xml
{{block type="catalog/product_new" name="home.catalog.product.new" alias="product_homepage" template="catalog/product/new.phtml"}}
Únicamente los productos marcados como "nuevos" usando las opciones "Set Product as New from Date" y "Set Product as New to Date" en la página de información general en el admin serán mostrados.
Añadir productos en Cesta
La adición de un producto simple
Por ID
Productos simples son más fáciles de añadir ya que hay menos opciones que deben ser enviadas. La estructura básica es la siguiente:
/path/to/app/checkout/cart/add?product=[id]&qty=[qty]
Donde [id] es el ID del producto y [qty] es la cantidad que desee agregar.
Para agregar un producto sencillo con opciones personalizadas simplemente añadir options[id]=[value] hasta el final. La estructura básica es la siguiente:
/path/to/magento/checkout/cart/add?product=$id&qty=$qty&options[$id]=$value
Por ejemplo:
http://magentoserver.com/checkout/cart/add?product=13&qty=1&options[12]=57
Puedes obtener el identificador de las opciones y su valor en la página del producto simple y sus desplegables.
Por SKU
Para agregar un producto por SKU, primero debemos crear una instancia de Mag::app() fuera de la presente aplicación. Puedes hacer esto así:
//php
include_once 'app/Mage.php';
Mage::app();
Mage::getSingleton('core/session', array('name' => 'frontend'));
Mediante la adición de una variable $_GET podemos obtener el sku y utilizar una instancia del modelo de producto para obtener el ID del producto.
$cProd = Mage::getModel('catalog/product');
$id = $cProd->getIdBySku("$sku");
Ahora que tenemos nuestro ID, podemos hacer algo útil con él - como añadirlo a la cesta con el valor por defecto de cantidad 1. Puede utilizar otras variables $_GET y condiciones para simular la adición de la cantidad de un producto mediante redirecciones header de PHP:
//php
header('Location: '. Mage::getUrl('checkout/cart/add', array('product' => $id)));
Adición de un paquete de productos
El formato de la URL para agregar un elemento del paquete a la cesta es el siguiente:
/path/to/app/checkout/cart/add/product/[id]/?bundle_option[[option_id]][]=[selection_id]
Tenemos que conseguir el option_id y selection_id la de la tabla catalog_product_bundle_selection en nuestra base de datos. La forma más sencilla de hacerlo es a través del módulo Core_Resource. Podemos utilizar nuestra página singleton en el ejemplo anterior para conectarse a la base de datos para una consulta.
//Code
$w = Mage::getSingleton('core/resource')->getConnection('core_write');
$result = $w->query("select `option_id`, `selection_id` from `catalog_product_bundle_selection` where `parent_product_id`=$id");
Esto nos dará nuestra conexión a la base de datos. Usando PDO y bucles para cada SKU dentro de un paquete ID dado nos encontramos que el siguiente código creará los parámetros para añadir a la cesta y luego redireccionar a la misma:
$_product = Mage::getModel('catalog/product')->load($id);
if ($_product->getTypeId() == 'bundle') {
$w = Mage::getSingleton('core/resource')->getConnection('core_write');
$result = $w->query("select `option_id`, `selection_id` from `catalog_product_bundle_selection` where `parent_product_id`=$id");
$route = "checkout/cart/add";
$params = array('product' => $id);
while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
$params['bundle_option['. $row[option_id] .']'][] = $row['selection_id'];
};
header("Location: ". Mage::getUrl($route, $params));
}
http://www.your_domain.com/checkout/cart/add?product=68&qty=1&super_attribute[528]=55&super_attribute[525]=56
La adición de un producto configurable a través de Querystring
Para añadir un producto configurable a través de el carro de Querystring necesita un formato URL como el siguiente:
http://www.your_domain.com/checkout/cart/add?product=68&qty=1&super_attribute[528]=55&super_attribute[525]=56
Acceder a parámetros
$_GET, $_POST & $_REQUEST Variables en Magento
Accediendo variables Get – $_GET
// Esto ...
$productId = $_GET['product_id'];
// ... es lo mismo que ...
$productId = Mage::app()->getRequest()->getParam('product_id');
// El segundo parametro de getParam te permite modificar un valor por defecto
// El valor por defecto es retornado si el valor GET que tu estás buscando no existe
$productId = Mage::app()->getRequest()->getParam('product_id', 44);
Accediendo variables Post – $_POST
// Esto ...
$postData = $_POST;
// ... es lo mismo que ...
$postData = Mage::app()->getRequest()->getPost();
// You can access individual variables like…
if (isset($postData['product_id'])) {
echo $postData['product_id'];
}
Manejar URLs
En admin Catalog->URL Rewrite management
URLs ficheros
De productos: catalog/product/view/id/191
De categorías: catalog/category/view/id/11
De Fabricantes: manufacturer/index/view/id/1933
De CMS: cms/page/view/id/**pageid**
Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_JS);
http://magento.demo/js/
Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_LINK);
http://magento.demo/index.php/
Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_MEDIA);
http://magento.demo/media/
Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_SKIN);
http://magento.demo/skin/
Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB);
http://magento.demo/
echo $this->getSkinUrl('images/content-top.png');
http://magento.demo/skin/frontend/default/default/images/content-top.png
Hacer bloques privados CMS
//CMS
{{block type="page/html" name="auth-redirect" as="auth-redirect" template="page/html/auth-redirect.phtml"}}
el código del block:
//Php
Mage::getSingleton('customer/session')->setBeforeAuthUrl($this-> getRequest()-> getRequestUri()); //save requested URL for later redirection
if(!Mage::getSingleton('customer/session')->isLoggedIn()) { // if not logged in
header("Status: 301");
header('Location: '.$this->getUrl('customer/account/login')) ; // send to the login page
exit;
}
Loading del Admin
#loading-mask {
color: #D85909;
font-size: 1.1em;
font-weight: bold;
opacity: 0.8;
position: absolute;
text-align: center
z-index: 500;
}
#loading-mask .loader {
background: none repeat scroll 0 0 #FFF4E9;
border: 2px solid #F1AF73;
color: #D85909;
font-weight: bold;
left: 50%;
margin-left: -60px;
padding: 15px 60px;
position: fixed;
text-align: center;
top: 45%;
width: 120px;
z-index: 1000;
}
<div style="left: -2px; top: 0px; width: 1423px; height: 813px;" id="loading-mask">
 <p id="loading_mask_loader" class="loader"><img alt="Loading..." src="http://domain.com/skin/adminhtml/default/default/images/ajax-loader-tr.gif"><br>Please wait...</p>
</div>
Mensaje OK
.success-msg {
background: url("images/success_msg_icon.gif") no-repeat scroll 10px 10px #EFF5EA !important;
border: 1px solid #95A486 !important;
color: #3D6611 !important;
}
<div id="messages">
<ul class="messages"><
<li class="success-msg">
<ul><li><span>The configuration has been saved.</span></li></ul>
</li>
</ul>
</div>
Redimensionar imágenes
//redimension width y height
$this->helper('catalog/image')->init($_product, 'small_image')->resize(125);
Redimensionar imagen que no sea producto
ejemplo(app\code\core\Mage\Catalog\Model\Category.php):
public function getResizedImage()
{
if(!$this->getImage())
return false;
$imageUrl = Mage::getBaseDir('media').DS."catalog".DS."category".DS.$this->getImage();
if (!is_file($imageUrl) )
return false;
$imageResized = Mage::getBaseDir('media').DS."catalog".DS."category".DS."resized".DS.$this->getImage();
if( file_exists($imageResized) )
return dirname($this->getImageUrl())."/resized/".$this->getImage();
if ( !file_exists($imageResized) && file_exists($imageUrl )) :
$imageObj = new Varien_Image($imageUrl);
$imageObj->constrainOnly(TRUE);
$imageObj->keepAspectRatio(TRUE);
$imageObj->keepFrame(FALSE);
$imageObj->quality(100);
$imageObj->resize(150, 150);
$imageObj->save($imageResized);
endif;
return dirname($this->getImageUrl())."/resized/".$this->getImage();
}
Tablas relacionadas Logs
Tablas que empiecen con log_* se pueden vaciar. Ocupan mucho. Y la tabla report_event.
Obtener items en cesta
$count = $this->helper('checkout/cart')->getSummaryCount();
Crear módulo Best Seller
Crear en core/Mage/Catalog/Block/Product una nueva clase, por ejemplo Best.php
class Mage_Catalog_Block_Product_Best extends Mage_Catalog_Block_Product_Abstract
{
}
Crear en app/design/frontend/default/default/template/catalog/product/best.phtml
Llamar al bloque desde algun CMS, como el de home así por ejemplo:
//CMS
{{block type="catalog/product_best" name="home.bestsellers.list" alias="product_best_homepage" template="catalog/product/best.phtml"}}
Crear módulo Most Viewed
Los mas vistos
public function getMostViewedProducts()
{
/**
* Number of products to display
* You may change it to your desired value
*/
$productCount = 5;
/**
* Get Store ID
*/
$storeId = Mage::app()->getStore()->getId();
/**
* Get most viewed product collection
*/
$products = Mage::getResourceModel('reports/product_collection')
->addAttributeToSelect('*')
->setStoreId($storeId)
->addStoreFilter($storeId)
->addViewsCount()
->setPageSize($productCount);
Mage::getSingleton('catalog/product_status')
->addVisibleFilterToCollection($products);
Mage::getSingleton('catalog/product_visibility')
->addVisibleInCatalogFilterToCollection($products);
return $products;
}
Mas vistos segun categoria actual
public function getMostViewedProducts()
{
// number of products to display
$productCount = 5;
// store ID
$storeId = Mage::app()->getStore()->getId();
// get most viewed products for current category
$products = Mage::getResourceModel('reports/product_collection')
->addAttributeToSelect('*')
->setStoreId($storeId)
->addStoreFilter($storeId)
->addViewsCount()
->addCategoryFilter(Mage::registry('current_category'))
->setPageSize($productCount);
Mage::getSingleton('catalog/product_status')
->addVisibleFilterToCollection($products);
Mage::getSingleton('catalog/product_visibility')
->addVisibleInCatalogFilterToCollection($products);
return $products;
}
Mas vistos los ultimos 30 dias
public function getMostViewedProducts()
{
// number of products to display
$productCount = 5;
// store ID
$storeId = Mage::app()->getStore()->getId();
// get today and last 30 days time
$today = time();
$last = $today - (60*60*24*30);
$from = date("Y-m-d", $last);
$to = date("Y-m-d", $today);
// get most viewed products for last 30 days
$products = Mage::getResourceModel('reports/product_collection')
->addAttributeToSelect('*')
->setStoreId($storeId)
->addStoreFilter($storeId)
->addViewsCount()
->addViewsCount($from, $to)
->setPageSize($productCount);
Mage::getSingleton('catalog/product_status')
->addVisibleFilterToCollection($products);
Mage::getSingleton('catalog/product_visibility')
->addVisibleInCatalogFilterToCollection($products);
return $products;
}
Módulo Ofertas
protected function _getProductCollection()
{
if (is_null($this->_productCollection)) {
$layer = $this->getLayer();
/* @var $layer Mage_Catalog_Model_Layer */
if ($this->getShowRootCategory()) {
$this->setCategoryId(Mage::app()->getStore()->getRootCategoryId());
} else {
}
// if this is a product view page
if (Mage::registry('product')) {
// get collection of categories this product is associated with
$categories = Mage::registry('product')->getCategoryCollection()
->setPage(1, 1)
->load();
// if the product is associated with any category
if ($categories->count()) {
// show products from this category
$this->setCategoryId(current($categories->getIterator()));
}
} else {
}
$origCategory = null;
if ($this->getCategoryId()) {
$category = Mage::getModel('catalog/category')->load($this->getCategoryId());
if ($category->getId()) {
$origCategory = $layer->getCurrentCategory();
$layer->setCurrentCategory($category);
}
}
$this->_productCollection = $layer->getProductCollection();
$todayDate = Mage::app()->getLocale()->date()->toString(Varien_Date::DATETIME_INTERNAL_FORMAT);
$this->_productCollection = Mage::getResourceModel('catalogsearch/advanced_collection')
->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes());
$this->_productCollection->addAttributeToFilter('special_from_date', array('date' => true, 'to' => $todayDate))
->addAttributeToFilter('special_to_date', array('or'=> array(
0 => array('date' => true, 'from' => $todayDate),
1 => array('is' => new Zend_Db_Expr('null')))
), 'left');
$this->prepareSortableFieldsByCategory($layer->getCurrentCategory());
if ($origCategory) {
$layer->setCurrentCategory($origCategory);
}
} else {
}
return $this->_productCollection;
}
Mostrar current category en list.phtml
//Clase Mage
Mage::getModel('catalog/layer')->getCurrentCategory()->getId();
Crear sesión frontend
//Clase Mage
Mage::getSingleton('core/session', array('name'=>'frontend'));
Configurar diseño BLANK
En Package dejar "default"
En Themes poner todos a "blank"
Cambiar lenguajes de "Select" a "Banderas"
Modificar el layout page.xml de
//XML Layout
<block type="page/switch" name="store_language" as="store_language" template="page/switch/languages.phtml">
a
<block type="page/switch" name="store_language" as="store_language" template="page/switch/flags.phtml">
Añadir ruta en wysiwyg
<img src="{{media url="wysiwyg/mainbanner.jpg"}}" alt="" > hace referencia a la carpeta media de raiz.
<a href="{{store direct_url="about-magento-demo-store"}}">About Us</a>
Mostrar código moneda
Mage::app()->getStore()->getCurrentCurrency()->getCurrencyCode();
Error--> Could not determine temp directory, please specify a cache_dir manually
Hay que hacer lo siguiente:
1) Crear una carpeta en raiz tmp/
2) Modificar el siguiente fichero: app/code/core/Zend/Cache/Backend/File.php
3) Change:
protected $_options = array(
'cache_dir' => 'null',
to
protected $_options = array(
'cache_dir' => 'tmp/',
Cambiar password admin magento
//SQL
UPDATE admin_user SET password=CONCAT(MD5('qXpassword'), ':qX') WHERE username='admin';
Leer feeds Zend Framework
//Dentro Magento
$feed = Zend_Feed_Reader::import('http://domain.wordpress.com/feed/'); ?>
$data = array(
'title' => $feed->getTitle(),
'link' => $feed->getLink(),
'dateModified' => $feed->getDateModified(),
'description' => $feed->getDescription(),
'language' => $feed->getLanguage(),
'entries' => array()
);
foreach ($feed as $entry) {
$edata = array(
'title' => $entry->getTitle(),
'description' => $entry->getDescription(),
'dateModified' => $entry->getDateModified(),
'authors' => $entry->getAuthors(),
'link' => $entry->getLink(),
'content' => $entry->getContent()
);
$data['entries'][] = $edata;
}
echo "";
print_r($data['entries']);
echo " ";
Tipos de bloque
Los tipos de bloque más comunes son los siguientes:
core/template = este bloque muestra un template definido por su atributo template. La mayoria de bloques definidos en el layout son de tipo, o subtipo core/template.
page/html = es un subtipo de core/template y define el bloque raiz (root). Todos los demas bloques son bloques hijos de este bloque. Como podemos ver en layout.xml:
page /html_head = define la seccion head de HTML, conteniendo los elementos JavaScript, CSS etc
page/html_header = define la parte de la página que contendrá el logo, links de la parte superior etc
page/template_links = este bloque muestra una lista de links, visible en el pie y la cabecera.
core/text_list = algunos bloques, como content, left, right son de tipo core/text_list. Cuando estos bloques son mostrados, todos sus bloques hijos son mostrados automáticamente, sin necesidad de utilizar el método getChildHtml().
page/html_wrapper = este bloque se utiliza para crear un bloque contenedor, que muestra sus bloques hijo dentro de una etiqueta HTML definida en la acción setHtmlTagName. Por defecto utiliza un
page/html_breadcrumbs = muestra los breadcrumbs de la página.
page/html_footer = muestra el area del pie, que contiene los links del pie, el mensaje del copyright etc
core/messages = este bloque muestra mensajes de error, noticias informativas etc
page/switch = este bloque puede ser utilizado para mostrar el selector de idioma, tienda etc
Cambiar € a la derecha del precio
Dentro de lib/Zend/Locale/Data/ tenemos que buscar el fichero xml que contiene a nuestro idioma. En ese caso abrimos el es.xml
Alrededor de la línea 2509 (así es como lo tengo yo que es al archivo default) tendremos este código:
¤ #,##0.00
{0} {1}
Lo que tenemos que mover es esto:
¤ #,##0.00
por esto:
#,##0.00 ¤
Cambiar vista por defecto ficha producto
1) Abrir app > design > frontend > default > deault > layout > catalog.xml
2) Buscar "Product view" y en las primeras lineas donde pone page/2columns-right.phtml, Cambiarlo por el layout que quiera: page/2columns-left.phtml por ejemplo, o 3columns.phtml.
SQL Magento No standard
//Acceso a base de datos
$write = Mage::getSingleton('core/resource')->getConnection('core_write');
$qry = "SELECT password FROM admin_user WHERE username='" . $useradmin ."'";
$resultat = $write->query($qry);
$row = $resultat->fetch();
Eliminar bloque en layout
<remove name="left"/>
Obtener precio y precio oferta
$special_preu = $_product->getData('special_price');
$final_preu = $_product->getData('final_price');
Limpiar Cache
Magento mantiene su cache en /var/cache, localizada dentro del directorio de instalación. Para borrarla simplemente eliminamos todo el contenido de esa carpeta y recargamos el proyecto.
Sistema de Logs
System > Configuration > Developer
Mage::log('My log entry');
Mage::log('My log message: '.$myVariable);
Mage::log($myArray);
Mage::log($myObject);
Mage::logException($e);
Aquí se almacenan: var/log/system.log
Quitar index.php de la URL
Sistema->Configuracion->Web->Optimización para motores de búsqueda Activar a Sí.
Configuración SMTP Magento
Step 1. Configurar Backend
Ir a backend > Configuration > System > smtp > (no te preocupes si es windows):
smtp.securecerver.net y 25 como puerto
Step 2. Editar fichero del Core
Ir a app/code/core/Mage/Core/Model/Email/Template.php y …
Reemplaza:
public function getMail()
{
if (is_null($this->_mail)) {
$this->_mail = new Zend_Mail('utf-8');
}
return $this>_mail;
}
Por:
public function getMail()
{
if (is_null($this->_mail)) {
/*Start Hack*/
$my_smtp_host = Mage::getStoreConfig('system/smtp/host');
$my_smtp_port = Mage::getStoreConfig('system/smtp/port');
$config = array(
'port' => $my_smtp_port, //optional - default 25
'auth' => 'login',
'username' => 'yourrelay@youremailhost.com',
'password' => 'youremailpassword'
);
$transport = new Zend_Mail_Transport_Smtp($my_smtp_host, $config);
Zend_Mail::setDefaultTransport($transport);
/*End Hack*/
$this->_mail = new Zend_Mail('utf-8');
}
return $this->_mail;
}
Saber layout de cada página
ejemplo: profileKey: mage::dispatch::controller::action::contacts_index_index
En app\code\core\Mage\Core\Controller\Varien\Action.php
public function renderLayout($output='')
{
$_profilerKey = self::PROFILER_KEY . '::' . $this->getFullActionName();
echo "profileKey: " . $_profilerKey . " ";
Uso de layout referente a un bloque
<reference name="before_body_end">
<block type="googleanalytics/ga" name="google_analytics" as="google_analytics" />
</reference>
Significa que va a buscar dentro de Mage->GoogleAnalytics->Block->ga.php y ejecuta la función _toHtml()
Poner breadcrumb en el header
//Code
echo $this->getLayout()->getBlock('breadcrumbs')->toHtml();
Añadir form_key en formularios
Mostrar mensajes de error o success
//Code
echo $this->getMessagesBlock()->getGroupedHtml();
Links Destacados
|