mirror of
https://github.com/bdnugget/magento2.git
synced 2026-11-07 09:17:35 +00:00
264 lines
7.4 KiB
PHP
264 lines
7.4 KiB
PHP
<?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;
|
|
}
|
|
}
|