Skip to content

Commit 87c3b15

Browse files
committed
Merge remote-tracking branch 'origin/MAGETWO-89238-2.2' into PANDA-PR-2.2
2 parents 1002e0f + 52c996e commit 87c3b15

39 files changed

+517
-141
lines changed

app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteStorePost.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,6 @@ public function execute()
3737
try {
3838
$model->delete();
3939

40-
$this->_eventManager->dispatch('store_delete', ['store' => $model]);
41-
4240
$this->messageManager->addSuccess(__('You deleted the store view.'));
4341
return $redirectResult->setPath('adminhtml/*/');
4442
} catch (\Magento\Framework\Exception\LocalizedException $e) {

app/code/Magento/Backend/Controller/Adminhtml/System/Store/Save.php

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ private function processWebsiteSave($postData)
4646
*/
4747
private function processStoreSave($postData)
4848
{
49-
$eventName = 'store_edit';
5049
/** @var \Magento\Store\Model\Store $storeModel */
5150
$storeModel = $this->_objectManager->create(\Magento\Store\Model\Store::class);
5251
$postData['store']['name'] = $this->filterManager->removeTags($postData['store']['name']);
@@ -56,7 +55,6 @@ private function processStoreSave($postData)
5655
$storeModel->setData($postData['store']);
5756
if ($postData['store']['store_id'] == '') {
5857
$storeModel->setId(null);
59-
$eventName = 'store_add';
6058
}
6159
$groupModel = $this->_objectManager->create(
6260
\Magento\Store\Model\Group::class
@@ -70,8 +68,6 @@ private function processStoreSave($postData)
7068
);
7169
}
7270
$storeModel->save();
73-
$this->_objectManager->get(\Magento\Store\Model\StoreManager::class)->reinitStores();
74-
$this->_eventManager->dispatch($eventName, ['store' => $storeModel]);
7571
$this->messageManager->addSuccess(__('You saved the store view.'));
7672

7773
return $postData;
@@ -102,7 +98,6 @@ private function processGroupSave($postData)
10298
);
10399
}
104100
$groupModel->save();
105-
$this->_eventManager->dispatch('store_group_save', ['group' => $groupModel]);
106101
$this->messageManager->addSuccess(__('You saved the store.'));
107102

108103
return $postData;

app/code/Magento/Sales/Model/EmailSenderHandler.php

Lines changed: 64 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
*/
66
namespace Magento\Sales\Model;
77

8+
use Magento\Sales\Model\Order\Email\Container\IdentityInterface;
9+
810
/**
911
* Sales emails sending
1012
*
@@ -41,22 +43,41 @@ class EmailSenderHandler
4143
*/
4244
protected $globalConfig;
4345

46+
/**
47+
* @var IdentityInterface
48+
*/
49+
private $identityContainer;
50+
51+
/**
52+
* @var \Magento\Store\Model\StoreManagerInterface
53+
*/
54+
private $storeManager;
55+
4456
/**
4557
* @param \Magento\Sales\Model\Order\Email\Sender $emailSender
4658
* @param \Magento\Sales\Model\ResourceModel\EntityAbstract $entityResource
4759
* @param \Magento\Sales\Model\ResourceModel\Collection\AbstractCollection $entityCollection
4860
* @param \Magento\Framework\App\Config\ScopeConfigInterface $globalConfig
61+
* @param IdentityInterface|null $identityContainer
62+
* @param \Magento\Store\Model\StoreManagerInterface $storeManager
4963
*/
5064
public function __construct(
5165
\Magento\Sales\Model\Order\Email\Sender $emailSender,
5266
\Magento\Sales\Model\ResourceModel\EntityAbstract $entityResource,
5367
\Magento\Sales\Model\ResourceModel\Collection\AbstractCollection $entityCollection,
54-
\Magento\Framework\App\Config\ScopeConfigInterface $globalConfig
68+
\Magento\Framework\App\Config\ScopeConfigInterface $globalConfig,
69+
IdentityInterface $identityContainer = null,
70+
\Magento\Store\Model\StoreManagerInterface $storeManager = null
5571
) {
5672
$this->emailSender = $emailSender;
5773
$this->entityResource = $entityResource;
5874
$this->entityCollection = $entityCollection;
5975
$this->globalConfig = $globalConfig;
76+
77+
$this->identityContainer = $identityContainer ?: \Magento\Framework\App\ObjectManager::getInstance()
78+
->get(\Magento\Sales\Model\Order\Email\Container\NullIdentity::class);
79+
$this->storeManager = $storeManager ?: \Magento\Framework\App\ObjectManager::getInstance()
80+
->get(\Magento\Store\Model\StoreManagerInterface::class);
6081
}
6182

6283
/**
@@ -69,14 +90,50 @@ public function sendEmails()
6990
$this->entityCollection->addFieldToFilter('send_email', ['eq' => 1]);
7091
$this->entityCollection->addFieldToFilter('email_sent', ['null' => true]);
7192

72-
/** @var \Magento\Sales\Model\AbstractModel $item */
73-
foreach ($this->entityCollection->getItems() as $item) {
74-
if ($this->emailSender->send($item, true)) {
75-
$this->entityResource->save(
76-
$item->setEmailSent(true)
77-
);
93+
/** @var \Magento\Store\Api\Data\StoreInterface[] $stores */
94+
$stores = $this->getStores(clone $this->entityCollection);
95+
96+
/** @var \Magento\Store\Model\Store $store */
97+
foreach ($stores as $store) {
98+
$this->identityContainer->setStore($store);
99+
if (!$this->identityContainer->isEnabled()) {
100+
continue;
101+
}
102+
$entityCollection = clone $this->entityCollection;
103+
$entityCollection->addFieldToFilter('store_id', $store->getId());
104+
105+
/** @var \Magento\Sales\Model\AbstractModel $item */
106+
foreach ($entityCollection->getItems() as $item) {
107+
if ($this->emailSender->send($item, true)) {
108+
$this->entityResource->save(
109+
$item->setEmailSent(true)
110+
);
111+
}
78112
}
79113
}
80114
}
81115
}
116+
117+
/**
118+
* Get stores for given entities.
119+
*
120+
* @param ResourceModel\Collection\AbstractCollection $entityCollection
121+
* @return \Magento\Store\Api\Data\StoreInterface[]
122+
* @throws \Magento\Framework\Exception\NoSuchEntityException
123+
*/
124+
private function getStores(
125+
\Magento\Sales\Model\ResourceModel\Collection\AbstractCollection $entityCollection
126+
): array {
127+
$stores = [];
128+
129+
$entityCollection->addAttributeToSelect('store_id')->getSelect()->group('store_id');
130+
/** @var \Magento\Sales\Model\EntityInterface $item */
131+
foreach ($entityCollection->getItems() as $item) {
132+
/** @var \Magento\Store\Model\StoreManagerInterface $store */
133+
$store = $this->storeManager->getStore($item->getStoreId());
134+
$stores[$item->getStoreId()] = $store;
135+
}
136+
137+
return $stores;
138+
}
82139
}

app/code/Magento/Sales/Model/Order/Email/Container/IdentityInterface.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6-
namespace Magento\Sales\Model\Order\Email\Container;
6+
7+
namespace Magento\Sales\Model\Order\Email\Container;
78

89
use Magento\Store\Model\Store;
910

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
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\Sales\Model\Order\Email\Container;
9+
10+
class NullIdentity extends Container implements IdentityInterface
11+
{
12+
/**
13+
* @inheritdoc
14+
*/
15+
public function isEnabled()
16+
{
17+
return true;
18+
}
19+
20+
/**
21+
* @inheritdoc
22+
*/
23+
public function getEmailCopyTo()
24+
{
25+
return false;
26+
}
27+
28+
/**
29+
* @inheritdoc
30+
*/
31+
public function getCopyMethod()
32+
{
33+
return '';
34+
}
35+
36+
/**
37+
* @inheritdoc
38+
*/
39+
public function getGuestTemplateId()
40+
{
41+
return null;
42+
}
43+
44+
/**
45+
* @inheritdoc
46+
*/
47+
public function getTemplateId()
48+
{
49+
return null;
50+
}
51+
52+
/**
53+
* @inheritdoc
54+
*/
55+
public function getEmailIdentity()
56+
{
57+
return '';
58+
}
59+
}

app/code/Magento/Sales/Test/Unit/Model/EmailSenderHandlerTest.php

Lines changed: 83 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,16 @@ class EmailSenderHandlerTest extends \PHPUnit\Framework\TestCase
4747
*/
4848
protected $globalConfig;
4949

50+
/**
51+
* @var \Magento\Sales\Model\Order\Email\Container\IdentityInterface|\PHPUnit_Framework_MockObject_MockObject
52+
*/
53+
private $identityContainerMock;
54+
55+
/**
56+
* @var \Magento\Store\Model\StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject
57+
*/
58+
private $storeManagerMock;
59+
5060
protected function setUp()
5161
{
5262
$objectManager = new ObjectManager($this);
@@ -70,18 +80,28 @@ protected function setUp()
7080
false,
7181
false,
7282
true,
73-
['addFieldToFilter', 'getItems']
83+
['addFieldToFilter', 'getItems', 'addAttributeToSelect', 'getSelect']
7484
);
7585

7686
$this->globalConfig = $this->createMock(\Magento\Framework\App\Config::class);
7787

88+
$this->identityContainerMock = $this->createMock(
89+
\Magento\Sales\Model\Order\Email\Container\IdentityInterface::class
90+
);
91+
92+
$this->storeManagerMock = $this->createMock(
93+
\Magento\Store\Model\StoreManagerInterface::class
94+
);
95+
7896
$this->object = $objectManager->getObject(
7997
\Magento\Sales\Model\EmailSenderHandler::class,
8098
[
81-
'emailSender' => $this->emailSender,
82-
'entityResource' => $this->entityResource,
83-
'entityCollection' => $this->entityCollection,
84-
'globalConfig' => $this->globalConfig
99+
'emailSender' => $this->emailSender,
100+
'entityResource' => $this->entityResource,
101+
'entityCollection' => $this->entityCollection,
102+
'globalConfig' => $this->globalConfig,
103+
'identityContainer' => $this->identityContainerMock,
104+
'storeManager' => $this->storeManagerMock,
85105
]
86106
);
87107
}
@@ -114,12 +134,32 @@ public function testExecute($configValue, $collectionItems, $emailSendingResult)
114134
->method('addFieldToFilter')
115135
->with('email_sent', ['null' => true]);
116136

137+
$this->entityCollection
138+
->expects($this->any())
139+
->method('addAttributeToSelect')
140+
->with('store_id')
141+
->willReturnSelf();
142+
143+
$selectMock = $this->createMock(\Magento\Framework\DB\Select::class);
144+
145+
$selectMock
146+
->expects($this->atLeastOnce())
147+
->method('group')
148+
->with('store_id')
149+
->willReturnSelf();
150+
151+
$this->entityCollection
152+
->expects($this->any())
153+
->method('getSelect')
154+
->willReturn($selectMock);
155+
117156
$this->entityCollection
118157
->expects($this->any())
119158
->method('getItems')
120159
->willReturn($collectionItems);
121160

122161
if ($collectionItems) {
162+
123163
/** @var \Magento\Sales\Model\AbstractModel|\PHPUnit_Framework_MockObject_MockObject $collectionItem */
124164
$collectionItem = $collectionItems[0];
125165

@@ -129,6 +169,23 @@ public function testExecute($configValue, $collectionItems, $emailSendingResult)
129169
->with($collectionItem, true)
130170
->willReturn($emailSendingResult);
131171

172+
$storeMock = $this->createMock(\Magento\Store\Model\Store::class);
173+
174+
$this->storeManagerMock
175+
->expects($this->any())
176+
->method('getStore')
177+
->willReturn($storeMock);
178+
179+
$this->identityContainerMock
180+
->expects($this->any())
181+
->method('setStore')
182+
->with($storeMock);
183+
184+
$this->identityContainerMock
185+
->expects($this->any())
186+
->method('isEnabled')
187+
->willReturn(true);
188+
132189
if ($emailSendingResult) {
133190
$collectionItem
134191
->expects($this->once())
@@ -159,14 +216,30 @@ public function executeDataProvider()
159216
false,
160217
false,
161218
true,
162-
['setEmailSent']
219+
['setEmailSent', 'getOrder']
163220
);
164221

165222
return [
166-
[1, [$entityModel], true],
167-
[1, [$entityModel], false],
168-
[1, [], null],
169-
[0, null, null]
223+
[
224+
'configValue' => 1,
225+
'collectionItems' => [clone $entityModel],
226+
'emailSendingResult' => true,
227+
],
228+
[
229+
'configValue' => 1,
230+
'collectionItems' => [clone $entityModel],
231+
'emailSendingResult' => false,
232+
],
233+
[
234+
'configValue' => 1,
235+
'collectionItems' => [],
236+
'emailSendingResult' => null,
237+
],
238+
[
239+
'configValue' => 0,
240+
'collectionItems' => null,
241+
'emailSendingResult' => null,
242+
]
170243
];
171244
}
172245
}

app/code/Magento/Sales/etc/di.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,27 +323,31 @@
323323
<argument name="emailSender" xsi:type="object">Magento\Sales\Model\Order\Email\Sender\OrderSender</argument>
324324
<argument name="entityResource" xsi:type="object">Magento\Sales\Model\ResourceModel\Order</argument>
325325
<argument name="entityCollection" xsi:type="object" shared="false">Magento\Sales\Model\ResourceModel\Order\Collection</argument>
326+
<argument name="identityContainer" xsi:type="object" shared="false">Magento\Sales\Model\Order\Email\Container\OrderIdentity</argument>
326327
</arguments>
327328
</virtualType>
328329
<virtualType name="SalesOrderInvoiceSendEmails" type="Magento\Sales\Model\EmailSenderHandler">
329330
<arguments>
330331
<argument name="emailSender" xsi:type="object">Magento\Sales\Model\Order\Email\Sender\InvoiceSender</argument>
331332
<argument name="entityResource" xsi:type="object">Magento\Sales\Model\ResourceModel\Order\Invoice</argument>
332333
<argument name="entityCollection" xsi:type="object" shared="false">Magento\Sales\Model\ResourceModel\Order\Invoice\Collection</argument>
334+
<argument name="identityContainer" xsi:type="object" shared="false">Magento\Sales\Model\Order\Email\Container\InvoiceIdentity</argument>
333335
</arguments>
334336
</virtualType>
335337
<virtualType name="SalesOrderShipmentSendEmails" type="Magento\Sales\Model\EmailSenderHandler">
336338
<arguments>
337339
<argument name="emailSender" xsi:type="object">Magento\Sales\Model\Order\Email\Sender\ShipmentSender</argument>
338340
<argument name="entityResource" xsi:type="object">Magento\Sales\Model\ResourceModel\Order\Shipment</argument>
339341
<argument name="entityCollection" xsi:type="object" shared="false">Magento\Sales\Model\ResourceModel\Order\Shipment\Collection</argument>
342+
<argument name="identityContainer" xsi:type="object" shared="false">Magento\Sales\Model\Order\Email\Container\ShipmentIdentity</argument>
340343
</arguments>
341344
</virtualType>
342345
<virtualType name="SalesOrderCreditmemoSendEmails" type="Magento\Sales\Model\EmailSenderHandler">
343346
<arguments>
344347
<argument name="emailSender" xsi:type="object">Magento\Sales\Model\Order\Email\Sender\CreditmemoSender</argument>
345348
<argument name="entityResource" xsi:type="object">Magento\Sales\Model\ResourceModel\Order\Creditmemo</argument>
346349
<argument name="entityCollection" xsi:type="object" shared="false">Magento\Sales\Model\ResourceModel\Order\Creditmemo\Collection</argument>
350+
<argument name="identityContainer" xsi:type="object" shared="false">Magento\Sales\Model\Order\Email\Container\CreditmemoIdentity</argument>
347351
</arguments>
348352
</virtualType>
349353

0 commit comments

Comments
 (0)