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.

entrare descrizione dell'immagine qui

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

Più

È stato utile?

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);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top