|
7 | 7 |
|
8 | 8 | use Magento\Framework\Controller\Result\Json;
|
9 | 9 | use Magento\Framework\Controller\ResultInterface;
|
10 |
| -use Magento\Framework\Message\MessageInterface; |
| 10 | +use Magento\Framework\Stdlib\Cookie\CookieSizeLimitReachedException; |
11 | 11 | use Magento\Framework\Translate\Inline\ParserInterface;
|
12 | 12 | use Magento\Framework\Translate\InlineInterface;
|
13 | 13 | use Magento\Framework\Session\Config\ConfigInterface;
|
@@ -101,21 +101,44 @@ public function afterRenderResult(
|
101 | 101 | ResultInterface $result
|
102 | 102 | ) {
|
103 | 103 | if (!($subject instanceof Json)) {
|
104 |
| - $newMessages = $this->messageManager->getMessages(true)->getItems(); |
| 104 | + $newMessages = []; |
| 105 | + foreach ($this->messageManager->getMessages(true)->getItems() as $message) { |
| 106 | + $newMessages[] = [ |
| 107 | + 'type' => $message->getType(), |
| 108 | + 'text' => $this->interpretationStrategy->interpret($message), |
| 109 | + ]; |
| 110 | + } |
105 | 111 | if (!empty($newMessages)) {
|
106 |
| - $messages = $this->getCookiesMessages(); |
107 |
| - foreach ($newMessages as $message) { |
108 |
| - $messages[] = [ |
109 |
| - 'type' => $message->getType(), |
110 |
| - 'text' => $this->interpretationStrategy->interpret($message), |
111 |
| - ]; |
112 |
| - } |
113 |
| - $this->setCookie($messages); |
| 112 | + $this->setMessages($this->getCookiesMessages(), $newMessages); |
114 | 113 | }
|
115 | 114 | }
|
116 | 115 | return $result;
|
117 | 116 | }
|
118 | 117 |
|
| 118 | + /** |
| 119 | + * Add new messages to already existing ones. |
| 120 | + * |
| 121 | + * In case if there are too many messages clear old messages. |
| 122 | + * |
| 123 | + * @param array $oldMessages |
| 124 | + * @param array $newMessages |
| 125 | + * @throws CookieSizeLimitReachedException |
| 126 | + */ |
| 127 | + private function setMessages(array $oldMessages, array $newMessages): void |
| 128 | + { |
| 129 | + $messages = array_merge($oldMessages, $newMessages); |
| 130 | + try { |
| 131 | + $this->setCookie($messages); |
| 132 | + } catch (CookieSizeLimitReachedException $e) { |
| 133 | + if (empty($oldMessages)) { |
| 134 | + throw $e; |
| 135 | + } |
| 136 | + |
| 137 | + array_shift($oldMessages); |
| 138 | + $this->setMessages($oldMessages, $newMessages); |
| 139 | + } |
| 140 | + } |
| 141 | + |
119 | 142 | /**
|
120 | 143 | * Set 'mage-messages' cookie with 'messages' array
|
121 | 144 | *
|
|
0 commit comments