/vendor/magento/module-catalog/Block/Adminhtml/Product/Edit/Tab/Upsell.php
PHP | 376 lines | 244 code | 31 blank | 101 comment | 15 complexity | 64da6b82358288daebfc7c648a83e7c3 MD5 | raw file
- <?php
- /**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
- /**
- * Upsell products admin grid
- *
- * @author Magento Core Team <core@magentocommerce.com>
- */
- namespace Magento\Catalog\Block\Adminhtml\Product\Edit\Tab;
- class Upsell extends \Magento\Backend\Block\Widget\Grid\Extended
- {
- /**
- * Core registry
- *
- * @var \Magento\Framework\Registry
- */
- protected $_coreRegistry = null;
- /**
- * @var \Magento\Catalog\Model\Product\LinkFactory
- */
- protected $_linkFactory;
- /**
- * @var \Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\CollectionFactory]
- */
- protected $_setsFactory;
- /**
- * @var \Magento\Catalog\Model\ProductFactory
- */
- protected $_productFactory;
- /**
- * @var \Magento\Catalog\Model\Product\Type
- */
- protected $_type;
- /**
- * @var \Magento\Catalog\Model\Product\Attribute\Source\Status
- */
- protected $_status;
- /**
- * @var \Magento\Catalog\Model\Product\Visibility
- */
- protected $_visibility;
- /**
- * @param \Magento\Backend\Block\Template\Context $context
- * @param \Magento\Backend\Helper\Data $backendHelper
- * @param \Magento\Catalog\Model\Product\LinkFactory $linkFactory
- * @param \Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\CollectionFactory $setsFactory
- * @param \Magento\Catalog\Model\ProductFactory $productFactory
- * @param \Magento\Catalog\Model\Product\Type $type
- * @param \Magento\Catalog\Model\Product\Attribute\Source\Status $status
- * @param \Magento\Catalog\Model\Product\Visibility $visibility
- * @param \Magento\Framework\Registry $coreRegistry
- * @param array $data
- *
- * @SuppressWarnings(PHPMD.ExcessiveParameterList)
- */
- public function __construct(
- \Magento\Backend\Block\Template\Context $context,
- \Magento\Backend\Helper\Data $backendHelper,
- \Magento\Catalog\Model\Product\LinkFactory $linkFactory,
- \Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\CollectionFactory $setsFactory,
- \Magento\Catalog\Model\ProductFactory $productFactory,
- \Magento\Catalog\Model\Product\Type $type,
- \Magento\Catalog\Model\Product\Attribute\Source\Status $status,
- \Magento\Catalog\Model\Product\Visibility $visibility,
- \Magento\Framework\Registry $coreRegistry,
- array $data = []
- ) {
- $this->_linkFactory = $linkFactory;
- $this->_setsFactory = $setsFactory;
- $this->_productFactory = $productFactory;
- $this->_type = $type;
- $this->_status = $status;
- $this->_visibility = $visibility;
- $this->_coreRegistry = $coreRegistry;
- parent::__construct($context, $backendHelper, $data);
- }
- /**
- * Set grid params
- *
- * @return void
- */
- protected function _construct()
- {
- parent::_construct();
- $this->setId('up_sell_product_grid');
- $this->setDefaultSort('entity_id');
- $this->setUseAjax(true);
- if ($this->getProduct() && $this->getProduct()->getId()) {
- $this->setDefaultFilter(['in_products' => 1]);
- }
- if ($this->isReadonly()) {
- $this->setFilterVisibility(false);
- }
- }
- /**
- * Retirve currently edited product model
- *
- * @return \Magento\Catalog\Model\Product
- */
- public function getProduct()
- {
- return $this->_coreRegistry->registry('current_product');
- }
- /**
- * Add filter
- *
- * @param object $column
- * @return $this
- */
- protected function _addColumnFilterToCollection($column)
- {
- // Set custom filter for in product flag
- if ($column->getId() == 'in_products') {
- $productIds = $this->_getSelectedProducts();
- if (empty($productIds)) {
- $productIds = 0;
- }
- if ($column->getFilter()->getValue()) {
- $this->getCollection()->addFieldToFilter('entity_id', ['in' => $productIds]);
- } else {
- if ($productIds) {
- $this->getCollection()->addFieldToFilter('entity_id', ['nin' => $productIds]);
- }
- }
- } else {
- parent::_addColumnFilterToCollection($column);
- }
- return $this;
- }
- /**
- * Checks when this block is readonly
- *
- * @return boolean
- */
- public function isReadonly()
- {
- return $this->getProduct() && $this->getProduct()->getUpsellReadonly();
- }
- /**
- * Prepare collection
- *
- * @return \Magento\Backend\Block\Widget\Grid\Extended
- */
- protected function _prepareCollection()
- {
- $collection = $this->_linkFactory->create()->useUpSellLinks()->getProductCollection()->setProduct(
- $this->getProduct()
- )->addAttributeToSelect(
- '*'
- );
- if ($this->isReadonly()) {
- $productIds = $this->_getSelectedProducts();
- if (empty($productIds)) {
- $productIds = [0];
- }
- $collection->addFieldToFilter('entity_id', ['in' => $productIds]);
- }
- $this->setCollection($collection);
- return parent::_prepareCollection();
- }
- /**
- * Add columns to grid
- *
- * @return $this
- * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
- */
- protected function _prepareColumns()
- {
- if (!$this->getProduct()->getUpsellReadonly()) {
- $this->addColumn(
- 'in_products',
- [
- 'type' => 'checkbox',
- 'name' => 'in_products',
- 'values' => $this->_getSelectedProducts(),
- 'align' => 'center',
- 'index' => 'entity_id',
- 'header_css_class' => 'col-select',
- 'column_css_class' => 'col-select'
- ]
- );
- }
- $this->addColumn(
- 'entity_id',
- [
- 'header' => __('ID'),
- 'sortable' => true,
- 'index' => 'entity_id',
- 'header_css_class' => 'col-id',
- 'column_css_class' => 'col-id'
- ]
- );
- $this->addColumn(
- 'name',
- [
- 'header' => __('Name'),
- 'index' => 'name',
- 'header_css_class' => 'col-name',
- 'column_css_class' => 'col-name'
- ]
- );
- $this->addColumn(
- 'type',
- [
- 'header' => __('Type'),
- 'index' => 'type_id',
- 'type' => 'options',
- 'options' => $this->_type->getOptionArray(),
- 'header_css_class' => 'col-type',
- 'column_css_class' => 'col-type'
- ]
- );
- $sets = $this->_setsFactory->create()->setEntityTypeFilter(
- $this->_productFactory->create()->getResource()->getTypeId()
- )->load()->toOptionHash();
- $this->addColumn(
- 'set_name',
- [
- 'header' => __('Attribute Set'),
- 'index' => 'attribute_set_id',
- 'type' => 'options',
- 'options' => $sets,
- 'header_css_class' => 'col-attr-name',
- 'column_css_class' => 'col-attr-name'
- ]
- );
- $this->addColumn(
- 'status',
- [
- 'header' => __('Status'),
- 'index' => 'status',
- 'type' => 'options',
- 'options' => $this->_status->getOptionArray(),
- 'header_css_class' => 'col-status',
- 'column_css_class' => 'col-status'
- ]
- );
- $this->addColumn(
- 'visibility',
- [
- 'header' => __('Visibility'),
- 'index' => 'visibility',
- 'type' => 'options',
- 'options' => $this->_visibility->getOptionArray(),
- 'header_css_class' => 'col-visibility',
- 'column_css_class' => 'col-visibility'
- ]
- );
- $this->addColumn(
- 'sku',
- [
- 'header' => __('SKU'),
- 'index' => 'sku',
- 'header_css_class' => 'col-sku',
- 'column_css_class' => 'col-sku'
- ]
- );
- $this->addColumn(
- 'price',
- [
- 'header' => __('Price'),
- 'type' => 'currency',
- 'currency_code' => (string)$this->_scopeConfig->getValue(
- \Magento\Directory\Model\Currency::XML_PATH_CURRENCY_BASE,
- \Magento\Store\Model\ScopeInterface::SCOPE_STORE
- ),
- 'index' => 'price',
- 'header_css_class' => 'col-price',
- 'column_css_class' => 'col-price'
- ]
- );
- $this->addColumn(
- 'position',
- [
- 'header' => __('Position'),
- 'name' => 'position',
- 'type' => 'number',
- 'validate_class' => 'validate-number',
- 'index' => 'position',
- 'editable' => !$this->getProduct()->getUpsellReadonly(),
- 'edit_only' => !$this->getProduct()->getId(),
- 'header_css_class' => 'col-position',
- 'column_css_class' => 'col-position',
- 'filter_condition_callback' => [$this, 'filterProductPosition']
- ]
- );
- return parent::_prepareColumns();
- }
- /**
- * Rerieve grid URL
- *
- * @return string
- */
- public function getGridUrl()
- {
- return $this->_getData(
- 'grid_url'
- ) ? $this->_getData(
- 'grid_url'
- ) : $this->getUrl(
- 'catalog/*/upsellGrid',
- ['_current' => true]
- );
- }
- /**
- * Retrieve selected upsell products
- *
- * @return array
- */
- protected function _getSelectedProducts()
- {
- $products = $this->getProductsUpsell();
- if (!is_array($products)) {
- $products = array_keys($this->getSelectedUpsellProducts());
- }
- return $products;
- }
- /**
- * Retrieve upsell products
- *
- * @return array
- */
- public function getSelectedUpsellProducts()
- {
- $products = [];
- foreach ($this->_coreRegistry->registry('current_product')->getUpSellProducts() as $product) {
- $products[$product->getId()] = ['position' => $product->getPosition()];
- }
- return $products;
- }
- /**
- * Apply `position` filter to cross-sell grid.
- *
- * @param \Magento\Catalog\Model\ResourceModel\Product\Link\Product\Collection $collection
- * @param \Magento\Backend\Block\Widget\Grid\Column\Extended $column
- * @return $this
- */
- public function filterProductPosition($collection, $column)
- {
- $collection->addLinkAttributeToFilter($column->getIndex(), $column->getFilter()->getCondition());
- return $this;
- }
- }