123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Rule\Model\ResourceModel\Rule\Collection;
- /**
- * Abstract Rule entity resource collection model
- *
- * @api
- * @since 100.0.2
- */
- abstract class AbstractCollection extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
- {
- /**
- * Store associated with rule entities information map
- *
- * Example:
- * array(
- * 'entity_type1' => array(
- * 'associations_table' => 'table_name',
- * 'rule_id_field' => 'rule_id',
- * 'entity_id_field' => 'entity_id'
- * ),
- * 'entity_type2' => array(
- * 'associations_table' => 'table_name',
- * 'rule_id_field' => 'rule_id',
- * 'entity_id_field' => 'entity_id'
- * )
- * ....
- * )
- *
- * @var array
- */
- protected $_associatedEntitiesMap = [];
- /**
- * Add website ids to rules data
- *
- * @return $this
- */
- protected function _afterLoad()
- {
- parent::_afterLoad();
- if ($this->getFlag('add_websites_to_result') && $this->_items) {
- /** @var \Magento\Rule\Model\AbstractModel $item */
- foreach ($this->_items as $item) {
- $item->afterLoad();
- }
- }
- return $this;
- }
- /**
- * Init flag for adding rule website ids to collection result
- *
- * @param bool|null $flag
- * @return $this
- */
- public function addWebsitesToResult($flag = null)
- {
- $flag = $flag === null ? true : $flag;
- $this->setFlag('add_websites_to_result', $flag);
- return $this;
- }
- /**
- * Limit rules collection by specific websites
- *
- * @param int|int[]|\Magento\Store\Model\Website $websiteId
- * @return $this
- */
- public function addWebsiteFilter($websiteId)
- {
- if (!$this->getFlag('is_website_table_joined')) {
- $websiteIds = is_array($websiteId) ? $websiteId : [$websiteId];
- $entityInfo = $this->_getAssociatedEntityInfo('website');
- $this->setFlag('is_website_table_joined', true);
- foreach ($websiteIds as $index => $website) {
- if ($website instanceof \Magento\Store\Model\Website) {
- $websiteIds[$index] = $website->getId();
- }
- }
- $this->getSelect()->join(
- ['website' => $this->getTable($entityInfo['associations_table'])],
- $this->getConnection()->quoteInto('website.' . $entityInfo['entity_id_field'] . ' IN (?)', $websiteIds)
- . ' AND main_table.' . $entityInfo['rule_id_field'] . ' = website.' . $entityInfo['rule_id_field'],
- []
- );
- }
- return $this;
- }
- /**
- * Provide support for website id filter
- *
- * @param string $field
- * @param null|string|array $condition
- * @return $this
- */
- public function addFieldToFilter($field, $condition = null)
- {
- if ($field == 'website_ids') {
- return $this->addWebsiteFilter($condition);
- }
- parent::addFieldToFilter($field, $condition);
- return $this;
- }
- /**
- * Filter collection to only active or inactive rules
- *
- * @param int $isActive
- * @return $this
- */
- public function addIsActiveFilter($isActive = 1)
- {
- if (!$this->getFlag('is_active_filter')) {
- $this->addFieldToFilter('is_active', (int)$isActive ? 1 : 0);
- $this->setFlag('is_active_filter', true);
- }
- return $this;
- }
- /**
- * Retrieve correspondent entity information (associations table name, columns names)
- * of rule's associated entity by specified entity type
- *
- * @param string $entityType
- *
- * @throws \Magento\Framework\Exception\LocalizedException
- * @return array
- */
- protected function _getAssociatedEntityInfo($entityType)
- {
- if (isset($this->_associatedEntitiesMap[$entityType])) {
- return $this->_associatedEntitiesMap[$entityType];
- }
- throw new \Magento\Framework\Exception\LocalizedException(
- __('There is no information about associated entity type "%1".', $entityType)
- );
- }
- }
|