Skip to content

Commit bf19409

Browse files
Merge forwardport of #11992 to 2.3-develop branch
Applied pull request patch https://github.com/magento/magento2/pull/11992.patch (created by @RomaKis) based on commit(s): 1. 9193745 2. ef03b52 3. f2bfdd9 4. b6764c8 5. b322718 Fixed GitHub Issues in 2.3-develop branch: - #11740: Sending emails from Admin in Multi-Store Environment defaults to Primary Store (reported by @lee586)
2 parents 9368d5d + cc2b11f commit bf19409

File tree

5 files changed

+184
-13
lines changed

5 files changed

+184
-13
lines changed

app/code/Magento/Sales/Model/Order/Email/SenderBuilder.php

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
*/
66
namespace Magento\Sales\Model\Order\Email;
77

8+
use Magento\Framework\App\ObjectManager;
89
use Magento\Framework\Mail\Template\TransportBuilder;
10+
use Magento\Framework\Mail\Template\TransportBuilderByStore;
911
use Magento\Sales\Model\Order\Email\Container\IdentityInterface;
1012
use Magento\Sales\Model\Order\Email\Container\Template;
1113

@@ -26,19 +28,29 @@ class SenderBuilder
2628
*/
2729
protected $transportBuilder;
2830

31+
/**
32+
* @var TransportBuilderByStore
33+
*/
34+
private $transportBuilderByStore;
35+
2936
/**
3037
* @param Template $templateContainer
3138
* @param IdentityInterface $identityContainer
3239
* @param TransportBuilder $transportBuilder
40+
* @param TransportBuilderByStore $transportBuilderByStore
3341
*/
3442
public function __construct(
3543
Template $templateContainer,
3644
IdentityInterface $identityContainer,
37-
TransportBuilder $transportBuilder
45+
TransportBuilder $transportBuilder,
46+
TransportBuilderByStore $transportBuilderByStore = null
3847
) {
3948
$this->templateContainer = $templateContainer;
4049
$this->identityContainer = $identityContainer;
4150
$this->transportBuilder = $transportBuilder;
51+
$this->transportBuilderByStore = $transportBuilderByStore ?: ObjectManager::getInstance()->get(
52+
TransportBuilderByStore::class
53+
);
4254
}
4355

4456
/**
@@ -98,6 +110,9 @@ protected function configureEmailTemplate()
98110
$this->transportBuilder->setTemplateIdentifier($this->templateContainer->getTemplateId());
99111
$this->transportBuilder->setTemplateOptions($this->templateContainer->getTemplateOptions());
100112
$this->transportBuilder->setTemplateVars($this->templateContainer->getTemplateVars());
101-
$this->transportBuilder->setFrom($this->identityContainer->getEmailIdentity());
113+
$this->transportBuilderByStore->setFromByStore(
114+
$this->identityContainer->getEmailIdentity(),
115+
$this->identityContainer->getStore()->getId()
116+
);
102117
}
103118
}

app/code/Magento/Sales/Test/Unit/Model/Order/Email/SenderBuilderTest.php

Lines changed: 48 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
67
namespace Magento\Sales\Test\Unit\Model\Order\Email;
78

9+
use Magento\Framework\Mail\Template\TransportBuilderByStore;
810
use Magento\Sales\Model\Order\Email\SenderBuilder;
911

1012
class SenderBuilderTest extends \PHPUnit\Framework\TestCase
@@ -29,6 +31,16 @@ class SenderBuilderTest extends \PHPUnit\Framework\TestCase
2931
*/
3032
protected $transportBuilder;
3133

34+
/**
35+
* @var \PHPUnit_Framework_MockObject_MockObject
36+
*/
37+
private $storeMock;
38+
39+
/**
40+
* @var \PHPUnit_Framework_MockObject_MockObject
41+
*/
42+
private $transportBuilderByStore;
43+
3244
protected function setUp()
3345
{
3446
$templateId = 'test_template_id';
@@ -42,7 +54,11 @@ protected function setUp()
4254
['getTemplateVars', 'getTemplateOptions', 'getTemplateId']
4355
);
4456

45-
$this->storeMock = $this->createPartialMock(\Magento\Store\Model\Store::class, ['getStoreId', '__wakeup']);
57+
$this->storeMock = $this->createPartialMock(\Magento\Store\Model\Store::class, [
58+
'getStoreId',
59+
'__wakeup',
60+
'getId',
61+
]);
4662

4763
$this->identityContainerMock = $this->createPartialMock(
4864
\Magento\Sales\Model\Order\Email\Container\ShipmentIdentity::class,
@@ -52,15 +68,24 @@ protected function setUp()
5268
'getCustomerName',
5369
'getTemplateOptions',
5470
'getEmailCopyTo',
55-
'getCopyMethod'
71+
'getCopyMethod',
72+
'getStore',
5673
]
5774
);
5875

59-
$this->transportBuilder = $this->createPartialMock(\Magento\Framework\Mail\Template\TransportBuilder::class, [
60-
'addTo', 'addBcc', 'getTransport',
61-
'setTemplateIdentifier', 'setTemplateOptions', 'setTemplateVars',
62-
'setFrom',
63-
]);
76+
$this->transportBuilder = $this->createPartialMock(
77+
\Magento\Framework\Mail\Template\TransportBuilder::class,
78+
[
79+
'addTo',
80+
'addBcc',
81+
'getTransport',
82+
'setTemplateIdentifier',
83+
'setTemplateOptions',
84+
'setTemplateVars',
85+
]
86+
);
87+
88+
$this->transportBuilderByStore = $this->createMock(TransportBuilderByStore::class);
6489

6590
$this->templateContainerMock->expects($this->once())
6691
->method('getTemplateId')
@@ -84,8 +109,8 @@ protected function setUp()
84109
$this->identityContainerMock->expects($this->once())
85110
->method('getEmailIdentity')
86111
->will($this->returnValue($emailIdentity));
87-
$this->transportBuilder->expects($this->once())
88-
->method('setFrom')
112+
$this->transportBuilderByStore->expects($this->once())
113+
->method('setFromByStore')
89114
->with($this->equalTo($emailIdentity));
90115

91116
$this->identityContainerMock->expects($this->once())
@@ -95,7 +120,8 @@ protected function setUp()
95120
$this->senderBuilder = new SenderBuilder(
96121
$this->templateContainerMock,
97122
$this->identityContainerMock,
98-
$this->transportBuilder
123+
$this->transportBuilder,
124+
$this->transportBuilderByStore
99125
);
100126
}
101127

@@ -119,6 +145,12 @@ public function testSend()
119145
$this->identityContainerMock->expects($this->once())
120146
->method('getCustomerName')
121147
->will($this->returnValue($customerName));
148+
$this->identityContainerMock->expects($this->once())
149+
->method('getStore')
150+
->willReturn($this->storeMock);
151+
$this->storeMock->expects($this->once())
152+
->method('getId')
153+
->willReturn(1);
122154
$this->transportBuilder->expects($this->once())
123155
->method('addTo')
124156
->with($this->equalTo($customerEmail), $this->equalTo($customerName));
@@ -145,7 +177,12 @@ public function testSendCopyTo()
145177
$this->transportBuilder->expects($this->once())
146178
->method('addTo')
147179
->with($this->equalTo('[email protected]'));
148-
180+
$this->identityContainerMock->expects($this->once())
181+
->method('getStore')
182+
->willReturn($this->storeMock);
183+
$this->storeMock->expects($this->once())
184+
->method('getId')
185+
->willReturn(1);
149186
$this->transportBuilder->expects($this->once())
150187
->method('getTransport')
151188
->will($this->returnValue($transportMock));
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\Framework\Mail\Template;
8+
9+
use Magento\Framework\Mail\MessageInterface;
10+
11+
class TransportBuilderByStore
12+
{
13+
/**
14+
* Message.
15+
*
16+
* @var \Magento\Framework\Mail\Message
17+
*/
18+
protected $message;
19+
20+
/**
21+
* Sender resolver.
22+
*
23+
* @var \Magento\Framework\Mail\Template\SenderResolverInterface
24+
*/
25+
private $senderResolver;
26+
27+
/**
28+
* @param MessageInterface $message
29+
* @param SenderResolverInterface $senderResolver
30+
*/
31+
public function __construct(
32+
MessageInterface $message,
33+
SenderResolverInterface $senderResolver
34+
) {
35+
$this->message = $message;
36+
$this->senderResolver = $senderResolver;
37+
}
38+
39+
/**
40+
* Set mail from address by store.
41+
*
42+
* @param string|array $from
43+
* @param string|int $store
44+
*
45+
* @return $this
46+
*/
47+
public function setFromByStore($from, $store)
48+
{
49+
$result = $this->senderResolver->resolve($from, $store);
50+
$this->message->setFrom($result['email'], $result['name']);
51+
52+
return $this;
53+
}
54+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\Framework\Mail\Test\Unit\Template;
8+
9+
use Magento\Framework\Mail\Template\TransportBuilderByStore;
10+
11+
class TransportBuilderByStoreTest extends \PHPUnit\Framework\TestCase
12+
{
13+
/**
14+
* @var \Magento\Framework\Mail\Template\TransportBuilderByStore
15+
*/
16+
protected $model;
17+
18+
/**
19+
* @var \Magento\Framework\Mail\Message | \PHPUnit_Framework_MockObject_MockObject
20+
*/
21+
protected $messageMock;
22+
23+
/**
24+
* @var \Magento\Framework\Mail\Template\SenderResolverInterface | \PHPUnit_Framework_MockObject_MockObject
25+
*/
26+
protected $senderResolverMock;
27+
28+
/**
29+
* @return void
30+
*/
31+
protected function setUp()
32+
{
33+
$objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
34+
$this->messageMock = $this->createMock(\Magento\Framework\Mail\Message::class);
35+
$this->senderResolverMock = $this->createMock(\Magento\Framework\Mail\Template\SenderResolverInterface::class);
36+
37+
$this->model = $objectManagerHelper->getObject(
38+
TransportBuilderByStore::class,
39+
[
40+
'message' => $this->messageMock,
41+
'senderResolver' => $this->senderResolverMock,
42+
]
43+
);
44+
}
45+
46+
/**
47+
* @return void
48+
*/
49+
public function testSetFromByStore()
50+
{
51+
$sender = ['email' => '[email protected]', 'name' => 'name'];
52+
$store = 1;
53+
$this->senderResolverMock->expects($this->once())
54+
->method('resolve')
55+
->with($sender, $store)
56+
->willReturn($sender);
57+
$this->messageMock->expects($this->once())
58+
->method('setFrom')
59+
->with('[email protected]', 'name')
60+
->willReturnSelf();
61+
62+
$this->model->setFromByStore($sender, $store);
63+
}
64+
}

lib/internal/Magento/Framework/Mail/Test/Unit/Template/TransportBuilderTest.php

Lines changed: 1 addition & 0 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+
67
namespace Magento\Framework\Mail\Test\Unit\Template;
78

89
use Magento\Framework\App\TemplateTypesInterface;

0 commit comments

Comments
 (0)