ButtonList.php 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Backend\Block\Widget\Button;
  7. /**
  8. * Button list widget
  9. *
  10. * @api
  11. * @since 100.0.2
  12. */
  13. class ButtonList
  14. {
  15. /**
  16. * @var ItemFactory
  17. */
  18. protected $itemFactory;
  19. /**
  20. * @param ItemFactory $itemFactory
  21. */
  22. public function __construct(ItemFactory $itemFactory)
  23. {
  24. $this->itemFactory = $itemFactory;
  25. }
  26. /**
  27. * @var array
  28. */
  29. protected $_buttons = [-1 => [], 0 => [], 1 => []];
  30. /**
  31. * Add a button
  32. *
  33. * @param string $buttonId
  34. * @param array $data
  35. * @param integer $level
  36. * @param integer $sortOrder
  37. * @param string|null $region That button should be displayed in ('toolbar', 'header', 'footer', null)
  38. * @return void
  39. * @SuppressWarnings(PHPMD.NPathComplexity)
  40. */
  41. public function add($buttonId, $data, $level = 0, $sortOrder = 0, $region = 'toolbar')
  42. {
  43. if (!isset($this->_buttons[$level])) {
  44. $this->_buttons[$level] = [];
  45. }
  46. $data['id'] = empty($data['id']) ? $buttonId : $data['id'];
  47. $data['button_key'] = $data['id'] . '_button';
  48. $data['region'] = empty($data['region']) ? $region : $data['region'];
  49. $data['level'] = $level;
  50. $sortOrder = $sortOrder ?: (count($this->_buttons[$level]) + 1) * 10;
  51. $data['sort_order'] = empty($data['sort_order']) ? $sortOrder : $data['sort_order'];
  52. $this->_buttons[$level][$buttonId] = $this->itemFactory->create(['data' => $data]);
  53. }
  54. /**
  55. * Remove existing button
  56. *
  57. * @param string $buttonId
  58. * @return void
  59. */
  60. public function remove($buttonId)
  61. {
  62. foreach ($this->_buttons as $level => $buttons) {
  63. if (isset($buttons[$buttonId])) {
  64. /** @var Item $item */
  65. $item = $buttons[$buttonId];
  66. $item->isDeleted(true);
  67. unset($this->_buttons[$level][$buttonId]);
  68. }
  69. }
  70. }
  71. /**
  72. * Update specified button property
  73. *
  74. * @param string $buttonId
  75. * @param string|null $key
  76. * @param string $data
  77. * @return void
  78. */
  79. public function update($buttonId, $key, $data)
  80. {
  81. foreach ($this->_buttons as $level => $buttons) {
  82. if (isset($buttons[$buttonId])) {
  83. if (!empty($key)) {
  84. if ('level' == $key) {
  85. $this->_buttons[$data][$buttonId] = $this->_buttons[$level][$buttonId];
  86. unset($this->_buttons[$level][$buttonId]);
  87. } else {
  88. /** @var Item $item */
  89. $item = $this->_buttons[$level][$buttonId];
  90. $item->setData($key, $data);
  91. }
  92. } else {
  93. /** @var Item $item */
  94. $item = $this->_buttons[$level][$buttonId];
  95. $item->setData($data);
  96. }
  97. break;
  98. }
  99. }
  100. }
  101. /**
  102. * Get all buttons
  103. *
  104. * @return array
  105. */
  106. public function getItems()
  107. {
  108. array_walk($this->_buttons, function (&$item) {
  109. uasort($item, [$this, 'sortButtons']);
  110. });
  111. return $this->_buttons;
  112. }
  113. /**
  114. * Sort buttons by sort order
  115. *
  116. * @param Item $itemA
  117. * @param Item $itemB
  118. * @return int
  119. */
  120. public function sortButtons(Item $itemA, Item $itemB)
  121. {
  122. return (int)$itemA->getSortOrder() <=> (int)$itemB->getSortOrder();
  123. }
  124. }