<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ namespace Magento\Eav\Model\ResourceModel\Form\Attribute; /** * EAV Form Attribute Resource Collection * * @api * @author Magento Core Team <core@magentocommerce.com> * @since 100.0.2 */ class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection { /** * Current module pathname * * @var string */ protected $_moduleName = ''; /** * Current EAV entity type code * * @var string */ protected $_entityTypeCode = ''; /** * Current store instance * * @var \Magento\Store\Model\Store */ protected $_store; /** * Eav Entity Type instance * * @var \Magento\Eav\Model\Entity\Type */ protected $_entityType; /** * @var \Magento\Store\Model\StoreManagerInterface */ protected $_storeManager; /** * @var \Magento\Eav\Model\Config */ protected $_eavConfig; /** * @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\Eav\Model\Config $eavConfig * @param \Magento\Store\Model\StoreManagerInterface $storeManager * @param mixed $connection * @param \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource * @codeCoverageIgnore */ 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\Eav\Model\Config $eavConfig, \Magento\Store\Model\StoreManagerInterface $storeManager, \Magento\Framework\DB\Adapter\AdapterInterface $connection = null, \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource = null ) { $this->_storeManager = $storeManager; $this->_eavConfig = $eavConfig; parent::__construct($entityFactory, $logger, $fetchStrategy, $eventManager, $connection, $resource); } /** * Resource initialization * * @return void * @throws \Magento\Framework\Exception\LocalizedException */ protected function _construct() { if (empty($this->_moduleName)) { throw new \Magento\Framework\Exception\LocalizedException(__('The current module pathname is undefined.')); } if (empty($this->_entityTypeCode)) { throw new \Magento\Framework\Exception\LocalizedException( __('The current module EAV entity is undefined.') ); } } /** * Get EAV website table * * Get table, where website-dependent attribute parameters are stored * If realization doesn't demand this functionality, let this function just return null * * @return string|null * @codeCoverageIgnore */ protected function _getEavWebsiteTable() { return null; } /** * Set current store to collection * * @param \Magento\Store\Model\Store|string|int $store * @return $this * @codeCoverageIgnore */ public function setStore($store) { $this->_store = $this->_storeManager->getStore($store); return $this; } /** * Return current store instance * * @return \Magento\Store\Model\Store */ public function getStore() { if ($this->_store === null) { $this->_store = $this->_storeManager->getStore(); } return $this->_store; } /** * Set entity type instance to collection * * @param \Magento\Eav\Model\Entity\Type|string|int $entityType * @return $this * @codeCoverageIgnore */ public function setEntityType($entityType) { $this->_entityType = $this->_eavConfig->getEntityType($entityType); return $this; } /** * Return current entity type instance * * @return \Magento\Eav\Model\Entity\Type */ public function getEntityType() { if ($this->_entityType === null) { $this->setEntityType($this->_entityTypeCode); } return $this->_entityType; } /** * Add Form Code filter to collection * * @param string $code * @return $this * @codeCoverageIgnore */ public function addFormCodeFilter($code) { return $this->addFieldToFilter('main_table.form_code', $code); } /** * Set order by attribute sort order * * @param string $direction * @return $this */ public function setSortOrder($direction = self::SORT_ORDER_ASC) { $this->setOrder('ea.is_user_defined', self::SORT_ORDER_ASC); return $this->setOrder('ca.sort_order', $direction); } /** * Add joins to select * * @return $this */ protected function _beforeLoad() { $select = $this->getSelect(); $connection = $this->getConnection(); $entityType = $this->getEntityType(); $this->setItemObjectClass($entityType->getAttributeModel()); $eaColumns = []; $caColumns = []; $saColumns = []; $eaDescribe = $connection->describeTable($this->getTable('eav_attribute')); unset($eaDescribe['attribute_id']); foreach (array_keys($eaDescribe) as $columnName) { $eaColumns[$columnName] = $columnName; } $select->join( ['ea' => $this->getTable('eav_attribute')], 'main_table.attribute_id = ea.attribute_id', $eaColumns ); // join additional attribute data table $additionalTable = $entityType->getAdditionalAttributeTable(); if ($additionalTable) { $caDescribe = $connection->describeTable($this->getTable($additionalTable)); unset($caDescribe['attribute_id']); foreach (array_keys($caDescribe) as $columnName) { $caColumns[$columnName] = $columnName; } $select->join( ['ca' => $this->getTable($additionalTable)], 'main_table.attribute_id = ca.attribute_id', $caColumns ); } // add scope values if ($this->_getEavWebsiteTable()) { $saDescribe = $connection->describeTable($this->_getEavWebsiteTable()); unset($saDescribe['attribute_id']); foreach (array_keys($saDescribe) as $columnName) { if ($columnName == 'website_id') { $saColumns['scope_website_id'] = $columnName; } else { if (isset($eaColumns[$columnName])) { $code = sprintf('scope_%s', $columnName); $expression = $connection->getCheckSql('sa.%s IS NULL', 'ea.%s', 'sa.%s'); $saColumns[$code] = new \Zend_Db_Expr( sprintf($expression, $columnName, $columnName, $columnName) ); } elseif (isset($caColumns[$columnName])) { $code = sprintf('scope_%s', $columnName); $expression = $connection->getCheckSql('sa.%s IS NULL', 'ca.%s', 'sa.%s'); $saColumns[$code] = new \Zend_Db_Expr( sprintf($expression, $columnName, $columnName, $columnName) ); } } } $store = $this->getStore(); $joinWebsiteExpression = $connection->quoteInto( 'sa.attribute_id = main_table.attribute_id AND sa.website_id = ?', (int)$store->getWebsiteId() ); $select->joinLeft(['sa' => $this->_getEavWebsiteTable()], $joinWebsiteExpression, $saColumns); } // add store attribute label $storeLabelExpr = $connection->getCheckSql('al.value IS NULL', 'ea.frontend_label', 'al.value'); $joinExpression = $connection->quoteInto( 'al.attribute_id = main_table.attribute_id AND al.store_id = ?', (int)$store->getId() ); $select->joinLeft( ['al' => $this->getTable('eav_attribute_label')], $joinExpression, ['store_label' => $storeLabelExpr] ); // add entity type filter $select->where('ea.entity_type_id = ?', (int)$entityType->getId()); return parent::_beforeLoad(); } }