Skip to content

Commit da49a12

Browse files
committed
MC-5972: Implement handling of large number of addresses on admin order creation page with current UX
1 parent c6af508 commit da49a12

File tree

6 files changed

+39
-61
lines changed

6 files changed

+39
-61
lines changed

app/code/Magento/Sales/Model/Customer/Address.php renamed to app/code/Magento/Sales/ViewModel/Customer/AddressFormatter.php

Lines changed: 12 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -5,30 +5,15 @@
55
*/
66
declare(strict_types=1);
77

8-
namespace Magento\Sales\Model\Customer;
8+
namespace Magento\Sales\ViewModel\Customer;
99

10-
use Magento\Framework\DataObject;
1110
use Magento\Framework\View\Element\Block\ArgumentInterface;
1211

1312
/**
14-
* Customer address
13+
* Customer address formatter
1514
*/
16-
class Address extends DataObject implements ArgumentInterface
15+
class AddressFormatter implements ArgumentInterface
1716
{
18-
/**
19-
* Customer addresses collection
20-
*
21-
* @var \Magento\Customer\Model\ResourceModel\Address\Collection
22-
*/
23-
private $addressCollection;
24-
25-
/**
26-
* Customer address array
27-
*
28-
* @var array
29-
*/
30-
private $addressArray;
31-
3217
/**
3318
* Customer form factory
3419
*
@@ -37,11 +22,11 @@ class Address extends DataObject implements ArgumentInterface
3722
private $customerFormFactory;
3823

3924
/**
40-
* Address helper
25+
* Address format helper
4126
*
4227
* @var \Magento\Customer\Helper\Address
4328
*/
44-
private $addressHelper;
29+
private $addressFormatHelper;
4530

4631
/**
4732
* Directory helper
@@ -67,60 +52,37 @@ class Address extends DataObject implements ArgumentInterface
6752
/**
6853
* Customer address
6954
*
70-
* @param \Magento\Customer\Model\ResourceModel\Address\Collection $addressCollection
7155
* @param \Magento\Customer\Model\Metadata\FormFactory $customerFormFactory
72-
* @param \Magento\Customer\Helper\Address $addressHelper
56+
* @param \Magento\Customer\Helper\Address $addressFormatHelper
7357
* @param \Magento\Directory\Helper\Data $directoryHelper
7458
* @param \Magento\Backend\Model\Session\Quote $session
7559
* @param \Magento\Framework\Serialize\Serializer\Json $jsonEncoder
7660
*/
7761
public function __construct(
78-
\Magento\Customer\Model\ResourceModel\Address\Collection $addressCollection,
7962
\Magento\Customer\Model\Metadata\FormFactory $customerFormFactory,
80-
\Magento\Customer\Helper\Address $addressHelper,
63+
\Magento\Customer\Helper\Address $addressFormatHelper,
8164
\Magento\Directory\Helper\Data $directoryHelper,
8265
\Magento\Backend\Model\Session\Quote $session,
8366
\Magento\Framework\Serialize\Serializer\Json $jsonEncoder
8467
) {
85-
$this->addressCollection = $addressCollection;
8668
$this->customerFormFactory = $customerFormFactory;
87-
$this->addressHelper = $addressHelper;
69+
$this->addressFormatHelper = $addressFormatHelper;
8870
$this->directoryHelper = $directoryHelper;
8971
$this->session = $session;
9072
$this->jsonEncoder = $jsonEncoder;
91-
parent::__construct();
92-
}
93-
94-
/**
95-
* Retrieve customer address array.
96-
*
97-
* @param int $customerId
98-
*
99-
* @return array
100-
*/
101-
public function getAddresses(int $customerId): array
102-
{
103-
if ($customerId) {
104-
if ($this->addressArray === null) {
105-
$addressCollection = $this->addressCollection->setCustomerFilter([$customerId]);
106-
$this->addressArray = $addressCollection->toArray();
107-
}
108-
return $this->addressArray;
109-
}
110-
return [];
11173
}
11274

11375
/**
11476
* Return customer address array as JSON
11577
*
116-
* @param int $customerId
78+
* @param array $addressArray
11779
*
11880
* @return string
11981
*/
120-
public function getAddressesJson(int $customerId): string
82+
public function getAddressesJson(array $addressArray): string
12183
{
12284
$data = $this->getEmptyAddressForm();
123-
foreach ($this->getAddresses($customerId) as $addressId => $address) {
85+
foreach ($addressArray as $addressId => $address) {
12486
$addressForm = $this->customerFormFactory->create(
12587
'customer_address',
12688
'adminhtml_customer_address',
@@ -142,7 +104,7 @@ public function getAddressesJson(int $customerId): string
142104
*/
143105
public function getAddressAsString(array $address): string
144106
{
145-
$formatTypeRenderer = $this->addressHelper->getFormatTypeRenderer('oneline');
107+
$formatTypeRenderer = $this->addressFormatHelper->getFormatTypeRenderer('oneline');
146108
$result = '';
147109
if ($formatTypeRenderer) {
148110
$result = $formatTypeRenderer->renderArray($address);

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,14 @@
4747
<block class="Magento\Sales\Block\Adminhtml\Order\Create\Form\Account" template="Magento_Sales::order/create/form/account.phtml" name="form_account"/>
4848
<block class="Magento\Sales\Block\Adminhtml\Order\Create\Shipping\Address" template="Magento_Sales::order/create/form/address.phtml" name="shipping_address">
4949
<arguments>
50-
<argument name="customerAddressModel" xsi:type="object">Magento\Sales\Model\Customer\Address</argument>
50+
<argument name="customerAddressViewModel" xsi:type="object">Magento\Sales\ViewModel\Customer\AddressFormatter</argument>
51+
<argument name="customerAddressCollection" xsi:type="object">Magento\Customer\Model\ResourceModel\Address\Collection</argument>
5152
</arguments>
5253
</block>
5354
<block class="Magento\Sales\Block\Adminhtml\Order\Create\Billing\Address" template="Magento_Sales::order/create/form/address.phtml" name="billing_address">
5455
<arguments>
55-
<argument name="customerAddressModel" xsi:type="object">Magento\Sales\Model\Customer\Address</argument>
56+
<argument name="customerAddressViewModel" xsi:type="object">Magento\Sales\ViewModel\Customer\AddressFormatter</argument>
57+
<argument name="customerAddressCollection" xsi:type="object">Magento\Customer\Model\ResourceModel\Address\Collection</argument>
5658
</arguments>
5759
</block>
5860
<block class="Magento\Sales\Block\Adminhtml\Order\Create\Shipping\Method" template="Magento_Sales::order/create/abstract.phtml" name="shipping_method">

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
<referenceContainer name="content">
1111
<block class="Magento\Sales\Block\Adminhtml\Order\Create\Billing\Address" template="Magento_Sales::order/create/form/address.phtml" name="billing_address">
1212
<arguments>
13-
<argument name="customerAddressModel" xsi:type="object">Magento\Sales\Model\Customer\Address</argument>
13+
<argument name="customerAddressViewModel" xsi:type="object">Magento\Sales\ViewModel\Customer\AddressFormatter</argument>
14+
<argument name="customerAddressCollection" xsi:type="object">Magento\Customer\Model\ResourceModel\Address\Collection</argument>
1415
</arguments>
1516
</block>
1617
</referenceContainer>

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,14 @@
2222
<block class="Magento\Sales\Block\Adminhtml\Order\Create\Form\Account" template="Magento_Sales::order/create/form/account.phtml" name="form_account"/>
2323
<block class="Magento\Sales\Block\Adminhtml\Order\Create\Shipping\Address" template="Magento_Sales::order/create/form/address.phtml" name="shipping_address">
2424
<arguments>
25-
<argument name="customerAddressModel" xsi:type="object">Magento\Sales\Model\Customer\Address</argument>
25+
<argument name="customerAddressViewModel" xsi:type="object">Magento\Sales\ViewModel\Customer\AddressFormatter</argument>
26+
<argument name="customerAddressCollection" xsi:type="object">Magento\Customer\Model\ResourceModel\Address\Collection</argument>
2627
</arguments>
2728
</block>
2829
<block class="Magento\Sales\Block\Adminhtml\Order\Create\Billing\Address" template="Magento_Sales::order/create/form/address.phtml" name="billing_address">
2930
<arguments>
30-
<argument name="customerAddressModel" xsi:type="object">Magento\Sales\Model\Customer\Address</argument>
31+
<argument name="customerAddressViewModel" xsi:type="object">Magento\Sales\ViewModel\Customer\AddressFormatter</argument>
32+
<argument name="customerAddressCollection" xsi:type="object">Magento\Customer\Model\ResourceModel\Address\Collection</argument>
3133
</arguments>
3234
</block>
3335
<block class="Magento\Sales\Block\Adminhtml\Order\Create\Shipping\Method" template="Magento_Sales::order/create/abstract.phtml" name="shipping_method">

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
<referenceContainer name="content">
1111
<block class="Magento\Sales\Block\Adminhtml\Order\Create\Shipping\Address" template="Magento_Sales::order/create/form/address.phtml" name="shipping_address">
1212
<arguments>
13-
<argument name="customerAddressModel" xsi:type="object">Magento\Sales\Model\Customer\Address</argument>
13+
<argument name="customerAddressViewModel" xsi:type="object">Magento\Sales\ViewModel\Customer\AddressFormatter</argument>
14+
<argument name="customerAddressCollection" xsi:type="object">Magento\Customer\Model\ResourceModel\Address\Collection</argument>
1415
</arguments>
1516
</block>
1617
</referenceContainer>

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

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,19 @@
77
// @codingStandardsIgnoreFile
88

99
/**
10-
* @var Magento\Sales\Model\Customer\Address $customerAddressModel
10+
* @var \Magento\Customer\Model\ResourceModel\Address\Collection $addressCollection
1111
*/
12-
$customerAddressModel = $block->getData('customerAddressModel');
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\Address $customerAddressViewModel
21+
*/
22+
$customerAddressViewModel = $block->getData('customerAddressViewModel');
1323

1424
/**
1525
* @var \Magento\Sales\Block\Adminhtml\Order\Create\Billing\Address|\Magento\Sales\Block\Adminhtml\Order\Create\Shipping\Address $block
@@ -22,7 +32,7 @@ if ($block->getIsShipping()):
2232
require(["Magento_Sales/order/create/form"], function(){
2333

2434
order.shippingAddressContainer = '<?= /* @escapeNotVerified */ $_fieldsContainerId ?>';
25-
order.setAddresses(<?= /* @escapeNotVerified */ $customerAddressModel->getAddressesJson($block->getCustomerId()) ?>);
35+
order.setAddresses(<?= /* @escapeNotVerified */ $customerAddressViewModel->getAddressesJson($addressArray) ?>);
2636

2737
});
2838
</script>
@@ -64,10 +74,10 @@ endif; ?>
6474
onchange="order.selectAddress(this, '<?= /* @escapeNotVerified */ $_fieldsContainerId ?>')"
6575
class="admin__control-select">
6676
<option value=""><?= /* @escapeNotVerified */ __('Add New Address') ?></option>
67-
<?php foreach ($customerAddressModel->getAddresses($block->getCustomerId()) as $addressId => $address): ?>
77+
<?php foreach ($addressArray as $addressId => $address): ?>
6878
<option
6979
value="<?= /* @escapeNotVerified */ $addressId ?>"<?php if ($addressId == $block->getAddressId()): ?> selected="selected"<?php endif; ?>>
70-
<?= /* @escapeNotVerified */ $block->escapeHtml($customerAddressModel->getAddressAsString($address)) ?>
80+
<?= /* @escapeNotVerified */ $block->escapeHtml($customerAddressViewModel->getAddressAsString($address)) ?>
7181
</option>
7282
<?php endforeach; ?>
7383
</select>

0 commit comments

Comments
 (0)