Как добавить страну и выпадать штата в админте в Magento2

magento.stackexchange https://magento.stackexchange.com//questions/89856

  •  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'),
    ]
);
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top