Setzen Sie die Fehlermeldung einmal pro Seite Anforderung an
-
16-10-2019 - |
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.
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
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);
}