Skip to content

Commit 63c4637

Browse files
committed
Merge remote-tracking branch 'mainline/2.2-develop' into bulk-api-backport
2 parents 64a8b25 + 0a52f88 commit 63c4637

File tree

56 files changed

+1314
-290
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+1314
-290
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/Catalog/view/frontend/web/js/product/storage/storage-service.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ define([
4747
* @param {*} data
4848
*/
4949
add: function (data) {
50-
if (!utils.compare(data, this.data()).equal) {
50+
if (!_.isEmpty(data) && !utils.compare(data, this.data()).equal) {
5151
this.data(_.extend(utils.copy(this.data()), data));
5252
}
5353
},
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
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\Cms\Ui\Component;
9+
10+
use Magento\Framework\Api\Filter;
11+
use Magento\Framework\Api\Search\SearchCriteriaBuilder;
12+
13+
/**
14+
* Provides extension point to add additional filters to search criteria.
15+
*/
16+
interface AddFilterInterface
17+
{
18+
/**
19+
* Adds custom filter to search criteria builder based on received filter.
20+
*
21+
* @param SearchCriteriaBuilder $searchCriteriaBuilder
22+
* @param Filter $filter
23+
* @return void
24+
*/
25+
public function addFilter(SearchCriteriaBuilder $searchCriteriaBuilder, Filter $filter);
26+
}

app/code/Magento/Cms/Ui/Component/DataProvider.php

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66
namespace Magento\Cms\Ui\Component;
77

8+
use Magento\Framework\Api\Filter;
89
use Magento\Framework\Api\FilterBuilder;
910
use Magento\Framework\Api\Search\SearchCriteriaBuilder;
1011
use Magento\Framework\App\ObjectManager;
@@ -19,6 +20,11 @@ class DataProvider extends \Magento\Framework\View\Element\UiComponent\DataProvi
1920
*/
2021
private $authorization;
2122

23+
/**
24+
* @var AddFilterInterface[]
25+
*/
26+
private $additionalFilterPool;
27+
2228
/**
2329
* @param string $name
2430
* @param string $primaryFieldName
@@ -29,6 +35,8 @@ class DataProvider extends \Magento\Framework\View\Element\UiComponent\DataProvi
2935
* @param FilterBuilder $filterBuilder
3036
* @param array $meta
3137
* @param array $data
38+
* @param array $additionalFilterPool
39+
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
3240
*/
3341
public function __construct(
3442
$name,
@@ -39,7 +47,8 @@ public function __construct(
3947
RequestInterface $request,
4048
FilterBuilder $filterBuilder,
4149
array $meta = [],
42-
array $data = []
50+
array $data = [],
51+
array $additionalFilterPool = []
4352
) {
4453
parent::__construct(
4554
$name,
@@ -54,6 +63,7 @@ public function __construct(
5463
);
5564

5665
$this->meta = array_replace_recursive($meta, $this->prepareMetadata());
66+
$this->additionalFilterPool = $additionalFilterPool;
5767
}
5868

5969
/**
@@ -95,4 +105,16 @@ public function prepareMetadata()
95105

96106
return $metadata;
97107
}
108+
109+
/**
110+
* @inheritdoc
111+
*/
112+
public function addFilter(Filter $filter)
113+
{
114+
if (!empty($this->additionalFilterPool[$filter->getField()])) {
115+
$this->additionalFilterPool[$filter->getField()]->addFilter($this->searchCriteriaBuilder, $filter);
116+
} else {
117+
parent::addFilter($filter);
118+
}
119+
}
98120
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
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\Cms\Ui\Component\Page;
9+
10+
use Magento\Cms\Ui\Component\AddFilterInterface;
11+
use Magento\Framework\Api\Filter;
12+
use Magento\Framework\Api\FilterBuilder;
13+
use Magento\Framework\Api\Search\SearchCriteriaBuilder;
14+
15+
/**
16+
* Adds fulltext filter for CMS Page title attribute.
17+
*/
18+
class FulltextFilter implements AddFilterInterface
19+
{
20+
/**
21+
* @var FilterBuilder
22+
*/
23+
private $filterBuilder;
24+
25+
/**
26+
* @param FilterBuilder $filterBuilder
27+
*/
28+
public function __construct(FilterBuilder $filterBuilder)
29+
{
30+
$this->filterBuilder = $filterBuilder;
31+
}
32+
33+
/**
34+
* @inheritdoc
35+
*/
36+
public function addFilter(SearchCriteriaBuilder $searchCriteriaBuilder, Filter $filter)
37+
{
38+
$titleFilter = $this->filterBuilder->setField('title')
39+
->setValue(sprintf('%%%s%%', $filter->getValue()))
40+
->setConditionType('like')
41+
->create();
42+
$searchCriteriaBuilder->addFilter($titleFilter);
43+
}
44+
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,4 +189,12 @@
189189
<argument name="collectionProcessor" xsi:type="object">Magento\Cms\Model\Api\SearchCriteria\BlockCollectionProcessor</argument>
190190
</arguments>
191191
</type>
192+
193+
<type name="Magento\Cms\Ui\Component\DataProvider">
194+
<arguments>
195+
<argument name="additionalFilterPool" xsi:type="array">
196+
<item name="fulltext" xsi:type="object">Magento\Cms\Ui\Component\Page\FulltextFilter</item>
197+
</argument>
198+
</arguments>
199+
</type>
192200
</config>

app/code/Magento/Payment/view/frontend/templates/transparent/iframe.phtml

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,10 @@ $params = $block->getParams();
6565
'jquery',
6666
'Magento_Checkout/js/model/quote',
6767
'Magento_Checkout/js/action/place-order',
68-
'Magento_Checkout/js/action/redirect-on-success'
68+
'Magento_Checkout/js/action/redirect-on-success',
69+
'Magento_Checkout/js/model/full-screen-loader'
6970
],
70-
function($, quote, placeOrderAction, redirectOnSuccessAction) {
71+
function($, quote, placeOrderAction, redirectOnSuccessAction, fullScreenLoader) {
7172
var parent = window.top;
7273

7374
$(parent).trigger('clearTimeout');
@@ -77,6 +78,12 @@ $params = $block->getParams();
7778
function () {
7879
redirectOnSuccessAction.execute();
7980
}
81+
).fail(
82+
function () {
83+
var parent = window.top;
84+
$(parent).trigger('clearTimeout');
85+
fullScreenLoader.stopLoader();
86+
}
8087
);
8188
}
8289
);

app/code/Magento/Sales/Block/Adminhtml/Order/Create/Form.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ public function getOrderDataJson()
189189
$data['shipping_method_reseted'] = !(bool)$this->getQuote()->getShippingAddress()->getShippingMethod();
190190
$data['payment_method'] = $this->getQuote()->getPayment()->getMethod();
191191
}
192+
$data['quote_id'] = $this->_sessionQuote->getQuoteId();
192193

193194
return $this->_jsonEncoder->encode($data);
194195
}

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
}

0 commit comments

Comments
 (0)