I am working on magento 2.1.3
I want to change the sort order of shipping address form elements Country State and City in checkout page.
Country should load first then State and finally city
magento-2.1magento2
I am working on magento 2.1.3
I want to change the sort order of shipping address form elements Country State and City in checkout page.
Country should load first then State and finally city
Here is way to set value & make field readonly(disabled)
Override vendor/magento/module-checkout/view/frontend/layout/checkout_index_index.xml to app/design/frontend/package/themename/Magento_Checkout/layout/checkout_index_index.xml
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceBlock name="checkout.root">
<arguments>
<argument name="jsLayout" xsi:type="array">
<item name="components" xsi:type="array">
<item name="checkout" xsi:type="array">
<item name="children" xsi:type="array">
<item name="steps" xsi:type="array">
<item name="children" xsi:type="array">
<item name="shipping-step" xsi:type="array">
<item name="children" xsi:type="array">
<item name="shippingAddress" xsi:type="array">
<item name="children" xsi:type="array">
<item name="shipping-address-fieldset" xsi:type="array">
<item name="children" xsi:type="array">
<item name="company" xsi:type="array">
<item name="visible" xsi:type="boolean">false</item>
</item>
<item name="city" xsi:type="array">
<item name="disabled" xsi:type="string">disabled</item>
<item name="value" xsi:type="string">Value</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</argument>
</arguments>
</referenceBlock>
</body>
</page>
In above file i added,
<item name="company" xsi:type="array">
<item name="visible" xsi:type="boolean">false</item>
</item>
<item name="city" xsi:type="array">
<item name="disabled" xsi:type="string">disabled</item>
<item name="value" xsi:type="string">value</item>
</item>
Then Override, \Magento\Checkout\Block\Checkout\AttributeMerger to Namespace\Modulename\Block\Checkout\AttributeMerger
/** * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ namespace Namespace\Modulename\Block\Checkout; class AttributeMerger extends \Magento\Checkout\Block\Checkout\AttributeMerger { public function __construct( \Magento\Customer\Helper\Address $addressHelper, \Magento\Customer\Model\Session $customerSession, \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository, \Magento\Directory\Helper\Data $directoryHelper ) { parent::__construct( $addressHelper, $customerSession, $customerRepository, $directoryHelper ); } /** * Retrieve UI field configuration for given attribute * * @param string $attributeCode * @param array $attributeConfig * @param array $additionalConfig field configuration provided via layout XML * @param string $providerName name of the storage container used by UI component * @param string $dataScopePrefix * @return array * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ protected function getFieldConfig( $attributeCode, array $attributeConfig, array $additionalConfig, $providerName, $dataScopePrefix ) { // street attribute is unique in terms of configuration, so it has its own configuration builder if (isset($attributeConfig['validation']['input_validation'])) { $validationRule = $attributeConfig['validation']['input_validation']; $attributeConfig['validation'][$this->inputValidationMap[$validationRule]] = true; unset($attributeConfig['validation']['input_validation']); } if ($attributeConfig['formElement'] == 'multiline') { return $this->getMultilineFieldConfig($attributeCode, $attributeConfig, $providerName, $dataScopePrefix); } $uiComponent = isset($this->formElementMap[$attributeConfig['formElement']]) ? $this->formElementMap[$attributeConfig['formElement']] : 'Magento_Ui/js/form/element/abstract'; $elementTemplate = isset($this->templateMap[$attributeConfig['formElement']]) ? 'ui/form/element/' . $this->templateMap[$attributeConfig['formElement']] : 'ui/form/element/' . $attributeConfig['formElement']; $element = [ 'component' => isset($additionalConfig['component']) ? $additionalConfig['component'] : $uiComponent, 'config' => [ // customScope is used to group elements within a single form (e.g. they can be validated separately) 'customScope' => $dataScopePrefix, 'customEntry' => isset($additionalConfig['config']['customEntry']) ? $additionalConfig['config']['customEntry'] : null, 'template' => 'ui/form/field', 'elementTmpl' => isset($additionalConfig['config']['elementTmpl']) ? $additionalConfig['config']['elementTmpl'] : $elementTemplate, 'tooltip' => isset($additionalConfig['config']['tooltip']) ? $additionalConfig['config']['tooltip'] : null ], 'dataScope' => $dataScopePrefix . '.' . $attributeCode, 'label' => $attributeConfig['label'], 'provider' => $providerName, 'sortOrder' => isset($additionalConfig['sortOrder']) ? $additionalConfig['sortOrder'] : $attributeConfig['sortOrder'], 'validation' => $this->mergeConfigurationNode('validation', $additionalConfig, $attributeConfig), 'options' => $this->getFieldOptions($attributeCode, $attributeConfig), 'filterBy' => isset($additionalConfig['filterBy']) ? $additionalConfig['filterBy'] : null, 'customEntry' => isset($additionalConfig['customEntry']) ? $additionalConfig['customEntry'] : null, 'visible' => isset($additionalConfig['visible']) ? $additionalConfig['visible'] : true, ]; if (isset($additionalConfig['disabled']) && $additionalConfig['disabled'] != null) { $element['disabled'] = "disabled"; } if (isset($additionalConfig['value']) && $additionalConfig['value'] != null) { $element['value'] = ""; } if (isset($attributeConfig['value']) && $attributeConfig['value'] != null) { $element['value'] = $attributeConfig['value']; } elseif (isset($attributeConfig['default']) && $attributeConfig['default'] != null) { $element['value'] = $attributeConfig['default']; } else { $defaultValue = $this->getDefaultValue($attributeCode); if (null !== $defaultValue) { $element['value'] = $defaultValue; } } return $element; } /** * @param string $attributeCode * @return null|string */ protected function getDefaultValue($attributeCode) { switch ($attributeCode) { case 'firstname': if ($this->getCustomer()) { return $this->getCustomer()->getFirstname(); } break; case 'lastname': if ($this->getCustomer()) { return $this->getCustomer()->getLastname(); } break; case 'country_id': return $this->directoryHelper->getDefaultCountry(); break; case 'city': if ($this->getCustomer()) { return "return your value" } } return null; } }
In Above file i added below code in function getFieldConfig
if (isset($additionalConfig['disabled']) && $additionalConfig['disabled'] != null) { $element['disabled'] = "disabled"; }
And added below code in function getDefaultValue
case 'city': if ($this->getCustomer()) { return "return your value"; }
Thanks !!
On magento 2, you can override the Magento/Customer template. In our case, we have a custom copy of a Cleversoft theme so most of our overrides are done in the app/design/frontend file space.
In our case, we created the following directory heirarchy:
app/design/frontend/Cleversoft/custom/Magento_Customer/templates/address/
then copy the file from vendor/magento/module-customer/view/frontend/templates/address/edit.phtml into that folder. Edit the order and re-build. (magento setup:upgrade && magento setup:di:compile && magento setup:static-content:deploy)
Best Answer
Finally i got answer for this
Edit following file
app/design/frontend/Vendor/theme/Magento_Checkout/layout/checkout_index_index.xml
and put like this