Skip to content

Commit 0c6c410

Browse files
committed
MC-17630: Selector in coupons grid does not respect select all/select visible values
1 parent 7d5f1b0 commit 0c6c410

File tree

7 files changed

+262
-28
lines changed

7 files changed

+262
-28
lines changed

app/code/Magento/Backend/Block/Widget/Grid/Extended.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -588,7 +588,7 @@ public function setMassactionBlockName($blockName)
588588
/**
589589
* Retrieve massaction block
590590
*
591-
* @return $this
591+
* @return \Magento\Backend\Block\Widget\Grid\Massaction\Extended
592592
*/
593593
public function getMassactionBlock()
594594
{

app/code/Magento/Backend/Block/Widget/Grid/Massaction/Extended.php

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,19 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6-
76
namespace Magento\Backend\Block\Widget\Grid\Massaction;
87

8+
use Magento\Framework\Data\Collection\AbstractDb;
9+
use Magento\Framework\DB\Select;
10+
911
/**
1012
* Grid widget massaction block
1113
*
1214
* @api
1315
* @deprecated 100.2.0 in favour of UI component implementation
1416
* @method \Magento\Quote\Model\Quote setHideFormElement(boolean $value) Hide Form element to prevent IE errors
1517
* @method boolean getHideFormElement()
16-
* @author Magento Core Team <core@magentocommerce.com>
18+
* @author Magento Core Team <core@magentocommerce.com>
1719
* @TODO MAGETWO-31510: Remove deprecated class
1820
* @since 100.0.2
1921
*/
@@ -156,7 +158,7 @@ public function getItemsJson()
156158
*/
157159
public function getCount()
158160
{
159-
return sizeof($this->_items);
161+
return count($this->_items);
160162
}
161163

162164
/**
@@ -248,6 +250,8 @@ public function getApplyButtonHtml()
248250
}
249251

250252
/**
253+
* Get mass action javascript code
254+
*
251255
* @return string
252256
*/
253257
public function getJavaScript()
@@ -264,6 +268,8 @@ public function getJavaScript()
264268
}
265269

266270
/**
271+
* Get grid ids in JSON format
272+
*
267273
* @return string
268274
*/
269275
public function getGridIdsJson()
@@ -281,15 +287,24 @@ public function getGridIdsJson()
281287
$massActionIdField = $this->getParentBlock()->getMassactionIdField();
282288
}
283289

284-
$gridIds = $allIdsCollection->setPageSize(0)->getColumnValues($massActionIdField);
285-
286-
if (!empty($gridIds)) {
287-
return join(",", $gridIds);
290+
if ($allIdsCollection instanceof AbstractDb) {
291+
$idsSelect = clone $allIdsCollection->getSelect();
292+
$idsSelect->reset(Select::ORDER);
293+
$idsSelect->reset(Select::LIMIT_COUNT);
294+
$idsSelect->reset(Select::LIMIT_OFFSET);
295+
$idsSelect->reset(Select::COLUMNS);
296+
$idsSelect->columns($massActionIdField);
297+
$idList = $allIdsCollection->getConnection()->fetchCol($idsSelect);
298+
} else {
299+
$idList = $allIdsCollection->setPageSize(0)->getColumnValues($massActionIdField);
288300
}
289-
return '';
301+
302+
return implode(',', $idList);
290303
}
291304

292305
/**
306+
* Retrieve massaction block js object name
307+
*
293308
* @return string
294309
*/
295310
public function getHtmlId()

app/code/Magento/Review/Block/Adminhtml/Grid.php

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
namespace Magento\Review\Block\Adminhtml;
67

78
/**
89
* Adminhtml reviews grid
@@ -13,11 +14,7 @@
1314
* @method \Magento\Review\Block\Adminhtml\Grid setCustomerId() setCustomerId(int $customerId)
1415
* @method \Magento\Review\Block\Adminhtml\Grid setMassactionIdFieldOnlyIndexValue()
1516
* setMassactionIdFieldOnlyIndexValue(bool $onlyIndex)
16-
*
17-
* @author Magento Core Team <core@magentocommerce.com>
1817
*/
19-
namespace Magento\Review\Block\Adminhtml;
20-
2118
class Grid extends \Magento\Backend\Block\Widget\Grid\Extended
2219
{
2320
/**
@@ -349,6 +346,18 @@ protected function _prepareMassaction()
349346
);
350347
}
351348

349+
/**
350+
* @inheritdoc
351+
*/
352+
protected function _prepareMassactionColumn()
353+
{
354+
parent::_prepareMassactionColumn();
355+
/** needs for correct work of mass action select functionality */
356+
$this->setMassactionIdField('rt.review_id');
357+
358+
return $this;
359+
}
360+
352361
/**
353362
* Get row url
354363
*

app/code/Magento/SalesRule/Block/Adminhtml/Promo/Quote/Edit/Tab/Coupons/Grid.php

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,7 @@ public function __construct(
4646
}
4747

4848
/**
49-
* Constructor
50-
*
51-
* @return void
49+
* @inheritdoc
5250
*/
5351
protected function _construct()
5452
{
@@ -58,9 +56,7 @@ protected function _construct()
5856
}
5957

6058
/**
61-
* Prepare collection for grid
62-
*
63-
* @return $this
59+
* @inheritdoc
6460
*/
6561
protected function _prepareCollection()
6662
{
@@ -71,15 +67,20 @@ protected function _prepareCollection()
7167
*/
7268
$collection = $this->_salesRuleCoupon->create()->addRuleToFilter($priceRule)->addGeneratedCouponsFilter();
7369

70+
if ($this->_isExport && $this->getMassactionBlock()->isAvailable()) {
71+
$itemIds = $this->getMassactionBlock()->getSelected();
72+
if (!empty($itemIds)) {
73+
$collection->addFieldToFilter('coupon_id', ['in' => $itemIds]);
74+
}
75+
}
76+
7477
$this->setCollection($collection);
7578

7679
return parent::_prepareCollection();
7780
}
7881

7982
/**
80-
* Define grid columns
81-
*
82-
* @return $this
83+
* @inheritdoc
8384
*/
8485
protected function _prepareColumns()
8586
{
@@ -121,9 +122,7 @@ protected function _prepareColumns()
121122
}
122123

123124
/**
124-
* Configure grid mass actions
125-
*
126-
* @return $this
125+
* @inheritdoc
127126
*/
128127
protected function _prepareMassaction()
129128
{
@@ -146,9 +145,7 @@ protected function _prepareMassaction()
146145
}
147146

148147
/**
149-
* Get grid url
150-
*
151-
* @return string
148+
* @inheritdoc
152149
*/
153150
public function getGridUrl()
154151
{
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\SalesRule\Block\Adminhtml\Promo\Quote\Edit\Tab\Coupons;
9+
10+
use Magento\Backend\Block\Widget\Grid\Massaction\Extended as MassActionBlock;
11+
use Magento\Framework\App\ResourceConnection;
12+
use Magento\Framework\Registry;
13+
use Magento\Framework\View\LayoutInterface;
14+
use Magento\SalesRule\Model\RegistryConstants;
15+
use Magento\SalesRule\Model\ResourceModel\Rule\Collection as RuleCollection;
16+
use Magento\SalesRule\Model\Rule;
17+
use Magento\TestFramework\Helper\Bootstrap;
18+
use PHPUnit\Framework\TestCase;
19+
20+
/**
21+
* Class to test Coupon codes grid
22+
*
23+
* @magentoDbIsolation enabled
24+
* @magentoAppArea adminhtml
25+
* @magentoDataFixture Magento/SalesRule/_files/cart_rule_with_coupon_list.php
26+
* @see \Magento\SalesRule\Block\Adminhtml\Promo\Quote\Edit\Tab\Coupons\Grid
27+
*/
28+
class GridTest extends TestCase
29+
{
30+
/**
31+
* @var LayoutInterface
32+
*/
33+
private $layout;
34+
35+
/**
36+
* @var Rule
37+
*/
38+
private $salesRule;
39+
40+
/**
41+
* @var Registry
42+
*/
43+
private $registry;
44+
45+
/**
46+
* @var ResourceConnection
47+
*/
48+
private $resourceConnection;
49+
50+
/**
51+
* @inheritdoc
52+
*/
53+
protected function setUp()
54+
{
55+
parent::setUp();
56+
57+
$this->resourceConnection = Bootstrap::getObjectManager()->get(ResourceConnection::class);
58+
$this->registry = Bootstrap::getObjectManager()->get(Registry::class);
59+
60+
$this->initSalesRule();
61+
$this->prepareLayout();
62+
}
63+
64+
/**
65+
* @inheritdoc
66+
*/
67+
protected function tearDown()
68+
{
69+
parent::tearDown();
70+
71+
$this->registry->unregister(RegistryConstants::CURRENT_SALES_RULE);
72+
}
73+
74+
/**
75+
* Check if mass action block exists
76+
*/
77+
public function testMassActionBlockExists()
78+
{
79+
$this->assertNotFalse(
80+
$this->getMassActionBlock(),
81+
'Mass action block does not exist in the grid, or it name was changed.'
82+
);
83+
}
84+
85+
/**
86+
* Check if function returns correct result
87+
*/
88+
public function testMassActionBlockContainsCorrectIdList()
89+
{
90+
$this->assertEquals(
91+
implode(',', $this->getCouponsIdList()),
92+
$this->getMassActionBlock()->getGridIdsJson(),
93+
'Function returns incorrect result.'
94+
);
95+
}
96+
97+
/**
98+
* Retrieve mass action block
99+
*
100+
* @return bool|MassActionBlock
101+
*/
102+
private function getMassActionBlock()
103+
{
104+
/** @var Grid $grid */
105+
$grid = $this->layout->getBlock('sales_rule_quote_edit_tab_coupons_grid');
106+
107+
return $grid->getMassactionBlock();
108+
}
109+
110+
/**
111+
* Prepare layout blocks
112+
*/
113+
private function prepareLayout()
114+
{
115+
$this->layout = Bootstrap::getObjectManager()->create(LayoutInterface::class);
116+
$this->layout->getUpdate()->load('sales_rule_promo_quote_couponsgrid');
117+
$this->layout->generateXml();
118+
$this->layout->generateElements();
119+
120+
$grid = $this->layout->getBlock('sales_rule_quote_edit_tab_coupons_grid');
121+
$grid->toHtml();
122+
}
123+
124+
/**
125+
* Init current sales rule
126+
*/
127+
private function initSalesRule()
128+
{
129+
/** @var RuleCollection $collection */
130+
$collection = Bootstrap::getObjectManager()->create(RuleCollection::class);
131+
$collection->addFieldToFilter('name', 'Rule with coupon list');
132+
$this->salesRule = $collection->getFirstItem();
133+
$this->registry->register(RegistryConstants::CURRENT_SALES_RULE, $this->salesRule);
134+
}
135+
136+
/**
137+
* Retrieve id list of coupons
138+
*
139+
* @return array
140+
*/
141+
private function getCouponsIdList(): array
142+
{
143+
$select = $this->resourceConnection->getConnection()
144+
->select()
145+
->from($this->resourceConnection->getTableName('salesrule_coupon'))
146+
->columns(['coupon_id'])
147+
->where('rule_id=?', $this->salesRule->getId());
148+
149+
return $this->resourceConnection->getConnection()->fetchCol($select);
150+
}
151+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
use Magento\Customer\Model\GroupManagement;
9+
use Magento\SalesRule\Api\CouponRepositoryInterface;
10+
use Magento\SalesRule\Model\Coupon;
11+
use Magento\SalesRule\Model\Rule;
12+
use Magento\Store\Model\StoreManagerInterface;
13+
use Magento\TestFramework\Helper\Bootstrap;
14+
15+
$objectManager = Bootstrap::getObjectManager();
16+
17+
/** @var Rule $salesRule */
18+
$salesRule = $objectManager->create(Rule::class);
19+
$salesRule->setData(
20+
[
21+
'name' => 'Rule with coupon list',
22+
'is_active' => 1,
23+
'customer_group_ids' => [GroupManagement::NOT_LOGGED_IN_ID],
24+
'coupon_type' => Rule::COUPON_TYPE_SPECIFIC,
25+
'simple_action' => Rule::CART_FIXED_ACTION,
26+
'discount_amount' => 10,
27+
'discount_step' => 0,
28+
'stop_rules_processing' => 1,
29+
'use_auto_generation' => 1,
30+
'website_ids' => [
31+
$objectManager->get(StoreManagerInterface::class)->getWebsite()->getId(),
32+
],
33+
]
34+
);
35+
$objectManager->get(\Magento\SalesRule\Model\ResourceModel\Rule::class)->save($salesRule);
36+
37+
/* @var CouponRepositoryInterface $couponRepository */
38+
$couponRepository = $objectManager->get(CouponRepositoryInterface::class);
39+
for ($index = 1; $index <= 100; $index ++) {
40+
$coupon = $objectManager->create(Coupon::class);
41+
$coupon->setRuleId($salesRule->getId())
42+
->setCode('coupon_code_' . $index)
43+
->setType(1);
44+
$couponRepository->save($coupon);
45+
}

0 commit comments

Comments
 (0)