Как добавить страну и выпадать штата в админте в Magento2
-
13-12-2019 - |
Вопрос
Мне нужно добавить страну и выпадать штата в администраторе, как это сделать
Решение
в блоке администратора форма в _prepareform () Добавить страну и регион
это
в __construct () Добавление страновой конфигурации источника
protected $_countryFactory;
/**
* @param \Magento\Backend\Block\Template\Context $context
* @param \Magento\Framework\Registry $registry
* @param \Magento\Framework\Data\FormFactory $formFactory
* @param \Magento\Store\Model\System\Store $systemStore
* @param array $data
*/
public function __construct(
\Magento\Backend\Block\Template\Context $context,
\Magento\Framework\Registry $registry,
\Magento\Framework\Data\FormFactory $formFactory,
\Magento\Store\Model\System\Store $systemStore,
\Magento\Cms\Model\Wysiwyg\Config $wysiwygConfig,
\Magento\Directory\Model\Config\Source\Country $countryFactory,
\Sugarcode\Test\Model\Status $status,
array $data = []
) {
$this->_systemStore = $systemStore;
$this->_wysiwygConfig = $wysiwygConfig;
$this->_status = $status;
$this->_countryFactory = $countryFactory;
parent::__construct($context, $registry, $formFactory, $data);
}
.
и в _prepareform ()
protected function _prepareForm()
{
.
.
.
.
.
old field
.
.
.
.
$optionsc=$this->_countryFactory->toOptionArray();
$country = $fieldset->addField(
'country_id',
'select',
[
'name' => 'country_id',
'label' => __('Country'),
'title' => __('Country'),
// 'onchange' => 'getstate(this)',
'values' => $optionsc,
]
);
//$optionsc=$this->_countryFactory->toOptionArray();
$fieldset->addField(
'region_id',
'select',
[
'name' => 'region_id',
'label' => __('Region'),
'title' => __('Region'),
'values' => ['--Please Select Country--'],
]
);
/*
* Add Ajax to the Country select box html output
*/
$country->setAfterElementHtml("
<script type=\"text/javascript\">
require([
'jquery',
'mage/template',
'jquery/ui',
'mage/translate'
],
function($, mageTemplate) {
$('#edit_form').on('change', '#country_id', function(event){
$.ajax({
url : '". $this->getUrl('test/*/regionlist') . "country/' + $('#country_id').val(),
type: 'get',
dataType: 'json',
showLoader:true,
success: function(data){
$('#region_id').empty();
$('#region_id').append(data.htmlconent);
}
});
})
}
);
</script>"
);
$form->setValues($model->getData());
$this->setForm($form);
return parent::_prepareForm();
}
.
и создайте файл действий администратора, чтобы получить регион это app \ code \ sugarcode \ test \ controller \ adminhtml \ lists \ RegionList.php
<?php
/**
*
* Copyright © 2015 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
// @codingStandardsIgnoreFile
namespace Sugarcode\Test\Controller\Adminhtml\Lists;
/**
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class Regionlist extends \Magento\Framework\App\Action\Action
{
/**
* @var \Magento\Framework\View\Result\PageFactory
*/
protected $resultPageFactory;
/**
* @var \Magento\Directory\Model\CountryFactory
*/
protected $_countryFactory;
/**
* @param \Magento\Framework\App\Action\Context $context
* @param \Magento\Framework\View\Result\PageFactory resultPageFactory
*/
public function __construct(
\Magento\Framework\App\Action\Context $context,
\Magento\Directory\Model\CountryFactory $countryFactory,
\Magento\Framework\View\Result\PageFactory $resultPageFactory
)
{
$this->_countryFactory = $countryFactory;
$this->resultPageFactory = $resultPageFactory;
parent::__construct($context);
}
/**
* Default customer account page
*
* @return void
*/
public function execute()
{
$countrycode = $this->getRequest()->getParam('country');
$state = "<option value=''>--Please Select--</option>";
if ($countrycode != '') {
$statearray =$this->_countryFactory->create()->setId(
$countrycode
)->getLoadedRegionCollection()->toOptionArray();
foreach ($statearray as $_state) {
if($_state['value']){
$state .= "<option >" . $_state['label'] . "</option>";
}
}
}
$result['htmlconent']=$state;
$this->getResponse()->representJson(
$this->_objectManager->get('Magento\Framework\Json\Helper\Data')->jsonEncode($result)
);
}
}
.
После того, как вы измените странскую область, будут загружаться так же, как вы можете сделать для города и
Если кто-то узнает лучше, то это решение, как мы используем в Edit.phtml, пожалуйста, поделитесь нами
Другие советы
в блочном конструкторе, вам нужно позволить двум классам с коллекцией регионов и стран. Кроме того, не забудьте добавить соответствующие поля там.
Далее, применяйте стандартный регионУпдатер из Lib / Web / Varien / form.js. Он может быть добавлен в любом удобном для вас пути - в нашем примере мы используем детский блок с шаблоном, где он называется (просто обратите внимание, что некоторые необходимые параметры: элементы страны, регион (текст), регион (выберите ) и объект, который содержит данные для стран и регионов (из каталога HELPER).
Если вам нужно изменить список стран и регионов, сделайте это не только в форме, но и в объекте данных из регионага.
Изменения в классе блока форм, добавьте новые классы в DI, метод __Construct и внесены изменения в метод _PrepareForm.
<?php
/**
* @var \Magento\Directory\Model\Config\Source\Country
*/
protected $_country;
/**
* @var \Magento\Directory\Model\RegionFactory
*/
protected $_regionFactory;
// ... add them in __construct
// ...
// Add next changes in the _prepareForm method
$countries = $this->_country->toOptionArray(false, 'US');
$regionCollection = $this->_regionFactory->create()->getCollection()->addCountryFilter(
$formData['country_id']
);
$regions = $regionCollection->toOptionArray();
$fieldset->addField(
'country_id',
'select',
['name' => 'country_id', 'label' => __('Country'), 'required' => true, 'values' => $countries]
);
$fieldset->addField(
'region_id',
'select',
['name' => 'region_id', 'label' => __('State'), 'values' => $regions]
);
$fieldset->addField(
'region',
'text',
['name' => 'region', 'label' => __('Region')]
);
$fieldset->addField(
'city',
'text',
['name' => 'city', 'label' => __('City')]
);
$this->setChild(
'form_after',
$this->getLayout()->createBlock('Magento\Framework\View\Element\Template')->setTemplate('Vendor_Module::js.phtml')
);
?>
> Vendor_Module::js.phtml
<script>
require([
"jquery",
"mage/adminhtml/form"
], function ($) {
var updater = new RegionUpdater($('[name=country_id]')[0], $('[name=region]')[0], $('[name=region_id]')[0],
<?php echo $this->helper('Magento\Directory\Helper\Data')->getRegionJson() ?>,
'hide'
);
updater.disableRegionValidation();
window.updater = updater;
});
</script>
.
Вот как это работает:
1) по умолчанию
2) После выбора USD, текстовое поле для области скрыто (5-й аргумент Regionupdater Constructor - этот метод будет применен к любым неактивным полям, а также его можно скрыть или отключить)
3) Для Албании нет регионов по умолчанию. Следовательно, мы можем увидеть только текстовое поле со скрытыми областями:
4) Для Швейцарии мы можем снова увидеть регионы:
И это идет, не говоря, что вам удобно использовать для ваших клиентов, так как используя метод Hide, поданная метка не скрыта.
Но в целом регионаупдатер работает хорошо для не-пользовательских форм Magento.
p.s. Также обратите внимание, что нет возможности добавить Updater для городов, как по умолчанию, Magento не поддерживает списки городов.
Вы можете попробовать использовать / репликациюG путь Config модуль.
Добавьте блок js.phtml, которые также используются в конфигурации отправления доставки, к вашему макету XML.
<referenceContainer name="js">
<block class="Magento\Backend\Block\Template" template="Magento_Config::system/config/js.phtml"/>
</referenceContainer>
.
Назовите идентификаторы поля как «Country_id» и «Region_id» и добавьте «страны» класса CSS на поле Country_ID.
$fieldset->addField(
'country_id',
'select',
[
'name' => 'country_id',
'label' => __('Country'),
'title' => __('Country'),
'values' => array_merge(['' => ''], $this->_countryOptions->toOptionArray()),
'class' => 'countries',
]
);
$fieldset->addField(
'region_id',
'text',
[
'name' => 'region_id',
'label' => __('Region/State'),
'title' => __('Region/State'),
]
);
.