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 ;
@@ -22,7 +22,7 @@ class MessagePlugin
22
22
/**
23
23
* Cookies name for messages
24
24
*/
25
- const MESSAGES_COOKIES_NAME = 'mage-messages ' ;
25
+ public const MESSAGES_COOKIES_NAME = 'mage-messages ' ;
26
26
27
27
/**
28
28
* @var \Magento\Framework\Stdlib\CookieManagerInterface
@@ -101,11 +101,44 @@ public function afterRenderResult(
101
101
ResultInterface $ result
102
102
) {
103
103
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
+ }
105
114
}
106
115
return $ result ;
107
116
}
108
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
+
109
142
/**
110
143
* Set 'mage-messages' cookie with 'messages' array
111
144
*
@@ -166,24 +199,6 @@ private function convertMessageText(string $text): string
166
199
return $ text ;
167
200
}
168
201
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
-
187
202
/**
188
203
* Return messages stored in cookies
189
204
*
0 commit comments