Magento, chiamare un metodo di un block da un template

Da un template, per chiamare un metodo definito nel Block corrispondente è sufficiente utilizzare la parola chiave $this.

Per esempio nel block: Page/Block/Html/Header.php è definito il metodo getWelcome(). Dalla relativa view: template/page/html/header.phtml è possibile invocare il metodo con l’istruzione:

<?php echo $this->getWelcome()?>

Per invocare quello stesso metodo da un file template differente è possibile ricorrere all’utilizzo di getBlockClassName().

Dal file template istanziare il blocco:

$className = Mage::getConfig()->getBlockClassName('page/html_header');
$block = new $className();

In questo modo è possibile chiamare il metodo getWelcome sull’oggetto $block:

<?php echo $block->getWelcome()?>
Annunci

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);
%d blogger hanno fatto clic su Mi Piace per questo: