countryCollectionFactory = $countryCollection; $this->regionCollectionFactory = $regionCollection; $this->directoryHelper = $directoryHelper; $this->storeManager = $storeManager ?: ObjectManager::getInstance()->get(StoreManagerInterface::class); } /** * Process js Layout of block * * @param array $jsLayout * @return array */ public function process($jsLayout) { if (!isset($jsLayout['components']['checkoutProvider']['dictionaries'])) { $jsLayout['components']['checkoutProvider']['dictionaries'] = [ 'country_id' => $this->getCountryOptions(), 'region_id' => $this->getRegionOptions(), ]; } return $jsLayout; } /** * Get country options list. * * @return array */ private function getCountryOptions() { if (!isset($this->countryOptions)) { $this->countryOptions = $this->countryCollectionFactory->create()->loadByStore( $this->storeManager->getStore()->getId() )->toOptionArray(); $this->countryOptions = $this->orderCountryOptions($this->countryOptions); } return $this->countryOptions; } /** * Get region options list. * * @return array */ private function getRegionOptions() { if (!isset($this->regionOptions)) { $this->regionOptions = $this->regionCollectionFactory->create()->addAllowedCountriesFilter( $this->storeManager->getStore()->getId() )->toOptionArray(); } return $this->regionOptions; } /** * Sort country options by top country codes. * * @param array $countryOptions * @return array */ private function orderCountryOptions(array $countryOptions) { $topCountryCodes = $this->directoryHelper->getTopCountryCodes(); if (empty($topCountryCodes)) { return $countryOptions; } $headOptions = []; $tailOptions = [[ 'value' => 'delimiter', 'label' => '──────────', 'disabled' => true, ]]; foreach ($countryOptions as $countryOption) { if (empty($countryOption['value']) || in_array($countryOption['value'], $topCountryCodes)) { $headOptions[] = $countryOption; } else { $tailOptions[] = $countryOption; } } return array_merge($headOptions, $tailOptions); } }