Collection.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\Message;
  7. /**
  8. * Messages collection
  9. *
  10. * @api
  11. * @since 100.0.2
  12. */
  13. class Collection
  14. {
  15. /**
  16. * All messages by type array
  17. *
  18. * @var MessageInterface[]
  19. */
  20. protected $messages = [];
  21. /**
  22. * @var MessageInterface
  23. */
  24. protected $lastAddedMessage;
  25. /**
  26. * Adding new message to collection
  27. *
  28. * @param MessageInterface $message
  29. * @return $this
  30. */
  31. public function addMessage(MessageInterface $message)
  32. {
  33. if (!isset($this->messages[$message->getType()])) {
  34. $this->messages[$message->getType()] = [];
  35. }
  36. $this->messages[$message->getType()][] = $message;
  37. $this->lastAddedMessage = $message;
  38. return $this;
  39. }
  40. /**
  41. * Clear all messages except sticky
  42. *
  43. * @return $this
  44. */
  45. public function clear()
  46. {
  47. foreach ($this->messages as $type => $messages) {
  48. foreach ($messages as $id => $message) {
  49. /** @var $message MessageInterface */
  50. if (!$message->getIsSticky()) {
  51. unset($this->messages[$type][$id]);
  52. }
  53. }
  54. if (empty($this->messages[$type])) {
  55. unset($this->messages[$type]);
  56. }
  57. }
  58. if ($this->lastAddedMessage instanceof MessageInterface && !$this->lastAddedMessage->getIsSticky()) {
  59. $this->lastAddedMessage = null;
  60. }
  61. return $this;
  62. }
  63. /**
  64. * Get last added message if any
  65. *
  66. * @return MessageInterface|null
  67. */
  68. public function getLastAddedMessage()
  69. {
  70. return $this->lastAddedMessage;
  71. }
  72. /**
  73. * Get first even message by identifier
  74. *
  75. * @param string $identifier
  76. * @return MessageInterface|void
  77. */
  78. public function getMessageByIdentifier($identifier)
  79. {
  80. foreach ($this->messages as $messages) {
  81. foreach ($messages as $message) {
  82. /** @var $message MessageInterface */
  83. if ($identifier === $message->getIdentifier()) {
  84. return $message;
  85. }
  86. }
  87. }
  88. }
  89. /**
  90. * Delete message by id
  91. *
  92. * @param string $identifier
  93. * @return void
  94. */
  95. public function deleteMessageByIdentifier($identifier)
  96. {
  97. foreach ($this->messages as $type => $messages) {
  98. foreach ($messages as $id => $message) {
  99. /** @var $message MessageInterface */
  100. if ($identifier === $message->getIdentifier()) {
  101. unset($this->messages[$type][$id]);
  102. }
  103. if (empty($this->messages[$type])) {
  104. unset($this->messages[$type]);
  105. }
  106. }
  107. }
  108. }
  109. /**
  110. * Retrieve messages collection items
  111. *
  112. * @return MessageInterface[]
  113. */
  114. public function getItems()
  115. {
  116. $result = [];
  117. foreach ($this->messages as $messages) {
  118. $result = array_merge($result, $messages);
  119. }
  120. return $result;
  121. }
  122. /**
  123. * Retrieve all messages by type
  124. *
  125. * @param string $type
  126. * @return MessageInterface[]
  127. */
  128. public function getItemsByType($type)
  129. {
  130. return $this->messages[$type] ?? [];
  131. }
  132. /**
  133. * Retrieve all error messages
  134. *
  135. * @return MessageInterface[]
  136. */
  137. public function getErrors()
  138. {
  139. return $this->getItemsByType(MessageInterface::TYPE_ERROR);
  140. }
  141. /**
  142. * Retrieve messages count by type
  143. *
  144. * @param string $type
  145. * @return int
  146. */
  147. public function getCountByType($type)
  148. {
  149. $result = 0;
  150. if (isset($this->messages[$type])) {
  151. $result = count($this->messages[$type]);
  152. }
  153. return $result;
  154. }
  155. /**
  156. * Retrieve messages count
  157. *
  158. * @return int
  159. */
  160. public function getCount()
  161. {
  162. $result = 0;
  163. foreach ($this->messages as $messages) {
  164. $result += count($messages);
  165. }
  166. return $result;
  167. }
  168. }