<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Catalog\Model\Product;
use Magento\Framework\Data\OptionSourceInterface;
use Magento\Framework\DB\Ddl\Table;
/**
* Catalog Product visibility model and attribute source model
*
* @api
* @since 100.0.2
*/
class Visibility extends \Magento\Framework\DataObject implements OptionSourceInterface
{
const VISIBILITY_NOT_VISIBLE = 1;
const VISIBILITY_IN_CATALOG = 2;
const VISIBILITY_IN_SEARCH = 3;
const VISIBILITY_BOTH = 4;
/**
* Reference to the attribute instance
*
* @var \Magento\Catalog\Model\ResourceModel\Eav\Attribute
*/
protected $_attribute;
/**
* Eav entity attribute
*
* @var \Magento\Eav\Model\ResourceModel\Entity\Attribute
*/
protected $_eavEntityAttribute;
/**
* Construct
*
* @param \Magento\Eav\Model\ResourceModel\Entity\Attribute $eavEntityAttribute
* @param array $data
*/
public function __construct(
\Magento\Eav\Model\ResourceModel\Entity\Attribute $eavEntityAttribute,
array $data = []
) {
$this->_eavEntityAttribute = $eavEntityAttribute;
parent::__construct($data);
}
/**
* Retrieve visible in catalog ids array
*
* @return int[]
*/
public function getVisibleInCatalogIds()
{
return [self::VISIBILITY_IN_CATALOG, self::VISIBILITY_BOTH];
}
/**
* Retrieve visible in search ids array
*
* @return int[]
*/
public function getVisibleInSearchIds()
{
return [self::VISIBILITY_IN_SEARCH, self::VISIBILITY_BOTH];
}
/**
* Retrieve visible in site ids array
*
* @return int[]
*/
public function getVisibleInSiteIds()
{
return [self::VISIBILITY_IN_SEARCH, self::VISIBILITY_IN_CATALOG, self::VISIBILITY_BOTH];
}
/**
* Retrieve option array
*
* @return array
* phpcs:disable Magento2.Functions.StaticFunction
*/
public static function getOptionArray()
{
return [
self::VISIBILITY_NOT_VISIBLE => __('Not Visible Individually'),
self::VISIBILITY_IN_CATALOG => __('Catalog'),
self::VISIBILITY_IN_SEARCH => __('Search'),
self::VISIBILITY_BOTH => __('Catalog, Search')
];
}
/**
* Retrieve all options
*
* @return array
*/
public static function getAllOption()
{
$options = self::getOptionArray();
array_unshift($options, ['value' => '', 'label' => '']);
return $options;
}
/**
* Retrieve all options
*
* @return array
*/
public static function getAllOptions()
{
$res = [];
foreach (self::getOptionArray() as $index => $value) {
$res[] = ['value' => $index, 'label' => $value];
}
return $res;
}
/**
* Retrieve option text
*
* @param int $optionId
* @return string
*/
public static function getOptionText($optionId)
{
$options = self::getOptionArray();
return $options[$optionId] ?? null;
}
//phpcs:enable Magento2.Functions.StaticFunction
/**
* Retrieve flat column definition
*
* @return array
*/
public function getFlatColumns()
{
$attributeCode = $this->getAttribute()->getAttributeCode();
return [
$attributeCode => [
'unsigned' => true,
'default' => null,
'extra' => null,
'type' => Table::TYPE_SMALLINT,
'nullable' => true,
'comment' => 'Catalog Product Visibility ' . $attributeCode . ' column',
],
];
}
/**
* Retrieve Indexes for Flat
*
* @return array
*/
public function getFlatIndexes()
{
return [];
}
/**
* Retrieve Select For Flat Attribute update
*
* @param int $store
* @return \Magento\Framework\DB\Select|null
*/
public function getFlatUpdateSelect($store)
{
return $this->_eavEntityAttribute->getFlatUpdateSelect($this->getAttribute(), $store);
}
/**
* Set attribute instance
*
* @param \Magento\Catalog\Model\ResourceModel\Eav\Attribute $attribute
* @return $this
*/
public function setAttribute($attribute)
{
$this->_attribute = $attribute;
return $this;
}
/**
* Get attribute instance
*
* @return \Magento\Catalog\Model\ResourceModel\Eav\Attribute
*/
public function getAttribute()
{
return $this->_attribute;
}
/**
* Add Value Sort To Collection Select
*
* @param \Magento\Eav\Model\Entity\Collection\AbstractCollection $collection
* @param string $dir direction
* @return $this
*/
public function addValueSortToCollection($collection, $dir = 'asc')
{
$attributeCode = $this->getAttribute()->getAttributeCode();
$attributeId = $this->getAttribute()->getId();
$attributeTable = $this->getAttribute()->getBackend()->getTable();
$linkField = $this->getAttribute()->getEntity()->getLinkField();
if ($this->getAttribute()->isScopeGlobal()) {
$tableName = $attributeCode . '_t';
$collection->getSelect()->joinLeft(
[$tableName => $attributeTable],
"e.{$linkField}={$tableName}.{$linkField}" .
" AND {$tableName}.attribute_id='{$attributeId}'" .
" AND {$tableName}.store_id='0'",
[]
);
$valueExpr = $tableName . '.value';
} else {
$valueTable1 = $attributeCode . '_t1';
$valueTable2 = $attributeCode . '_t2';
$collection->getSelect()->joinLeft(
[$valueTable1 => $attributeTable],
"e.{$linkField}={$valueTable1}.{$linkField}" .
" AND {$valueTable1}.attribute_id='{$attributeId}'" .
" AND {$valueTable1}.store_id='0'",
[]
)->joinLeft(
[$valueTable2 => $attributeTable],
"e.{$linkField}={$valueTable2}.{$linkField}" .
" AND {$valueTable2}.attribute_id='{$attributeId}'" .
" AND {$valueTable2}.store_id='{$collection->getStoreId()}'",
[]
);
$valueExpr = $collection->getConnection()->getCheckSql(
$valueTable2 . '.value_id > 0',
$valueTable2 . '.value',
$valueTable1 . '.value'
);
}
$collection->getSelect()->order($valueExpr . ' ' . $dir);
return $this;
}
/**
* @inheritdoc
*/
public function toOptionArray()
{
return $this->getAllOptions();
}
}
|