123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Directory\Model\ResourceModel\Region;
- use Magento\Directory\Model\AllowedCountries;
- use Magento\Framework\App\ObjectManager;
- use Magento\Store\Model\ScopeInterface;
- /**
- * Regions collection
- *
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- *
- * @api
- * @since 100.0.2
- */
- class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
- {
- /**
- * Locale region name table name
- *
- * @var string
- */
- protected $_regionNameTable;
- /**
- * Country table name
- *
- * @var string
- */
- protected $_countryTable;
- /**
- * @var \Magento\Framework\Locale\ResolverInterface
- */
- protected $_localeResolver;
- /**
- * @var AllowedCountries
- */
- private $allowedCountriesReader;
- /**
- * @param \Magento\Framework\Data\Collection\EntityFactory $entityFactory
- * @param \Psr\Log\LoggerInterface $logger
- * @param \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy
- * @param \Magento\Framework\Event\ManagerInterface $eventManager
- * @param \Magento\Framework\Locale\ResolverInterface $localeResolver
- * @param mixed $connection
- * @param \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource
- */
- public function __construct(
- \Magento\Framework\Data\Collection\EntityFactory $entityFactory,
- \Psr\Log\LoggerInterface $logger,
- \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy,
- \Magento\Framework\Event\ManagerInterface $eventManager,
- \Magento\Framework\Locale\ResolverInterface $localeResolver,
- \Magento\Framework\DB\Adapter\AdapterInterface $connection = null,
- \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource = null
- ) {
- $this->_localeResolver = $localeResolver;
- $this->_resource = $resource;
- parent::__construct($entityFactory, $logger, $fetchStrategy, $eventManager, $connection, $resource);
- }
- /**
- * Define main, country, locale region name tables
- *
- * @return void
- */
- protected function _construct()
- {
- $this->_init(\Magento\Directory\Model\Region::class, \Magento\Directory\Model\ResourceModel\Region::class);
- $this->_countryTable = $this->getTable('directory_country');
- $this->_regionNameTable = $this->getTable('directory_country_region_name');
- $this->addOrder('name', \Magento\Framework\Data\Collection::SORT_ORDER_ASC);
- $this->addOrder('default_name', \Magento\Framework\Data\Collection::SORT_ORDER_ASC);
- }
- /**
- * Initialize select object
- *
- * @return $this
- */
- protected function _initSelect()
- {
- parent::_initSelect();
- $locale = $this->_localeResolver->getLocale();
- $this->addBindParam(':region_locale', $locale);
- $this->getSelect()->joinLeft(
- ['rname' => $this->_regionNameTable],
- 'main_table.region_id = rname.region_id AND rname.locale = :region_locale',
- ['name']
- );
- return $this;
- }
- /**
- * Return Allowed Countries reader
- *
- * @return \Magento\Directory\Model\AllowedCountries
- * @deprecated 100.1.4
- */
- private function getAllowedCountriesReader()
- {
- if (!$this->allowedCountriesReader) {
- $this->allowedCountriesReader = ObjectManager::getInstance()->get(AllowedCountries::class);
- }
- return $this->allowedCountriesReader;
- }
- /**
- * Set allowed countries filter based on the given store.
- * This is a convenience method for collection filtering based on store configuration settings.
- *
- * @param null|int|string|\Magento\Store\Model\Store $store
- * @return \Magento\Directory\Model\ResourceModel\Region\Collection
- * @since 100.1.4
- */
- public function addAllowedCountriesFilter($store = null)
- {
- $allowedCountries = $this->getAllowedCountriesReader()
- ->getAllowedCountries(ScopeInterface::SCOPE_STORE, $store);
- if (!empty($allowedCountries)) {
- $this->addFieldToFilter('main_table.country_id', ['in' => $allowedCountries]);
- }
- return $this;
- }
- /**
- * Filter by country_id
- *
- * @param string|array $countryId
- * @return $this
- */
- public function addCountryFilter($countryId)
- {
- if (!empty($countryId)) {
- if (is_array($countryId)) {
- $this->addFieldToFilter('main_table.country_id', ['in' => $countryId]);
- } else {
- $this->addFieldToFilter('main_table.country_id', $countryId);
- }
- }
- return $this;
- }
- /**
- * Filter by country code (ISO 3)
- *
- * @param string $countryCode
- * @return $this
- */
- public function addCountryCodeFilter($countryCode)
- {
- $this->getSelect()->joinLeft(
- ['country' => $this->_countryTable],
- 'main_table.country_id = country.country_id'
- )->where(
- 'country.iso3_code = ?',
- $countryCode
- );
- return $this;
- }
- /**
- * Filter by Region code
- *
- * @param string|array $regionCode
- * @return $this
- */
- public function addRegionCodeFilter($regionCode)
- {
- if (!empty($regionCode)) {
- if (is_array($regionCode)) {
- $this->addFieldToFilter('main_table.code', ['in' => $regionCode]);
- } else {
- $this->addFieldToFilter('main_table.code', $regionCode);
- }
- }
- return $this;
- }
- /**
- * Filter by region name
- *
- * @param string|array $regionName
- * @return $this
- */
- public function addRegionNameFilter($regionName)
- {
- if (!empty($regionName)) {
- if (is_array($regionName)) {
- $this->addFieldToFilter('main_table.default_name', ['in' => $regionName]);
- } else {
- $this->addFieldToFilter('main_table.default_name', $regionName);
- }
- }
- return $this;
- }
- /**
- * Filter region by its code or name
- *
- * @param string|array $region
- * @return $this
- */
- public function addRegionCodeOrNameFilter($region)
- {
- if (!empty($region)) {
- $condition = is_array($region) ? ['in' => $region] : $region;
- $this->addFieldToFilter(
- ['main_table.code', 'main_table.default_name'],
- [$condition, $condition]
- );
- }
- return $this;
- }
- /**
- * Convert collection items to select options array
- *
- * @return array
- */
- public function toOptionArray()
- {
- $options = [];
- $propertyMap = [
- 'value' => 'region_id',
- 'title' => 'default_name',
- 'country_id' => 'country_id',
- ];
- foreach ($this as $item) {
- $option = [];
- foreach ($propertyMap as $code => $field) {
- $option[$code] = $item->getData($field);
- }
- $option['label'] = $item->getName();
- $options[] = $option;
- }
- if (count($options) > 0) {
- array_unshift(
- $options,
- ['title' => '', 'value' => '', 'label' => __('Please select a region, state or province.')]
- );
- }
- return $options;
- }
- }
|