|
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