Magento, cambiare lo stato degli ordini

Esigenza: cambiare lo stato di un ordine in Magento.

Caso specifico: cambiare lo stato di un ordine da “canceled” a “processing“.

Dal pannello di amministrazione non è possbile in quanto per un ordine in stato canceled non esiste l’azione per un cambio di stato “processing”.

L’idea è quella di fare questo cambio di stato da codice.

Ovviamente non è possibile cambiare il valore dell’attributo status sul model Sales. Questo perchè il cambio di stato di un ordine implica anche altre operazioni. Per fare questo quindi occorre

  • individuare l’ordine su cui modificare lo stato;
  • se l’ordine esiste ed è nello stato che ci si aspetta possiamo procedere con la modifica
  • per la modifica utilizzare il metodo setState e NON setStatus.

Ecco il codice

<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
require_once(dirname(__FILE__) . '/../app/Mage.php');
Mage::app(0);
ini_set('display_errors', 1);
error_reporting(E_ALL);
//configurazione
define("_LOG_TARGET", 1); // 0 disabilitato, 1 echo, 2 log di magento;
define("_LOG_FILE", "updateOrder.log"); // file di log;
/*
 * stati disponibili
 * Mage_Sales_Model_Order::STATE_NEW         = 'new';
 * Mage_Sales_Model_Order::STATE_PROCESSING  = 'processing';
 * Mage_Sales_Model_Order::STATE_COMPLETE    = 'complete';
 * Mage_Sales_Model_Order::STATE_CLOSED      = 'closed';
 * Mage_Sales_Model_Order::STATE_CANCELED    = 'canceled';
 * Mage_Sales_Model_Order::STATE_HOLDED      = 'holded';
 */
define("_STATUS_FROM", Mage_Sales_Model_Order::STATE_CANCELED); // stato 
define("_STATUS_TO", Mage_Sales_Model_Order::STATE_PROCESSING); // stato target
define("_REALLY_UPDATE", false); // stato di parenza

$idOrdine = "123456";

function mylog($message) {
 if (_LOG_TARGET == 1) {
 echo "$message\n";
 } else if (_LOG_TARGET == 2) {
 Mage::log($message, null, _LOG_FILE);
 }
}

mylog("Inizio");
mylog("Carico ID ORDINE:".$idOrdine);
try {
$ordine = Mage::getModel('sales/order')->load($idOrdine);
if ($ordine && $ordine->getIncrementId() != "") {
 mylog("Caricato ORDINE :".$ordine->getIncrementId());
 mylog("         STATO  :".$ordine->getStatus());
 mylog("         CREATO :".$ordine->getCreatedAt());

 mylog("CONTROLLI STATO :");
 mylog("         CHECK  :controllo se stato è uguale a :"._STATUS_FROM);
 if ($ordine->getStatus() == _STATUS_FROM) {
 mylog("         CHECK  :stato ordine (".$ordine->getStatus().") uguale a ". _STATUS_FROM);
 if (_REALLY_UPDATE) {
 mylog("MODIFICA ORDINE :");
 mylog("         UPDATE :Procedo alla modifica. Stato destinazione: ". _STATUS_TO);
 $ordine->setState(_STATUS_TO, true)->save();
 } else {
 mylog("MODIFICA ORDINE :non effettuata per via della configurazione _REALLY_UPDATE");

 }
 } else {
 mylog("stato ordine (".$ordine->getStatus().") DIVERSO da ". _STATUS_FROM);

 }

} else {
 mylog("Ordine non trovato");

}
} catch (Exception $e) {
 myLog("Errore, ".$e->getMessage());
}

mylog("Fine");

?>

Symfony migrations e tabella migration_version

Se si utilizza Symfony e Doctrine si ha a disposizione la funzionalità di migrazione dello schema del database.
Nel caso in cui abbiate appena modificato il file schema.yml è possibile registrare le differenze tra lo schema appena modificato e il model attualmente in uso. Per fare questo eseguire il comando:

php symfony doctrine:generate-migrations-diff

Nella directory lib/migration/doctrine viene creato il file con le informazioni per lo “switch” tra la versione attuale del model e quello del nuovo schema (un file per ogni versione).
Per poter migrare all’ultima versione:

php symfony doctrine:migrate

Per poter migrare ad una versione precisa:

php symfony doctrine:migrate 25

Symfony per poter capire quale è la versione corrente dello schema, utilizza una tabella migration_version con un campo version.
Supponete di adottare questa funzionalità di migration dopo che il vostro sito e’ andato in produzione. Una esecuzione del comando doctrine:migrate comporta la ricreazione del database con tutte le tabelle. Per poter “agganciare” lo schema in produzione ad una precisa versione occorre creare la tabella migration_version e quindi inserire un record con il numero di versione. In questo caso di esempio il numero di versione definito è 24. Eseguire un doctrine:migrate 25 significa in questo caso apportare le sole modifiche allo schema relative al passaggio dalla versione 24 alla 25. Senza la tabella migration_version sarebbero stati eseguiti tutti gli step (dallo 0) fino ad arrivare alla versione 25.

CREATE TABLE IF NOT EXISTS `migration_version` (
  `version` int(11) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `migration_version` (`version`) VALUES
(24);

Symfony, upload immagini nell’ Admin generator

Per poter definire un campo di tipo upload in una form nell’applicazione creata con l’Admin Generator di Symfony è sufficiente modificare la form relativa al model interessato.

Nel metodo configure della form inserire queste righe:

  public function configure()
  {
    parent::configure();

    $this->widgetSchema['pic'] = new sfWidgetFormInputFileEditable(array(
      'label'     => 'Moodboard Image',
      'file_src'  => '/uploads/immagini/'.$this->getObject()->getPic(),
      'is_image'  => true,
      'edit_mode' => !$this->isNew(),
      'template'  => '
%file% %input% %delete% %delete_label%
', )); $this->validatorSchema['pic'] = new sfValidatorFile(array( 'required' => false, 'path' => sfConfig::get('sf_upload_dir').'/immagini/', 'mime_types' => 'web_images', )); $this->validatorSchema['pic_delete'] = new sfValidatorPass(); }

Dove ‘pic’ indica il nome del campo interessato (l’attributo del model e/o colonna della tabella del database).

Modificare anche il nome del metodo : getPic() (sostituendolo con il nome del metodo che corrisponde all’attributo del model e/o colonna della tabella del Database.

Image Magick: rimozione automatica del colore di sfondo

Con il comando convert di Image Magick è possibile rimuovere il colore di sfondo di una immagine.
In pratica il colore di sfondo viene rimpiazzato con una trasparenza.
Il link in cui viene spiegato come fare è:
http://www.imagemagick.org/Usage/channels/#mask_floodfill

In particolare ho provato questo e, nel mio caso, ha funzionato egregiamente:

 convert immagine_di_partenza.png -bordercolor white -border 1x1 -matte \
          -fill none -fuzz 20%  -draw 'matte 0,0 floodfill' \
          -shave 1x1 immagine_con_trasparenza.png

Linux Apache PHP MySql preparare l’ambiente di sviluppo

Mi sono trovato piu’ volte a dover configurare un ambiente di sviluppo LAMP su un sistema Ubuntu GNU/Linux fresco di installazione.

Ho creato uno script semplicissimo che installa tutti i pacchetti necessari per avere un ambiente con il database MySql, il servizio HTTP Apache e i moduli PHP necessari.

#!/bin/bash
# installazione database MySql (server e client)
sudo aptitude install mysql-server mysql-client
# installazione server Apache
sudo aptitude install apache2
# installazione PHP (con relativa integrazione in Apache)
sudo aptitude install php5 libapache2-mod-php5
sudo /etc/init.d/apache2 restart
# installazione dei moduli PHP più utilizzati
sudo aptitude install php5-mysql php5-curl php5-gd php5-idn php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-mhash php5-ming php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl php5-json
sudo /etc/init.d/apache2 restart
# installazione di phpmyadmin per la gestione del database MySql
sudo aptitude install phpmyadmin
Schermata-install_lamp.sh (~) - GVIM

Schermata-install_lamp.sh (~) - GVIM

Salvare questi comandi in un file install_lamp.sh e renderlo eseguibile:

chmod u+x install_lamp.sh

Per avviare l’installazione, eseguire:

./install_lamp.sh

Symfony, Admin Generator, personalizzare la lista

Symfony Admin Generator crea una action executeList in automatico basandosi sul model di riferimento.

Il comportamento predefinito è quello di recuperare tutti i record (paginandoli). Poi, le operazioni di “filtro” sono demandate all’utente il quale avrà nella parte destra a disposizione i filtri (definiti nella sezione filters).

Se si vuole recuperare fin dall’inizio un sottoinsieme di record (quindi alterando il comportamento di default) è possibile definire quale metodo della classe xxxTable si farà carico della definizione dei parametri di base per la query.

Un esempio pratico: nella lista non si vogliono vedere mai i record relativi ad un determinato status.

Nel file generator.yml nella sezione config list definire il parametro table_method (configurazione per Doctrine):

    config:
      list:
        title:   Suggestion list
        table_method: retrieveBackendSuggestionList

Nella classe Table del Model implementare il metodo definito nella configurazione dal parametro table_method:

public function retrieveBackendSuggestionList(Doctrine_Query $q) {
    $rootAlias = $q->getRootAlias();
    $q->andWhere($rootAlias.".status <> ?", 0);
    return $q;
  }

Creazione di un Modulo in Symfony

Per creare un modulo in Symfony eseguire il comando:

php symfony generate:module frontend api

Dove:

  • frontend: è il nome dell’applicazione in cui creare il modulo
  • api: è il nome del modulo
%d blogger hanno fatto clic su Mi Piace per questo: