domenica 4 gennaio 2015

Magento mettere offline un sito web proteggendo la SEO

Come mettere off-line un sito realizzato con Magento?

Dovete aggiornare il Vs. sito web Magento e avete la necessità di metterlo off-line per qualche tempo finchè lo modificate?


Una prima soluzione potrebbe essere “spegnerlo” e mettere una pagina di sito in costruzione, scaricare il sito in locale e poi rimetterlo on-line quando le modifiche sono state effettuate. In questo caso però, oltre agli ordini inevitabilmente persi, potrebbero esserci degli altri effetti collaterali, primo fra tutti la SEO del sito.


Google & colleghi, infatti, non trovando più le pagine del sito (se ricevono un errore 404) potrebbero decidere di penalizzarle e perderebbero quindi qualche posizione nelle SERP.

Utilizzare un errore 503

La soluzione può essere quindi di creare una pagina con errore 503 con questo codice:


<?php
header('HTTP/1.1 503 Service Temporarily Unavailable');
header('Status: 503 Service Temporarily Unavailable');
header('Retry-After: 300);
?>


in questo modo gli header inviati agli spider dei motori riceverebbero il messaggio di errore 503 e di ritornare dopo 300 secondi (generate questo valore dinamicamente in modo da stabilire un tempo di rimessa on-line del sito accettabile).

Utilizzare la pagina errore 503 di Magento

In Magento 1.4 e successivi è stata introdotta una gestione nativa degli errori 503 in modo da poter mettere il sito in mantainance mode.


Si tratta di una funzione molto utile perchè mantiene attivi tutti gli url del sito restituendo un erorre 503.


Per attivare la pagina è sufficiente inserire un file maintainance.flag nella root del sito web, non è importante il contenuto del file, basta che esista.

Personalizzare l’aspetto della pagina 503 di Magento

La pagina di errore 503 viene impostata in base ad un file specifico che si chiama 503.phtml e si trova nella cartella /errors/default (qui troverete anche i file e gli stili della pagina).


Potete quindi mostrare la grafica più adatta al design del vostro sito web e tutte le customizzazioni utili per ottenere una adeguata personalizzazione dei contenuti della Vostra pagina di errore 503 su Magento.


Gestione avanzata della pagina 503 e accesso per l’amministratore (o altri utenti specifici)

Mentre in sito è in mantenimento alcuni utenti potrebbero avere la necessità di accedere comunque (testers e sviluppatori).


Per fare questo è possibile utilizzare questo codice:


//definisco  un array di ip autorizzati
$ip = $_SERVER['REMOTE_ADDR'];
$allowed = array('127.0.0.1','89.23.233.10'); // these are the IP's that are allowed to view the site.


poi cambiare la linea del codice


if ( file_exists($maintenanceFile) ) {


in


if (file_exists($maintenanceFile) && !in_array($ip, $allowed)) {


in questo modo se il file maintainance.flag viene trovato e l’ip dell’utente non è compreso nella lista $allowed il sito va in mainanance mode, restituisce quindi un errore 503.


SEO blackhat


Potreste rendere l’accesso libero ai motori di ricerca mentre il sito è in maintainance mode, in questo modo non esisterebbe neanche la necessità di gestire un errore 503 - agli utenti non interessa gran che se è un 404 o un 503, in genere guardano solo il contenuto della pagina :-)


Si tratta però di una tecnica rischiosa perchè se i motori di ricerca si accorgono dell’utilizzo di tecniche di Cloaking possono decidere di bannare il dominio con danni notevolmente maggiori rispetto ai vantaggi ottenibili.


Cambiare la pagina di errore 503


La formattazione della pagina 503 standard di Magento potrebbe non essere coerente con il design del Vostro sito web, quindi potrebbe servire una customizzazione più radicale.


Per ottenere questo si può modificare la seguente riga della pagina index.php di Magento:


include_once dirname(__FILE__) . '/errors/503.php';


in


include_once dirname(__FILE__) . '/503/index.php';

quindi potete inserire nel codice della pagina index.php (contenuta in una cartella 503 che si trova sulla root) il codice che preferite.

giovedì 1 gennaio 2015

Eseguire un’importazione in Magento da riga di comando

Come eseguire un’importazione di prodotti con DataFlow nel catalogo di Magento da terminale



L’opzione Dataflow-Profile permette di effettuare aggiornamenti del catalogo senza dover scrivere codice PHP.


Tuttavia a volte può verificarsi un timeout del web server e rendere impossibile l’effettuazione dell’operazione, abbiamo già visto nel post relativo agli indici bloccati.


Eseguire un’importazione di prodotti da riga di comando può sembrare un’operazione un po’ complicata per chi non l’abbia mai effettuata ma talvolta può essere necessaria se il web server va in timeout.


Il codice PHP necessario



In effetti per eseguire un’importazione di dati da Magento utilizzando il DataFlow sono sufficienti poche righe di codice:


<?php
//verifichiamo che lo script venga eseguito da riga di comando
if (php_sapi_name() !== 'cli') {
    die ("Esegui lo script solo da shell");
}


//identifico l’ID del profilo di importazione Dataflow
$profileId = 7;


//includo Magento
require_once 'app/Mage.php';
umask(0);
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);


//instanzio il model dataflow/profile  
$profile = Mage::getModel('dataflow/profile');


//imposto l’utente che eseguirà lo script
$userModel = Mage::getModel('admin/user');
$userModel->setUserId(0);
Mage::getSingleton('admin/session')->setUser($userModel);


//carico il profilo di importazione
$profile->load($profileId);

//controllo che il profilo esista realmente
if (!$profile->getId()) {
   Mage::getSingleton('adminhtml/session')->addError('ERROR: Incorrect profile id');
}
 
Mage::register('current_convert_profile', $profile);


//eseguo il profilo
$profile->run();
$recordCount = 0;
$batchModel = Mage::getSingleton('dataflow/batch');


//comunico nell’output che il profilo è stato eseguito
echo "EXPORT COMPLETE. BATCHID: " . $batchModel->getId();
?>


Come lanciare lo script PHP da riga di comando


Dicevamo che lo script deve essere eseguito da riga di comando, quindi andiamo su terminale e digitiamo:


php export.php

fatto.

sabato 29 novembre 2014

Magento, verificare il controller utilizzato

Ottenere il nome del controller con la classe Mage_Core_Model_Url

Verificare il nome del controller attivo può essere utile per far comparire un output diverso a seconda delle situazioni.

Ad esempio immaginiamo di voler attribuire una classe CSS ad un tag a seconda che ci troviamo sulla home page o nella pagina del prodotto.

Verifica del controller nei file template (.phtml)

Possiamo ottenere il nome del controller che sta utilizzando Magento in questo modo:
$this->getRequest()->getControllerName();
Quindi se ci troviamo sulla home page otterremo "index", se ci troviamo nella scheda prodotto otterremo "product".

In questo modo avremo:
$controller=$this->getRequest()->getControllerName();
if( $controller=="index" ):
//sono sulla home page quindi
  $class="stile1";
elseif( $controller=="product" ):
//sono nella scheda prodotto
  $class="stile2";
endif;
echo '<span class="'.$class.'">Nome prodotto</span>
L'oggetto Request può anche restituire altre utili informazioni, ad esempio:
//nome della funzione usata dal controller
$this->getRequest()->getActionName();

//indirizzo della route corrente
$this->getRequest()->getRouteName();

//nome del modulo corrente
$this->getRequest()->getModuleName();

Richiamare il controller all'interno delle classi

getRequest può essere richiamato da $this solo nei file .phtml, ma se ci troviamo all'interno di una classe, $this restituirà la classe stessa, quindi il metodo getRequest() non sarà disponibile.

Per ottenere le informazioni sopra descritte sarà quindi necessario utilizzare Mage::app() al posto di $this.

La classe che ci viene in aiuto per ottenere queste informazioni è Mage_Core_Model_Url. Possiamo verificare il contenuto dell'oggetto con un print_r():

You can explore all requests with print_r.

echo "<pre>";
    print_r(Mage::app()->getRequest());
echo "</pre>";

domenica 16 novembre 2014

Magento - caricare un blocco statico tramite codice

Come caricare un blocco statico in un file phtml?

Per caricare un blocco statico all'interno di una pagina su Magento, potrebbe essere comodo effettuare direttamente una modifica all'interno di un file .phtml anzichè andare a modificare i layout XML.

Questa operazione può essere facilmente eseguita, dopo aver creato il blocco statico nel CMS.

Ad esempio, se vogliamo visualizzare il contenuto di un blocco che si chiama block_left_top possiamo utilizzare la seguente istruzione:
<?php echo Mage::app()->getLayout()->createBlock('cms/block')->setBlockId('block_left_top')->toHtml(); ?>
Vediamo insieme da cosa è composta:

  • Mage::app() mi permette di utilizzare il metodo statico app() della classe Mage, da cui partono tutte le chiamate al framework di Magento.
  • Mage::app() crea un oggetto app che tramite il metodo getLayout() crea un oggetto LAYOUT.
  • L'oggetto ottenuto tramite il metodo getLayout() può a sua volte utlizzare il metodo createBlock a cui passo il valore 'cms/block' per indicare che voglio che tipo di oggetto voglio utilizzare;
  • Il nuovo oggetto potrà poi assegnare il blocco statico all'oggetto Blocco creato per scegliere assegnare utilizzo li metodo setBlockId() a cui passerò come parametro l'identificatore del blocco, in questo caso ("block_left_top");
  • L'oggetto ottenuto può generare un output in HTML tramite appunto il metodo toHtml();
  • L'output generato può essere inserito in una variabile da utilizzare successivamente oppure stampato direttamente con echo;
Posso ottenere lo stesso risultato con un codice più compatto utilizzando il metodo statico getBlockSingleton che mi permette di creare direttamente un blocco, a cui poi assegnerò il tipo e l'identificatore prima di ottenere il rendering in formato HTML.

sabato 8 novembre 2014

Ottenere le informazioni dello store in Magento

Come ottenere il codice dello negozio (store) corrente su Magento tramite PHP?

Per accedere alle proprietà dello store attivo su Magento si instanzia l'oggetto store tramite il metodo app della classe statica Mage:

$app=Mage::app();

Poi lo store può essere richiamato con il metodo getStore

$store = $app->getStore();

Naturalmente posso eseguire tutto in un'unica operazione:

$store = Mage::app()->getStore();

A questo punto avrà accesso all'oggetto Mage_Core_Store_Model, un modello che mi permetterà di ottenere le seguenti informazioni:

//il nome del negozio
$name = $store->getName();

//il codice del negozio
$code = $store->getCode();

e, utilizzando i metodi del modello, tante altre utili info, ecco i più importanti esempi:

//il Website Id
websiteid=$store->getWebsiteId();

//se il negozio è attivo
$attivo=$store->getIsActive();

//l'url della home page del negozio
$home=getStore()->getHomeUrl();


martedì 4 novembre 2014

Aggiungere un prefisso a tutte le tabelle di un database Magento (e più in generale su MySQL)

Come aggiungere un prefisso alle tabelle del DB di Magento

In alcuni casi può capitare di dover sfruttare uno stesso database per più applicazione.

La soluzione: utilizzate un prefisso

Sia che le applicazioni siano di tipo diverso (ad esempio Magento e Drupal) che, a maggior ragione dello stesso tipo (due installazioni di Magento), potrebbero esserci delle tabelle con lo stesso nome, da qui la necessità di aggiungere un prefisso per evitare che una o più tabelle vadano a "sovrapporsi" e salti l'integrità dei dati.

Aggiungere il prefisso a tutte le tabelle tramite SQL

In fase di installazione possiamo specificare il prefisso delle tabelle, quindi il problema si risolve nella fase iniziale.


Come comportarsi nel caso di un DB esistente?

Nel caso in cui non si debba effettuare una nuova installazione e l'unica operazione fosse dover importare solo i db la situazione diventerebbe però un po' problematica. 

In questo caso sarebbe opportuno aggiungere il prefisso ad ogni tabella prima del primo database prima di importare il secondo.

Per effettuare questa operazione le opzioni a disposizione sarebbero le seguenti:

1) aprire il file dump con un editor di testo rinominare a mano tutte le tabelle con un copia/incolla del prefisso desiderato (molto esoso in termini di tempo e con un alto rischio di imprecisione);

2) aprire sempre il file, ma rinominare le tabelle con un trova/sostituisci aggiungedo il prefisso (elevatissimo rischio di imprecisione perchè le tabelle possono trovarsi in varie situazioni, CREATE, LOCK, etc.. e quindi difficilmente potremmo individuarle tutte)

3) utilizzare SQL e un po' di PHP

Ovviamente a mio avviso la soluzione 3) è l'unica praticabile.

Oltretutto l'operazione può essere eseguita in due step:

PRIMO STEP: ESEGUIRE UNA QUERY SQL

La seguente query creerà le istruzioni SQL da eseguire successivamente:

SELECT Concat('ALTER TABLE ', TABLE_NAME, ' RENAME TO hors_', TABLE_NAME, ';') FROM information_schema.tables WHERE table_schema = 'Sql718613_3'

Se usate PhpMyadmin (tipica situazione di partenza su tutti gli i principali servizi hosting), potete eseguire la query e poi esportare i risultati in un file SQL.

risultati query

Esportazione dei risultati

Il file ottenuto potrà essere reimportato su phpmyadmin ( o da riga di comando ) per essere eseguito, e tutte le tabelle saranno rinominate.





domenica 2 novembre 2014

Magento, cercare articoli non assegnati a nessuna categoria

Come cercare tutti gli articoli su Magento che non sono stati assegnati ad una categoria?

Avete inserito i prodotti del Vostro catalogo e volete creare un report della situazione relativa a quelli non assegnati a nessuna categoria?

Su Magento potete avere questa informazioni relativamente alla situazione di una categoria, per farlo è sufficiente andare nel backend:

tutti i prodotti della categoria corrente
Come fare per avere un report relativo a tutte le categorie?

Non esiste un'interfaccia nel backend di Magento che ci permetta di farlo, però può venirci in aiuto l'SQL.

La query da eseguire

Andate su phpmyadmin (o da riga di comando) ed eseguite la seguente query:
SELECT e.entity_id, e.sku FROM catalog_product_entity AS e LEFT JOIN catalog_category_product AS l ON l.product_id = e.entity_id WHERE l.category_id IS NULL
Nei risultati potete cambiare i campi della select per conoscere informazioni differenti, di norma lo sku è sufficiente per evitare query più complesse nel database EAV di Magento che potrebbero richiedervi numerose e articolate JOIN.

Se usate phpMyAdmin potete esportare i risultati in CSV per una più agevole lettura.