Messaggio di errore Set una volta per pagina Richiesta
-
16-10-2019 - |
Domanda
Sto cercando di creare un modulo di checkout totale minimo che impedirà a qualcuno di check-out per un totale di meno di una quantità configurabile.
Sto utilizzando la sales_quote_save_before
evento per visualizzare un errore nella pagina di checkout / carrello quando è aperto.
<?xml version="1.0"?>
<config>
<frontend>
<events>
<sales_quote_save_before>
<observers>
<b2b>
<class>b2b/observer</class>
<method>checkTotalsCart</method>
</b2b>
</observers>
</sales_quote_save_before>
</events>
</frontend>
</config>
E nell'osservatore
public function checkTotalsCart()
{
if ($this->_hasCartError()) { /* does some checks, returns bool */
$this->_setErrorMessage();
}
}
protected function _setErrorMessage()
{
$session = Mage::getSingleton("b2b/session"); /* extends Mage_Core_Model_Session */
$session->addError($this->helper->getErrorMessage());
}
Il problema è che quando si aggiorna il carro dalla pagina del carrello, il messaggio di errore sta mostrando due volte. Credo che tale evento sta accadendo più volte.
ho cercato di verificare se il messaggio è stato precedentemente impostato con una variabile di sessione personalizzato
protected function _setErrorMessage()
{
$session = Mage::getSingleton("b2b/session");
if ($session->isErrorMessageAdded()) {
return;
}
$session->addError($this->helper->getErrorMessage());
$session->isErrorMessageAdded(true);
}
Ma che non ha funzionato neanche. Come posso fare in modo un messaggio di errore è solo mostrando una volta per ogni richiesta di pagina?
file relativo modulo
Soluzione
Il tuo pensiero era il suono, ma la vostra comprensione dei metodi di magia di Magento è un po 'traballante. Il hasX
non è un setter, si controlla solo per la presenza di una struttura di dati. Quindi, che ci si vuole il cambiamento
$session->hasErrorMessage(true);
a
$session->setErrorMessage(true);
Inoltre, se b2b/session
è un oggetto di sessione reale (cioè persiste cose alla sessione PHP per il successivo recupero) sarei diffidare di usarlo per qualcosa di simile. Se insistete accidentalmente il 'immobile error_message` alla sessione che significa che l'utente sarà sempre e solo vedere questo messaggio di errore una volta per sessione , quando (pare) il vostro desiderio è quello di avere loro vedere una volta per non valida tentativi di ordine.
Io di solito preferiscono una variabile di classe PHP statico per qualcosa di simile
static protected $_hasErrorMessage=false;
protected function _setErrorMessage()
{
$session = Mage::getSingleton("b2b/session");
if (self::$_hasErrorMessage) {
return;
}
$session->addError($this->helper->getErrorMessage());
self::$_hasErrorMessage = true;
}
Altri suggerimenti
Analizziamo addError
un momento. addError
è un metodo comodo per non dover effettuare chiamate messaggio di errore in questo modo:
Mage::getModel('core/message_collection')->add(Mage::getSingleton('core/message')->error($message));
Come si può vedere che è davvero disordinato.
La maggior parte delle implementazioni di addError
, compresa quella in Mage_Core_Model_Session_Abstract , avere un metodo chiamato addMessage
, che in sostanza fare ciò che è elencato sopra. Si utilizza un metodo locale chiamato getMessages
che implementa il modello di raccolta messaggio già descritto. Vedi sotto:
public function getMessages($clear=false)
{
//....stuff
if ($clear) {
$messages = clone $this->getData('messages');
$this->getData('messages')->clear();
Mage::dispatchEvent('core_session_abstract_clear_messages');
return $messages;
}
//...stuff
}
Quindi, come fa questo aiuto?
Si potrebbe fornire il metodo addMessage
nel proprio modello di B2B / sessione per passare condizionatamente true
a getMessages
per cancellare fuori, visualizzando in modo efficace solo l'ultimo set messaggio:
public function addMessage(Mage_Core_Model_Message_Abstract $message, $clear=false)
{
$this->getMessages($clear)->add($message);
Mage::dispatchEvent('core_session_abstract_add_message');
return $this;
}
Una soluzione che ho usato (pensato che non è troppo bella) è quello di scorrere i messaggi per la sessione e vedere se quella stringa già esistente
/**
* @var Mage_Checkout_Model_Session $_checkout
*/
protected $_checkout;
protected function _addMessage($message)
{
$messages = array_values((array)$this->_checkout->getMessages());
foreach ($messages[0] as $existingMessages) {
foreach($existingMessages as $existingMessage) {
$existingMessage = array_values((array)$existingMessage);
if ($existingMessage[1] == $message) {
// If the message is already set, stop here
return;
}
}
}
// Add this message to the session/checkout
$this->_checkout->addError($message);
}