Categorie
Blog

Programmazione magento – Sovrascrivere un controller dell’amministrazione

In che modo si può sovrascrivere un controller dell’amministrazione?
Capita a volte di dovere sovrascrivere alcuni controllers dell’amministrazione, ad esempio, come è capitato oggi a me per dovere creare le fatture con un numero a scelta da parte dell’amministratore.
Per sovrascrivere sono necesari 3 passi:

  1. Creare un modulo
  2. Configurare il modulo nel suo config.xml in modo da dirgli di sovrascrivere un determinato controller
  3. Creare un controller che estende un altro controller, ovvero quello che si vuole riscrivere

Il punto 1 ed il punto 2 si risolvono creando un file di configurazione come il seguente:

[sourcecode language=”xml”]
<?xml version="1.0" encoding="utf-8"?>
<config>
<modules>
<Iacopop_Adminhtml>
<version>0.2.0</version>
</Iacopop_Adminhtml>
</modules>
<admin>
<routers>
<adminhtml>
<args>
<modules>
<Iacopop_Adminhtml before="Mage_Adminhtml">Iacopop_Adminhtml</Iacopop_Adminhtml>
</modules>
</args>
</adminhtml>
</routers>
</admin>
</config>
[/sourcecode]

Come si può notare nel file sto indicando che nella sezione routers dell’amministrazione magento (adminhtml) venga caricato prima il modulo Iacopop_Adminhtml (prima di Mage_Adminhtml).
Avendo indicato a Magento di caricare prima il mio modulo non dovrò fare altro che creare un controller che estende il controller che mi interessa. Nel mio caso volevo sovrascrivere il controller che genera la fattura per andare a modificare il numero di fattura prima della sua creazione. Andiamo a vedere come creare il nuovo controller:
[sourcecode language=”php”]
<?php

include_once("Mage/Adminhtml/controllers/Sales/Order/InvoiceController.php");

class Iacopop_Adminhtml_Sales_Order_InvoiceController extends Mage_Adminhtml_Sales_Order_InvoiceController {
/**
* Save invoice
* We can save only new invoice. Existing invoices are not editable
*/
public function saveAction()
{
//questo è il codice originale di magento della action save del controller Mage_Adminhtml_Sales_Order_InvoiceController
//possiamo inserire qua tutto il codice che ci permettere di sovrascrivere il metodo originale
codice ……..

}
}

?>
[/sourcecode]
Includendo il controller originale e estendendolo è possibile sovrascrivere tutti le funzioni e metodi di questo facendo in modo che tutte le azioni passino per il nuovo controller.

Categorie
Blog

Programmazione magento – Creare url rewrite

Ciao a tutti,
in questo post, il primo della serie intitolata “Programmazione Magento“, vi mostrerò come creare in maniera semplice i rewrite per tutte le pagine che volete, sia che queste siano dinamiche, ad esempio quelle generate da moduli personalizzati, oppure statiche, come quelle create da cms.

Cosa è un URL REWRITE?

Una url rewrite è una tecnica per la quale una url viene sostituita da un altra che riteniamo migliore per varie motivazioni, che possono essere leggibilità e ottimizzazione per i motori di ricerca.

Facciamo un esempio:
Abbiamo una ulr del tipo:
[sourcecode]
www.sito.com/page.php?id=237&regione=toscana&provincia=firenze
[/sourcecode]

Questa url è alquanto complessa, e si differenzia dalla altre per il tipo e valore dei parametri passati in GET. Per le motivazioni che abbiamo accennato prima vogliamo trasformare questa url nella seguente:
[sourcecode]
www.sito.com/toscana/firenze/pagina.html
[/sourcecode]

Per fare questo è necessario utilizzare le Url Rewrite di apache.
Non starò qua a spiegare come funzionano le url rewrite di apache, ma vi dico solamente che Magento è in grado di produrre e generare Url Rewrite per apache attraverso il suo “motore” di rewrite che è in grado di rispodere alle esigenze di creare url ben formattate ad esempio nei nostri moduli personalizzati.

Ma andiamo a vedere come è possibile creare url rewrite da codice di magento.
[sourcecode language=”php”]
Mage::getModel(‘core/url_rewrite’)
//si imposta il tipo di rewrite a personalizzato
->setIsSystem(false)
//si imposta lo store view per il quale la url rewrite verrà creata
->setStoreId(2)
//si imposta il path che si vuole riscrivere, è il path originale non riscritto
->setIdPath($originalurl)
//si imposta il path che si vuole riscrivere, è il path originale non riscritto
->setTargetPath($originalurl)
//si imposta la nuova url (quella riscritta)
->setRequestPath($new_url)
->save();
[/sourcecode]

Così è possibile creare un rewrite. Accedendo alla $new_url veniamo rediretti (in automatico ed in modo nascoto) alla vecchia url, ma il browser manterrà quella nuova nella barra degli indirizzi.

Se poi vi capita di dover ricercare delle url in base al path reale oppure a quello riscritto potete utilizzare le seguenti funzioni:
[sourcecode language=”php”]
Mage::getModel(‘core/url_rewrite’)->setStoreId(2)->loadByIdPath($originalurl)
Mage::getModel(‘core/url_rewrite’)->setStoreId(1)->loadByRequestPath($new_url)
[/sourcecode]

Per qualunque richiesta non esitate a contattarmi!

Categorie
Blog

Come migliorare le prestazioni di magento attraverso apache

Un semplice modo per migliorare le prestazioni di magento è customizzare apache facendo in modo che il server comprima il suo output prima che questo venga mandato ai client nella rete.

Per fare questo è necessario modificare il file .htaccess all’interno della propria installazione magento dicendogli di abilitare questa compressione.

I moduli che devono essere abilitati prima di modificare il file htaccess sono due: deflate e headers. In una distrubuzione debian-like questi moduli si abilitano con i seguenti due comandi:
[sourcecode language=”shell”]
a2enmod headers
a2enmod deflate
[/sourcecode]

Dopo avere abilitato i moduli è necessario modificare il prorprio htaccess decommentando il seguente codice se presente o inserendolo:

[sourcecode language=”shell”]
php_flag zlib.output_compression on

<IfModule mod_deflate.c>

############################################
## enable apache served files compression
## http://developer.yahoo.com/performance/rules.html#gzip

# Insert filter on all content
SetOutputFilter DEFLATE
# Insert filter on selected content types only
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript

# Netscape 4.x has some problems…
BrowserMatch ^Mozilla/4 gzip-only-text/html

# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip

# MSIE masquerades as Netscape, but it is fine
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

# Don’t compress images
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary

# Make sure proxies don’t deliver the wrong content
Header append Vary User-Agent env=!dont-vary

</IfModule>

[/sourcecode]

Potrete notare che le prestazioni del vostro magento miglioraranno del 200%!!.
Al prossimo articolo!!

Categorie
Blog

Come i colori influenzano gli acquisti

Lo shopping è influenzato da molti fattori, ed uno di questi è il colore, che non è solamente una caratteristica di un prodotto, ma è un fattore che fa si che in noi scattino delle reazioni che determinano le nostre future azioni. Stiamo parlando di una sorta di arte della persuasione, e di come i colori utilizzati in maniera corretta, nei prodotti, nei pulsanti e nell’aspetto di un e-commerce possono influenzare l’acquisto tanto da decretarne il buon o cattivo esito.

Questo articolo è ripresso dal blog kiss metrics e qua sotto la rappresentazione visuale (tramite una immagine, chiamata infographic) dell’impatto dei colori sugli ecommerce.


Categorie
Blog

Opzioni di configurazione di un modulo

Quando si progetta un modulo o una estensione capita di avere la necessità di inserire nel codice, tramite variabili statiche, oppure in file di configurazione dei parametri che permettono di impostare il nostro modulo. I parametri di configurazione possono essere disparati ed in questo articolo andremo a vedere come è possibile in Magento inserire delle stringhe di configurazione all’interno del nostro file config.xml che si trova all’interno della cartella etc di ogni modulo (app/code/local/Mio/Modulo/etc/config.xml).

La configurazione va aggiunta all’interno della sezione global nel seguente modo (andrò ad inserire una query nel file di configurazione in modo da poterla caricare quando ne ho bisogno ed una variabile custom):
[sourcecode language=”xml”]
<?xml version="1.0"?>
<config>
<global>

<namespace>
<query>
<select>
<all>
SELECT
*
FROM tabella
</all>
</select>
</query>
<aaa>
<bbb>
<ccc>variabile custom</ccc>
</bbb>
</aaa>
</namespace>

</config>

[/sourcecode]

Per poter accedere alla variabile di configurazione dovremo utilizzare il seguente codice:
[sourcecode language=”php”]
$conf_query = Mage::getConfig()->getNode(‘global/namespace/query/select’)->all;
$conf_var = Mage::getConfig()->getNode(‘global/namespace/aaa/bbb’)->ccc;
[/sourcecode]

Ecco a voi come inserire nei file di configurazione le vostre variabili personalizzate.

Categorie
Blog

Utilizzare un database mysql esterno per le estensioni

Capita di dover accedere a dati esterni al nostro magento, o addirittura in database che risiedono in host diversi da quello del magento.

E’ necessario quindi indicare al nostro modulo o estensione personalizzata i parametri di accesso al database; attualemente sto utilizzato la versione 1.4.2 di Magento che riesce a collegarsi solamente ad un database Mysql, se qualcuno di voi ha notizie di come collegare magento a postgres mi faccia sapere, sarò lieto di pubblicare la soluzione.

Quindi andiamo nel nostro file config.xml all’interno della directory nostrmodulo/etc/config.xml e inseriamo il seguente codice:

 
[sourcecode language=”xml”]
<?xml version="1.0"?>
<config>
<global>
<modules>
<my_module>
<version>0.1.0</version>
</my_module>
</modules>
<helpers>
<my_module>
<class>My_Module_Helper</class>
</my_module>
</helpers>
<resources>
<externaldb_write>
<connection>
<use>externaldb_database</use>
</connection>
</externaldb_write>
<externaldb_read>
<connection>
<use>externaldb_database</use>
</connection>
</externaldb_read>
<externaldb_setup>
<connection>
<use>core_setup</use>
</connection>
</externaldb_setup>
<externaldb_database>
<connection>
<host><![CDATA[hostname oppure ip]]></host>
<username><![CDATA[username da inserire]]></username>
<password><![CDATA[password da inserire]]></password>
<dbname><![CDATA[database name da inserire]]></dbname>
<model>mysql4</model>
<type>pdo_mysql</type>
<active>1</active>
</connection>
</externaldb_database>
</resources>
</global>
<frontend>
<routers>
<mymodule>
<use>standard</use>
<args>
<module>My_Module</module>
<frontName>mymodule</frontName>
</args>
</mymodule>
</routers>
<layout>
<updates>
<mymodule>
<file>mymodule.xml</file>
</mymodule>
</updates>
</layout>
</frontend>
</config>

[/sourcecode]

Ora che abbiamo configurato il nostro modulo per accedere ad un database mysql esterno personalizzato dobbiamo creare il codice in grado caricare la connessione al database e passare query a questo. Per farlo inseriremo un metodo di esempio nell’Helper del nostro modulo (cartella che contiene classi e funzioni di utilitità) nel seguente file nostrmodulo/Helper/Data.php:

[sourcecode language=”php”]
class My_Module_Helper_Data extends Mage_Core_Helper_Abstract {
public function getDataFromDb(){
$resource = Mage::getSingleton(‘core/resource’);
$conn = $resource->getConnection(‘externaldb_read’);
$queryString = "select * from table_example";

$results = $conn->fetchAll($queryString);
Mage::log($results);
foreach($results as $row) {
echo var_dump($row);
}

}
}
[/sourcecode]

Ecco fatto, basterà attivare il modulo nel file app/etc/modules/My_Module.xml nel seguente modo e richiamare l’helper nel controller o ovunque sia necessario.
[sourcecode language=”xml”]
<?xml version="1.0"?>
<config>
<modules>
<My_Module>
<active>true</active>
<codePool>local</codePool>
</My_Module>
</modules>
</config>
[/sourcecode]

Per richiamare l’helper all’interno del controller create il file My_Module/controllers/IndexController.php:

[sourcecode language=”php”]
class My_Module_IndexController extends Mage_Core_Controller_Front_Action
{
public function indexAction()
{
$result = Mage::helper("my_module)->getDataFromDb();
$this->loadLayout(array(‘default’));
$this->renderLayout();
}

}
[/sourcecode]

Ciao e alla prossima!

Categorie
Blog

Homepage personalizzata in magento

A tutti voi sarà capitato di dover creare una homepage personalizzata in magento, con il vincolo di inserire nella vostra pagina codice html e javascript. Il metodo che vi sto per mostrare è utile anche per creare landing pages per il vostro e-commerce.

Per fare questo vi sono due metodi:

  1. Creare la pagina all’interno del CMS di magento
  2. Creare la pagina come un file .phtml (template magento) ed associarla ad un blocco

1) Come creare la nostra homepage attraverso il cms di magento

Per creare una nuova homepage è necessario loggarsi all’interno dell’amministrazione, andare nel menu CMS ->Pages e cliccare su Aggiungi nuova pagina.

Dopoo avere impostato un titolo, una ulr ed un contenuto attraverso l’editor di magento salvatela con il nome che preferite, ad esempio nuova_homepage

Andiamo adesso in Sistema -> Configurazione -> Generale -> Web ed andiamo a selezionare la nostra nuova pagina nella tendina che appare in Pagine di Default  -> Home Page CMS come nella immagine sottostante:

Salvate ed avrete la vostra homepage personalizzata funzionante.

2) Creare la pagina come un file .phtml (template magento) ed associarla ad un blocco

A volte capita di volere salvare una pagina personalizzata come file .phtml, o perchè abbiamo bisogno di mantenere la pagina in svn/cvs oppure perchè la pagina contiene del codice javascript che va testato in maniera veloce (il cms non permettere di farlo poichè la pagina va salvata ad ogni modifica).

Per questo a volte è preferibile (e consigliato) creare una pagina da associare ad un blocco.

I passi sono i seguenti:

  1. Creare una pagina .phtml
  2. Creare un blocco associato al template del punto 1
  3. Creare una pagina di cms ed inserire al suo interno il blocco creato al punto 2

Facciamo un esempio pratico.

1) Creiamo un file .phtml con il contenuto che vogliamo:

[sourcecode language=”xml”]
magento/app/design/frontend/default/default/template/page/html/nuova_homepage.phtml
[/sourcecode]

2) Creiamo il blocco e colleghiamolo al template

inseriamo all’interno come contenuto del blocco il seguente codice creando il blocco con il nome nuova_homepage (questo nome sarà il block id ):

[sourcecode language=”xml”]
{{block type="page/html" template="page/html/nuova_homepage.phtml"}}
[/sourcecode]


Salviamo il blocco e come ultima cosa creiamo la nostra homepage dal cms di magento e colleghiamo questa nuova pagina al blocco precedentemente creato, inserendo nel contenuto della pagina il seguente codice:

[sourcecode language=”xml”]
{{block type="cms/block" block_id="nuova_homepage"}}
[/sourcecode]

Andiamo poi nell’amministrazione e impostiamo la nuova pagina come homepage come mostrato nel macro punto 1 di questo articolo (sistema -> configurazione -> generale -> web -> Pagine di Default  -> home page CMS)

Et voilà!! Il gioco è fatto.

Questo metodo può essere utilizzato anche per creare landing pages per le campagne pubblicitarie del vostro ecommerce.

Ciao, alla prossima.

Iacopo

Categorie
Blog

Cancellare tutte le url rewrite dei prodotti e categorie

Vi sarà capitato di rinominare delle categorie o prodotti e non fare caso al checkbox che sta sotto l’url key del prodotto o categoria che dice:

 

 

Il checkbox create permanent Redirect for old url crea dei redirect 301 quando si cambia la url di una categoria o un prodotto, in modo che gli spider ed i visitatori riescano a raggiungere la categoria ed il prodotto anche quando la url cambia.

Questa è una ottima cosa per i siti in produzioni che sono già stati indicizzati da google, ma se si vuole assegnare un nome ad una categoria che è stato precedentemente utilizzato a volte magento internviene nelle url inserendo un -1, -1 alla url, ad esempio facendo riferimento alla url della immagine soprastante quel design mi veniva trasformato in design-1.html

La domanda quindi è: Come posso cancellare tutte le url rewrite in modo da ripartire da zero con delle url pulite pulite?

La soluzione è cancellare la tabella core_url_rewrite con la seguente query:

[sourcecode language=”sql”]
delete FROM `core_url_rewrite`
[/sourcecode]

La tabella viene così svuotata. Voi non dovrete fare altro che loggarvi di nuovo nella amministrazione del vostro magento e reindicizzare le url delle categoria e prodotti:

Categorie
Blog

Aggiornamento prezzi dei prodotti in magento

  1. A quanti di voi sarà capitato di chiedersi: Come posso aggiornare i prezzi dei prodotti in modo che questi siano diversi da una store view all’altra?.

Molti clienti hanno la necessità di offrere un catalogo con prezzi personalizzati a seconda della lingua; questo può accadere perchè questi vogliono mantenere delle politiche di marketing al di fuori dell’italia o perchè vogliono fare in modo che il prezzo dei prodotti sia allineato a quello che viene fatto agli agenti per quel territorio così da non avere problematiche relative al fatto che nell’ecommerce i prezzi sono più bassi o alti.
Vi farò un esempio: il prodotto A viene venduto a 100 euro in tutta la comunità europea, mentre in america viene venduto in dollari ma con un sovrapprezzo di 10 euro; questo significa che il prezzo in dollari americani non è $ 141,8951 (come il cambio di 100 euro in dollari ci dice) ma bensi di $ 156,0846.

Chiaramente per prima cosa dovremo impostare il nostro magento in modo da avere due vetrine:

  • Vetrina italiana – lingua italian – valuta euro
  • Vetrina usa – lingua usa – valuta dollari

Non entrerò nel merito di come si può fare ad impostare lingue e valute, perchè la cosa è già stata affrontata in alcuni post precedenti, ma vi mostrerò come aggiorare i prezzi in modo che voi possiate applicare un prezzo custom ad una qualunque vetrina.

La tabella che andreamo ad aggiornare con una query SQL sarà la tabella catalog_product_entity_decimal perchè il prezzo viene salvato in questa. Prima di poter eseguire la query è però necessario andare a trovare l’ID dell’attributo prezzo.

Questo lo si fa accedendo al database del nostro magento (con un client mysql oppure con phpmyadmin) per cercare l’attributo con attribute_code uguale a  “price“:
[sourcecode language=”sql”]
select * from eav_attribute where attribute_code =’price’
[/sourcecode]

Con la precedente query abbiamo scoperto che il risulta è 64, ovvero che almeno in magento 1.4.2 il prezzo ha id (attribute_id) uguale a 64.
L’ultima cosa di cui abbiamo bisogno per poter effettuare l’aggiornamento è l’id dello store che lo andiamo a trovare nella tabella core_store con la query:
[sourcecode language=”sql”]
select * from core_store
[/sourcecode]

Se vogliamo aggiornare i prezzi per tutti gli store andremo a prendere lo store Admin (che ha store_id = 0) altrimenti scegliete quello che vi interessa e eseguite la seguente query di aggiornamento prezzi:

[sourcecode language=”sql”]
update `catalog_product_entity_decimal` prezzi, `catalog_product_entity` prodotti set prezzi.value= WHERE attribute_id =64 and store_id=0 and prezzi.entity_id=prodotti.entity_id
[/sourcecode]

Se poi volete aggiornare solamente alcuni prodotti identificati da un certo sku:
[sourcecode language=”sql”]
update `catalog_product_entity_decimal` prezzi, `catalog_product_entity` prodotti set prezzi.value= WHERE attribute_id =64 and store_id=0 and prezzi.entity_id=prodotti.entity_id and prodotti.sku=”
[/sourcecode]

 

Categorie
Blog

Traduzioni in Magento – Parte 3 – Tradurre una estensione

Ciao a tutti,
dopo avere visto come traddurre tradurre inline e come inserire i file di lingua (in formato csv) andiamo a vedere come sia possibile tradurre una estensione sviluppata in proprio.
Il prerequisito per fare in modo che una estensione possa essere tradotta è fare in modo che tutte le parole che intendiamo poi tradurre siano inserite nel nostro codice nel seguente formato:

[sourcecode language=”php”]
< ?php echo $this->__(‘parole da tradurre’) ?>
[/sourcecode]

dove i trattini bassi (underscores) stanno a significare la funzione per internazionalizzare le parole.

Dopo avere internazionalizzato la nostra estensione personalizzata andiamo a vedere come questa possa utilizzare il proprio file csv in cui inserire le traduzioni.

 

Apriamo il file di configurazione config.xml del nostro modulo che chiameremo “Traduzioni“:
[sourcecode language=”shell”]
app/code/local/Traduzioni/etc/config.xml
[/sourcecode]

Al suo interno troveremo la definizione del modulo attraverso il file Traduzioni.csv che si trova nella directory app/locale/it_IT (per l’italiano):
[sourcecode language=”xml”]
< ?xml version="1.0" encoding="utf-8"?>
<config>
<modules>
<traduzioni>
<version>1.0.0</version>
</traduzioni>
</modules>

<frontend>
<translate>
<modules>
<traduzioni>
<files>
<default>Traduzioni.csv</default>
</files>
</traduzioni>
</modules>
</translate>
</frontend>
<adminhtml>
<translate>
<modules>
<traduzioni>
<files>
<default>Traduzioni.csv</default>
</files>
</traduzioni>
</modules>
</translate>
</adminhtml>
</config>
[/sourcecode]

Quello che vi serve sarà poi tradurre il vostro modulo all’interno di tutte le cartelle app/locale/ inserendo un file Traduzioni.csv per ogni lingua.
Per rendere il modulo e le traduzioni attive andiamo sul file di configurazione app/etc/modules/Traduzioni.xml ed attiviamo il modulo impostando a true il campo active
[sourcecode language=”xml”]
< ?xml version="1.0"?>
<config>
<modules>
<traduzioni>
<active>true</active>
<codepool>local</codepool>
</traduzioni>
</modules>
</config>
[/sourcecode]

Buona traduzione a tutti!