Frage

Ich versuche, ein minimales Total -Checkout -Modul zu erstellen, das verhindert, dass jemand mit einer insgesamt weniger als konfigurierbaren Menge nachgibt.

Ich benutze die Veranstaltung sales_quote_save_before So zeigen Sie einen Fehler auf der Seite von Checkout/Cart an, wenn er geöffnet ist.

<?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>

Und im Beobachter

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());
}

Das Problem ist, dass bei der Aktualisierung des Wagens von der Karrenseite die Fehlermeldung zweimal angezeigt wird. Ich denke, dieses Ereignis passiert mehrmals.

enter image description here

Ich habe versucht zu überprüfen, ob die Nachricht zuvor mit einer benutzerdefinierten Sitzungsvariablen festgelegt wurde

protected function _setErrorMessage()
{
    $session = Mage::getSingleton("b2b/session");
    if ($session->isErrorMessageAdded()) {
        return;
    }
    $session->addError($this->helper->getErrorMessage());
    $session->isErrorMessageAdded(true);
}

Aber das hat auch nicht funktioniert. Wie kann ich sicherstellen, dass eine Fehlermeldung nur einmal pro Seitenanforderung angezeigt wird?


Relevante Moduldateien

Mehr

War es hilfreich?

Lösung

Ihr Denken war ein Ton, aber Ihr Verständnis von Magentos magischen Methoden ist ein wenig wackelig. Das hasX Ist es nicht ein Setter, es prüft nur das Vorhandensein einer Dateneigenschaft. Sie möchten sich also ändern

$session->hasErrorMessage(true);

zu

$session->setErrorMessage(true);

Auch wenn b2b/session ist ein tatsächliches Sitzungsobjekt (dh es bleibt die Dinge für die PHP -Sitzung für späteres Abrufen) Ich würde es vorsichtig sein, es für so etwas zu verwenden. Wenn Sie versehentlich die Eigenschaft 'ERROR_MESSAGE` an die Sitzung anhalten pro Sitzung, wenn (es erscheint) ist Ihr Wunsch, sie einmal pro ungültiger Auftragsversuche zu sehen.

Normalerweise bevorzuge ich eine statische PHP -Klassenvariable für so etwas

static protected $_hasErrorMessage=false;
protected function _setErrorMessage()
{
    $session = Mage::getSingleton("b2b/session");
    if (self::$_hasErrorMessage) {
        return;
    }
    $session->addError($this->helper->getErrorMessage());
    self::$_hasErrorMessage = true;
}

Andere Tipps

Lass uns erforschen addError ein Moment. addError ist eine Convenience -Methode, um keine Fehlermeldungen wie SO zu tätigen:

Mage::getModel('core/message_collection')->add(Mage::getSingleton('core/message')->error($message));

Wie Sie sehen können, ist das wirklich chaotisch.

Die meisten Implementierungen von addError, einschließlich dessen in Mage_core_model_session_abstract, haben eine Methode namens addMessage, die im Wesentlichen das tun, was oben aufgeführt ist. Es verwendet eine lokale Methode genannt getMessages Dies implementiert das bereits beschriebene Nachrichtensammlungsmuster. Siehe unten:

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
}

Wie hilft Ihnen das?

Sie könnten das zur Verfügung stellen addMessage Methode in Ihrem eigenen B2B/Sitzungsmodell, um bedingt zu bestehen true zu getMessages Um es zu beseitigen und nur den letzten Meldungssatz anzuzeigen:

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;   
}

Eine Lösung, die ich verwendet habe (dachte, es sei nicht zu schön) ist, die Nachrichten für die Sitzung durchzuschlitzen und zu prüfen, ob diese Zeichenfolge bereits vorhanden ist

/**
 * @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);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top