77
88use Magento \Framework \Controller \Result \Json ;
99use Magento \Framework \Controller \ResultInterface ;
10- use Magento \Framework \Message \ MessageInterface ;
10+ use Magento \Framework \Stdlib \ Cookie \ CookieSizeLimitReachedException ;
1111use Magento \Framework \Translate \Inline \ParserInterface ;
1212use Magento \Framework \Translate \InlineInterface ;
1313use Magento \Framework \Session \Config \ConfigInterface ;
@@ -22,7 +22,7 @@ class MessagePlugin
2222 /**
2323 * Cookies name for messages
2424 */
25- const MESSAGES_COOKIES_NAME = 'mage-messages ' ;
25+ public const MESSAGES_COOKIES_NAME = 'mage-messages ' ;
2626
2727 /**
2828 * @var \Magento\Framework\Stdlib\CookieManagerInterface
@@ -101,11 +101,44 @@ public function afterRenderResult(
101101 ResultInterface $ result
102102 ) {
103103 if (!($ subject instanceof Json)) {
104- $ this ->setCookie ($ this ->getMessages ());
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+ }
111+ if (!empty ($ newMessages )) {
112+ $ this ->setMessages ($ this ->getCookiesMessages (), $ newMessages );
113+ }
105114 }
106115 return $ result ;
107116 }
108117
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+
109142 /**
110143 * Set 'mage-messages' cookie with 'messages' array
111144 *
@@ -166,24 +199,6 @@ private function convertMessageText(string $text): string
166199 return $ text ;
167200 }
168201
169- /**
170- * Return messages array and clean message manager messages
171- *
172- * @return array
173- */
174- protected function getMessages ()
175- {
176- $ messages = $ this ->getCookiesMessages ();
177- /** @var MessageInterface $message */
178- foreach ($ this ->messageManager ->getMessages (true )->getItems () as $ message ) {
179- $ messages [] = [
180- 'type ' => $ message ->getType (),
181- 'text ' => $ this ->interpretationStrategy ->interpret ($ message ),
182- ];
183- }
184- return $ messages ;
185- }
186-
187202 /**
188203 * Return messages stored in cookies
189204 *
0 commit comments