Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
ApplyStatusAttributeJoin.php
Go to the documentation of this file.
1 <?php
6 declare(strict_types=1);
7 
9 
13 use Magento\Eav\Model\Config as EavConfig;
19 
24 {
28  private $productStatus;
29 
33  private $resourceConnection;
34 
38  private $eavConfig;
39 
43  private $storeManager;
44 
48  private $metadataPool;
49 
57  public function __construct(
58  Status $productStatus,
59  ResourceConnection $resourceConnection,
60  EavConfig $eavConfig,
61  StoreManagerInterface $storeManager,
62  MetadataPool $metadataPool
63  ) {
64  $this->productStatus = $productStatus;
65  $this->resourceConnection = $resourceConnection;
66  $this->eavConfig = $eavConfig;
67  $this->storeManager = $storeManager;
68  $this->metadataPool = $metadataPool;
69  }
70 
76  public function execute(Select $select)
77  {
78  $storeId = $this->storeManager->getStore()->getId();
79  $connection = $this->resourceConnection->getConnection();
80  $valueCondition = 'at_status.value';
81  $tableName = $this->resourceConnection->getTableName('catalog_product_entity_int');
82 
84  $select->join(
85  ['at_status_default' => $tableName],
86  $this->getConditionByAliasAndStoreId(Store::DEFAULT_STORE_ID, 'at_status_default'),
87  []
88  );
89  $valueCondition = $connection->getCheckSql(
90  'at_status.value_id > 0',
91  'at_status.value',
92  'at_status_default.value'
93  );
94  }
95 
96  $select->joinLeft(
97  ['at_status' => $tableName],
98  $this->getConditionByAliasAndStoreId((int)$storeId, 'at_status'),
99  ['status' => $valueCondition]
100  );
101  }
102 
109  private function getConditionByAliasAndStoreId(int $storeId, string $alias): string
110  {
111  $metadata = $this->metadataPool->getMetadata(ProductInterface::class);
112  $linkField = $metadata->getLinkField();
113  $attributeId = $this->eavConfig->getAttribute(Product::ENTITY, ProductInterface::STATUS)->getAttributeId();
114  $connection = $this->resourceConnection->getConnection();
115  $statusVisibilityCondition = $connection->prepareSqlCondition(
116  $alias . '.value',
117  ['in' => $this->productStatus->getVisibleStatusIds()]
118  );
119 
120  return implode(
121  [
122  $alias . '.' . $linkField . ' = product.' . $linkField,
123  $statusVisibilityCondition,
124  $connection->prepareSqlCondition($alias . '.store_id', $storeId),
125  $connection->prepareSqlCondition($alias . '.attribute_id', $attributeId),
126  ],
127  ' ' . Select::SQL_AND . ' '
128  );
129  }
130 }
$tableName
Definition: trigger.php:13
$storeManager
const SQL_AND
Definition: Select.php:77
__construct(Status $productStatus, ResourceConnection $resourceConnection, EavConfig $eavConfig, StoreManagerInterface $storeManager, MetadataPool $metadataPool)
if(!trim($html)) $alias
Definition: details.phtml:20
$connection
Definition: bulk.php:13