Я разместил раскрывающийся список городов на странице оформления заказа.(см. изображение ниже)
раскрывающийся список городов
Эти города были взяты из базы данных.
Таким образом, значение этого города сохраняется какидентификатор в атрибуте city в базе данных, и идентификатор берется и отображается в адресе доставки вместо названия города.(см. изображение ниже).
адрес доставки с городом
Это способ, которым я реализовал раскрывающийся список городов:
.... \ etc \ di.xml
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Checkout\Block\Checkout\LayoutProcessor">
<plugin name="talliance_layout_checkout" type="Talliance\SwyftShippingMethod\Plugin\Checkout\Model\Checkout\LayoutProcessor" sortOrder="100"/>
</type>
</config>
.... \ Plugin \ Checkout \ Model \ Checkout \ LayoutProcessor.php
class LayoutProcessor extends CheckoutLayoutProcessor
{
protected $_cities;
public function __construct
(
\Magento\Customer\Model\AttributeMetadataDataProvider $attributeMetadataDataProvider,
\Magento\Ui\Component\Form\AttributeMapper $attributeMapper,
AttributeMerger $merger,
City $cities
)
{
$this->_cities = $cities;
parent::__construct($attributeMetadataDataProvider, $attributeMapper, $merger);
}
/**
* @param CheckoutLayoutProcessor $subject
* @param array $jsLayout
* @return array
*/
public function afterProcess(
CheckoutLayoutProcessor $subject,
array $jsLayout
) {
$jsLayout['components']['checkout']['children']['steps']['children']['shipping-step']['children']
['shippingAddress']['children']['shipping-address-fieldset']['children']['city'] = [
'component' => 'Magento_Ui/js/form/element/select',
'config' => [
'customScope' => 'shippingAddress',
'template' => 'ui/form/field',
'elementTmpl' => 'ui/form/element/select',
'id' => 'city'
],
'dataScope' => 'shippingAddress.city',
'label' => 'City',
'provider' => 'checkoutProvider',
'visible' => true,
'validation' => [ 'required-entry' => true ],
'sortOrder' => 250,
'id' => 'city',
'options' => $this->_cities->toOptionArray()
];
return $jsLayout;
}
}
Я хочу отобразить название города вАдрес доставки при оформлении заказа.Кто-нибудь знает, как это сделать?
Ниже приведен код, который я пытался установить и обновить название города вместо идентификатора города этого конкретного клиента с помощью \ Magento \ Customer \ Api \ Data \ AddressInterface.
public function getCustomerCity() {
$customerCity = '';
$checkout = $this->_sessionCheckout->getQuote();
if ($checkout) {
$shippingAddress = $checkout->getShippingAddress();
if ($shippingAddress) {
//Get customer addressId (this variable returns null when I debug).
$addressId = $shippingAddress->getCustomerAddressId();
$customerCity = $shippingAddress->getCity();
if($customerCity) {
if (is_numeric($customerCity)) {
/** @var \Magento\Customer\Api\Data\AddressInterface $address */
$address = $this->_addressRepository->getById($addressId);
/** @var \Talliance\SwyftShippingMethod\Model\ResourceModel\SrilankanCity\Collection $collection */
$collection = $this->_cityCollection->create();
//Get city name from the city id
$city_name = $collection->getCityName($customerCity);
$address->setCity($city_name);
$this->_addressRepository->save($address);
$customerCity = trim($city_name);
}
$this->_logger->log(100, print_r('customer city: ' . $customerCity, true));
}
}
}
return $customerCity;
}
Но я получаю сообщение об ошибке по адресу addressId = null на странице оформления заказа.Это потому, что мой addressId клиента возвращает нулевое значение.Так что у меня проблемы с исправлением.Если бы кто-нибудь мог это исправить, я был бы очень признателен.
Заранее спасибо.