Skip to content

Commit a0614c2

Browse files
authored
Merge pull request #3538 from magento-performance/MAGETWO-97151
Fixed issues: - MAGETWO-97151 [Backport][MC-5683] Implement handling of large number of addresses on admin order creation page
2 parents 75c9b64 + b819f2b commit a0614c2

File tree

7 files changed

+219
-12
lines changed

7 files changed

+219
-12
lines changed
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\Sales\ViewModel\Customer;
8+
9+
use Magento\Framework\View\Element\Block\ArgumentInterface;
10+
11+
/**
12+
* Customer address formatter
13+
*/
14+
class AddressFormatter implements ArgumentInterface
15+
{
16+
/**
17+
* Customer form factory
18+
*
19+
* @var \Magento\Customer\Model\Metadata\FormFactory
20+
*/
21+
private $customerFormFactory;
22+
23+
/**
24+
* Address format helper
25+
*
26+
* @var \Magento\Customer\Helper\Address
27+
*/
28+
private $addressFormatHelper;
29+
30+
/**
31+
* Directory helper
32+
*
33+
* @var \Magento\Directory\Helper\Data
34+
*/
35+
private $directoryHelper;
36+
37+
/**
38+
* Session quote
39+
*
40+
* @var \Magento\Backend\Model\Session\Quote
41+
*/
42+
private $session;
43+
44+
/**
45+
* Json encoder
46+
*
47+
* @var \Magento\Framework\Serialize\Serializer\Json
48+
*/
49+
private $jsonEncoder;
50+
51+
/**
52+
* Customer address
53+
*
54+
* @param \Magento\Customer\Model\Metadata\FormFactory $customerFormFactory
55+
* @param \Magento\Customer\Helper\Address $addressFormatHelper
56+
* @param \Magento\Directory\Helper\Data $directoryHelper
57+
* @param \Magento\Backend\Model\Session\Quote $session
58+
* @param \Magento\Framework\Serialize\Serializer\Json $jsonEncoder
59+
*/
60+
public function __construct(
61+
\Magento\Customer\Model\Metadata\FormFactory $customerFormFactory,
62+
\Magento\Customer\Helper\Address $addressFormatHelper,
63+
\Magento\Directory\Helper\Data $directoryHelper,
64+
\Magento\Backend\Model\Session\Quote $session,
65+
\Magento\Framework\Serialize\Serializer\Json $jsonEncoder
66+
) {
67+
$this->customerFormFactory = $customerFormFactory;
68+
$this->addressFormatHelper = $addressFormatHelper;
69+
$this->directoryHelper = $directoryHelper;
70+
$this->session = $session;
71+
$this->jsonEncoder = $jsonEncoder;
72+
}
73+
74+
/**
75+
* Return customer address array as JSON
76+
*
77+
* @param array $addressArray
78+
*
79+
* @return string
80+
*/
81+
public function getAddressesJson(array $addressArray)
82+
{
83+
$data = $this->getEmptyAddressForm();
84+
foreach ($addressArray as $addressId => $address) {
85+
$addressForm = $this->customerFormFactory->create(
86+
'customer_address',
87+
'adminhtml_customer_address',
88+
$address
89+
);
90+
$data[$addressId] = $addressForm->outputData(
91+
\Magento\Eav\Model\AttributeDataFactory::OUTPUT_FORMAT_JSON
92+
);
93+
}
94+
95+
return $this->jsonEncoder->serialize($data);
96+
}
97+
98+
/**
99+
* Represent customer address in 'online' format.
100+
*
101+
* @param array $address
102+
* @return string
103+
*/
104+
public function getAddressAsString(array $address)
105+
{
106+
$formatTypeRenderer = $this->addressFormatHelper->getFormatTypeRenderer('oneline');
107+
$result = '';
108+
if ($formatTypeRenderer) {
109+
$result = $formatTypeRenderer->renderArray($address);
110+
}
111+
112+
return $result;
113+
}
114+
115+
/**
116+
* Return empty address address form
117+
*
118+
* @return array
119+
*/
120+
private function getEmptyAddressForm()
121+
{
122+
$defaultCountryId = $this->directoryHelper->getDefaultCountry($this->session->getStore());
123+
$emptyAddressForm = $this->customerFormFactory->create(
124+
'customer_address',
125+
'adminhtml_customer_address',
126+
[\Magento\Customer\Api\Data\AddressInterface::COUNTRY_ID => $defaultCountryId]
127+
);
128+
129+
return [0 => $emptyAddressForm->outputData(\Magento\Eav\Model\AttributeDataFactory::OUTPUT_FORMAT_JSON)];
130+
}
131+
}

app/code/Magento/Sales/view/adminhtml/layout/sales_order_create_index.xml

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,18 @@
4545
<block class="Magento\Sales\Block\Adminhtml\Order\Create\Sidebar\Pviewed" template="Magento_Sales::order/create/sidebar/items.phtml" name="pviewed"/>
4646
</block>
4747
<block class="Magento\Sales\Block\Adminhtml\Order\Create\Form\Account" template="Magento_Sales::order/create/form/account.phtml" name="form_account"/>
48-
<block class="Magento\Sales\Block\Adminhtml\Order\Create\Shipping\Address" template="Magento_Sales::order/create/form/address.phtml" name="shipping_address"/>
49-
<block class="Magento\Sales\Block\Adminhtml\Order\Create\Billing\Address" template="Magento_Sales::order/create/form/address.phtml" name="billing_address"/>
48+
<block class="Magento\Sales\Block\Adminhtml\Order\Create\Shipping\Address" template="Magento_Sales::order/create/form/address.phtml" name="shipping_address">
49+
<arguments>
50+
<argument name="customerAddressFormatter" xsi:type="object">Magento\Sales\ViewModel\Customer\AddressFormatter</argument>
51+
<argument name="customerAddressCollection" xsi:type="object">Magento\Customer\Model\ResourceModel\Address\Collection</argument>
52+
</arguments>
53+
</block>
54+
<block class="Magento\Sales\Block\Adminhtml\Order\Create\Billing\Address" template="Magento_Sales::order/create/form/address.phtml" name="billing_address">
55+
<arguments>
56+
<argument name="customerAddressFormatter" xsi:type="object">Magento\Sales\ViewModel\Customer\AddressFormatter</argument>
57+
<argument name="customerAddressCollection" xsi:type="object">Magento\Customer\Model\ResourceModel\Address\Collection</argument>
58+
</arguments>
59+
</block>
5060
<block class="Magento\Sales\Block\Adminhtml\Order\Create\Shipping\Method" template="Magento_Sales::order/create/abstract.phtml" name="shipping_method">
5161
<block class="Magento\Sales\Block\Adminhtml\Order\Create\Shipping\Method\Form" template="Magento_Sales::order/create/shipping/method/form.phtml" name="order_create_shipping_form" as="form"/>
5262
</block>

app/code/Magento/Sales/view/adminhtml/layout/sales_order_create_load_block_billing_address.xml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,12 @@
88
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
99
<body>
1010
<referenceContainer name="content">
11-
<block class="Magento\Sales\Block\Adminhtml\Order\Create\Billing\Address" template="Magento_Sales::order/create/form/address.phtml" name="billing_address"/>
11+
<block class="Magento\Sales\Block\Adminhtml\Order\Create\Billing\Address" template="Magento_Sales::order/create/form/address.phtml" name="billing_address">
12+
<arguments>
13+
<argument name="customerAddressFormatter" xsi:type="object">Magento\Sales\ViewModel\Customer\AddressFormatter</argument>
14+
<argument name="customerAddressCollection" xsi:type="object">Magento\Customer\Model\ResourceModel\Address\Collection</argument>
15+
</arguments>
16+
</block>
1217
</referenceContainer>
1318
</body>
1419
</page>

app/code/Magento/Sales/view/adminhtml/layout/sales_order_create_load_block_data.xml

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,18 @@
2020
<block class="Magento\Sales\Block\Adminhtml\Order\Create\Sidebar\Pviewed" template="Magento_Sales::order/create/sidebar/items.phtml" name="pviewed"/>
2121
</block>
2222
<block class="Magento\Sales\Block\Adminhtml\Order\Create\Form\Account" template="Magento_Sales::order/create/form/account.phtml" name="form_account"/>
23-
<block class="Magento\Sales\Block\Adminhtml\Order\Create\Shipping\Address" template="Magento_Sales::order/create/form/address.phtml" name="shipping_address"/>
24-
<block class="Magento\Sales\Block\Adminhtml\Order\Create\Billing\Address" template="Magento_Sales::order/create/form/address.phtml" name="billing_address"/>
23+
<block class="Magento\Sales\Block\Adminhtml\Order\Create\Shipping\Address" template="Magento_Sales::order/create/form/address.phtml" name="shipping_address">
24+
<arguments>
25+
<argument name="customerAddressFormatter" xsi:type="object">Magento\Sales\ViewModel\Customer\AddressFormatter</argument>
26+
<argument name="customerAddressCollection" xsi:type="object">Magento\Customer\Model\ResourceModel\Address\Collection</argument>
27+
</arguments>
28+
</block>
29+
<block class="Magento\Sales\Block\Adminhtml\Order\Create\Billing\Address" template="Magento_Sales::order/create/form/address.phtml" name="billing_address">
30+
<arguments>
31+
<argument name="customerAddressFormatter" xsi:type="object">Magento\Sales\ViewModel\Customer\AddressFormatter</argument>
32+
<argument name="customerAddressCollection" xsi:type="object">Magento\Customer\Model\ResourceModel\Address\Collection</argument>
33+
</arguments>
34+
</block>
2535
<block class="Magento\Sales\Block\Adminhtml\Order\Create\Shipping\Method" template="Magento_Sales::order/create/abstract.phtml" name="shipping_method">
2636
<block class="Magento\Sales\Block\Adminhtml\Order\Create\Shipping\Method\Form" template="Magento_Sales::order/create/shipping/method/form.phtml" name="order.create.shipping.method.form" as="form"/>
2737
</block>

app/code/Magento/Sales/view/adminhtml/layout/sales_order_create_load_block_shipping_address.xml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,12 @@
88
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
99
<body>
1010
<referenceContainer name="content">
11-
<block class="Magento\Sales\Block\Adminhtml\Order\Create\Shipping\Address" template="Magento_Sales::order/create/form/address.phtml" name="shipping_address"/>
11+
<block class="Magento\Sales\Block\Adminhtml\Order\Create\Shipping\Address" template="Magento_Sales::order/create/form/address.phtml" name="shipping_address">
12+
<arguments>
13+
<argument name="customerAddressFormatter" xsi:type="object">Magento\Sales\ViewModel\Customer\AddressFormatter</argument>
14+
<argument name="customerAddressCollection" xsi:type="object">Magento\Customer\Model\ResourceModel\Address\Collection</argument>
15+
</arguments>
16+
</block>
1217
</referenceContainer>
1318
</body>
1419
</page>

app/code/Magento/Sales/view/adminhtml/templates/order/create/form/address.phtml

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,21 @@
66

77
// @codingStandardsIgnoreFile
88

9+
/**
10+
* @var \Magento\Customer\Model\ResourceModel\Address\Collection $addressCollection
11+
*/
12+
$addressCollection = $block->getData('customerAddressCollection');
13+
14+
$addressArray = [];
15+
if ($block->getCustomerId()) {
16+
$addressArray = $addressCollection->setCustomerFilter([$block->getCustomerId()])->toArray();
17+
}
18+
19+
/**
20+
* @var \Magento\Sales\ViewModel\Customer\AddressFormatter $customerAddressFormatter
21+
*/
22+
$customerAddressFormatter = $block->getData('customerAddressFormatter');
23+
924
/**
1025
* @var \Magento\Sales\Block\Adminhtml\Order\Create\Billing\Address|\Magento\Sales\Block\Adminhtml\Order\Create\Shipping\Address $block
1126
*/
@@ -17,7 +32,7 @@ if ($block->getIsShipping()):
1732
require(["Magento_Sales/order/create/form"], function(){
1833

1934
order.shippingAddressContainer = '<?= /* @escapeNotVerified */ $_fieldsContainerId ?>';
20-
order.setAddresses(<?= /* @escapeNotVerified */ $block->getAddressCollectionJson() ?>);
35+
order.setAddresses(<?= /* @escapeNotVerified */ $customerAddressFormatter->getAddressesJson($addressArray) ?>);
2136

2237
});
2338
</script>
@@ -59,13 +74,11 @@ endif; ?>
5974
onchange="order.selectAddress(this, '<?= /* @escapeNotVerified */ $_fieldsContainerId ?>')"
6075
class="admin__control-select">
6176
<option value=""><?= /* @escapeNotVerified */ __('Add New Address') ?></option>
62-
<?php foreach ($block->getAddressCollection() as $_address): ?>
63-
<?php //if($block->getAddressAsString($_address)!=$block->getAddressAsString($block->getAddress())): ?>
77+
<?php foreach ($addressArray as $addressId => $address): ?>
6478
<option
65-
value="<?= /* @escapeNotVerified */ $_address->getId() ?>"<?php if ($_address->getId() == $block->getAddressId()): ?> selected="selected"<?php endif; ?>>
66-
<?= /* @escapeNotVerified */ $block->getAddressAsString($_address) ?>
79+
value="<?= /* @escapeNotVerified */ $addressId ?>"<?php if ($addressId == $block->getAddressId()): ?> selected="selected"<?php endif; ?>>
80+
<?= /* @escapeNotVerified */ $block->escapeHtml($customerAddressFormatter->getAddressAsString($address)) ?>
6781
</option>
68-
<?php //endif; ?>
6982
<?php endforeach; ?>
7083
</select>
7184
</div>

setup/performance-toolkit/benchmark.jmx

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25803,6 +25803,39 @@ catch (java.lang.Exception e) {
2580325803
</ResponseAssertion>
2580425804
<hashTree/>
2580525805
</hashTree>
25806+
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Filled Order Page" enabled="true">
25807+
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true">
25808+
<collectionProp name="Arguments.arguments"/>
25809+
</elementProp>
25810+
<stringProp name="HTTPSampler.domain"/>
25811+
<stringProp name="HTTPSampler.port"/>
25812+
<stringProp name="HTTPSampler.connect_timeout">60000</stringProp>
25813+
<stringProp name="HTTPSampler.response_timeout">200000</stringProp>
25814+
<stringProp name="HTTPSampler.protocol">${request_protocol}</stringProp>
25815+
<stringProp name="HTTPSampler.contentEncoding"/>
25816+
<stringProp name="HTTPSampler.path">${base_path}${admin_path}/sales/order_create/index/</stringProp>
25817+
<stringProp name="HTTPSampler.method">GET</stringProp>
25818+
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
25819+
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
25820+
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
25821+
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
25822+
<boolProp name="HTTPSampler.monitor">false</boolProp>
25823+
<stringProp name="HTTPSampler.embedded_url_re"/>
25824+
<stringProp name="TestPlan.comments">Detected the start of a redirect chain</stringProp>
25825+
</HTTPSamplerProxy>
25826+
<hashTree>
25827+
<ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert Filled Order Page" enabled="true">
25828+
<collectionProp name="Asserion.test_strings">
25829+
<stringProp name="-37823069">Select from existing customer addresses</stringProp>
25830+
<stringProp name="-13185722">Submit Order</stringProp>
25831+
<stringProp name="-209419315">Items Ordered</stringProp>
25832+
</collectionProp>
25833+
<stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
25834+
<boolProp name="Assertion.assume_success">false</boolProp>
25835+
<intProp name="Assertion.test_type">2</intProp>
25836+
</ResponseAssertion>
25837+
<hashTree/>
25838+
</hashTree>
2580625839
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Save Order" enabled="true">
2580725840
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true">
2580825841
<collectionProp name="Arguments.arguments">

0 commit comments

Comments
 (0)