![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/vendor/mageworx/module-seobase/Block/Adminhtml/Widget/Chooser/ |
<?php /** * Copyright © 2018 MageWorx. All rights reserved. * See LICENSE.txt for license details. */ namespace MageWorx\SeoBase\Block\Adminhtml\Widget\Chooser; use Magento\Backend\Block\Widget\Grid\Column; use Magento\Backend\Block\Widget\Grid\Extended; use Magento\Framework\Data\Form\Element\AbstractElement; use Magento\Catalog\Model\Product\Attribute\Source\Status as ProductStatusOptionsProvider; use Magento\Catalog\Model\Product\Visibility as ProductVisibilityOptionsProvider; class Product extends Extended { /** * @var array */ protected $selectedProducts = []; /** * @var \Magento\Catalog\Model\ResourceModel\Category */ protected $resourceCategory; /** * @var \Magento\Catalog\Model\ResourceModel\Product */ protected $resourceProduct; /** * @var \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory */ protected $collectionFactory; /** * @var \Magento\Catalog\Model\CategoryFactory */ protected $categoryFactory; /** * @var ProductStatusVisibilityProvider */ protected $productVisibilityOptionsProvider; /** * @var ProductStatusOptionsProvider */ protected $productStatusOptionsProvider; /** * @var string */ protected $controllerUri = 'mageworx_seobase/widget_chooser/product'; /** * Product constructor. * * @param \Magento\Backend\Block\Template\Context $context * @param \Magento\Backend\Helper\Data $backendHelper * @param \Magento\Catalog\Model\CategoryFactory $categoryFactory * @param \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $collectionFactory * @param \Magento\Catalog\Model\ResourceModel\Category $resourceCategory * @param \Magento\Catalog\Model\ResourceModel\Product $resourceProduct * @param ProductStatusOptionsProvider $productStatusOptionsProvider * @param ProductVisibilityOptionsProvider $productVisibilityOptionsProvider * @param array $data */ public function __construct( \Magento\Backend\Block\Template\Context $context, \Magento\Backend\Helper\Data $backendHelper, \Magento\Catalog\Model\CategoryFactory $categoryFactory, \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $collectionFactory, \Magento\Catalog\Model\ResourceModel\Category $resourceCategory, \Magento\Catalog\Model\ResourceModel\Product $resourceProduct, ProductStatusOptionsProvider $productStatusOptionsProvider, ProductVisibilityOptionsProvider $productVisibilityOptionsProvider, array $data = [] ) { $this->categoryFactory = $categoryFactory; $this->collectionFactory = $collectionFactory; $this->resourceCategory = $resourceCategory; $this->resourceProduct = $resourceProduct; $this->productStatusOptionsProvider = $productStatusOptionsProvider; $this->productVisibilityOptionsProvider = $productVisibilityOptionsProvider; parent::__construct($context, $backendHelper, $data); } /** * Block construction, prepare grid params * * @return void */ protected function _construct() { parent::_construct(); $this->setDefaultSort('name'); $this->setUseAjax(true); } /** * Prepare chooser element HTML * * @param AbstractElement $element Form Element * @return AbstractElement */ public function prepareElementHtml(AbstractElement $element) { $uniqId = $this->mathRandom->getUniqueHash($element->getId()); $sourceUrl = $this->getUrl( $this->controllerUri, ['uniq_id' => $uniqId, 'use_massaction' => false] ); $chooser = $this->getLayout()->createBlock( \Magento\Widget\Block\Adminhtml\Widget\Chooser::class )->setElement( $element )->setConfig( $this->getConfig() )->setFieldsetId( $this->getFieldsetId() )->setSourceUrl( $sourceUrl )->setUniqId( $uniqId ); if ($element->getValue()) { $value = explode('/', $element->getValue()); $productId = false; if (isset($value[0]) && isset($value[1]) && $value[0] == 'product') { $productId = $value[1]; } $categoryId = isset($value[2]) ? $value[2] : false; $label = ''; if ($categoryId) { $label = $this->resourceCategory->getAttributeRawValue( $categoryId, 'name', $this->_storeManager->getStore() ) . '/'; } if ($productId) { $label .= $this->resourceProduct->getAttributeRawValue( $productId, 'name', $this->_storeManager->getStore() ); } $chooser->setLabel($label); } $element->setData('after_element_html', $chooser->toHtml()); return $element; } /** * Checkbox Check JS Callback * * @return string */ public function getCheckboxCheckCallback() { if ($this->getUseMassaction()) { return "function (grid, element) { $(grid.containerId).fire('product:changed', {element: element}); }"; } } /** * Grid Row JS Callback * * @return string */ public function getRowClickCallback() { if (!$this->getUseMassaction()) { $chooserJsObject = $this->getId(); return ' function (grid, event) { var trElement = Event.findElement(event, "tr"); var productId = trElement.down("td").innerHTML; var productName = trElement.down("td").next().innerHTML; var optionLabel = productName; var optionValue = "product/" + productId.replace(/^\s+|\s+$/g,""); ' . $chooserJsObject . '.setElementValue(optionValue); ' . $chooserJsObject . '.setElementLabel(optionLabel); ' . $chooserJsObject . '.close(); } '; } } /** * Category Tree node onClick listener js function * * @return string */ public function getCategoryClickListenerJs() { $js = ' function (node, e) { {jsObject}.addVarToUrl("category_id", node.attributes.id); {jsObject}.reload({jsObject}.url); {jsObject}.categoryId = node.attributes.id != "none" ? node.attributes.id : false; {jsObject}.categoryName = node.attributes.id != "none" ? node.text : false; } '; $js = str_replace('{jsObject}', $this->getJsObjectName(), $js); return $js; } /** * Filter checked/unchecked rows in grid * * @param Column $column * @return $this */ protected function _addColumnFilterToCollection($column) { if ($column->getId() == 'in_products') { $selected = $this->getSelectedProducts(); if ($column->getFilter()->getValue()) { $this->getCollection()->addFieldToFilter('entity_id', ['in' => $selected]); } else { $this->getCollection()->addFieldToFilter('entity_id', ['nin' => $selected]); } } else { parent::_addColumnFilterToCollection($column); } return $this; } /** * Prepare products collection, defined collection filters (category, product type) * * @return Extended */ protected function _prepareCollection() { /* @var $collection \Magento\Catalog\Model\ResourceModel\Product\Collection */ $collection = $this->collectionFactory->create() ->setStoreId(0) ->addAttributeToSelect('name') ->addAttributeToSelect('status') ->addAttributeToSelect('visibility'); if ($categoryId = $this->getCategoryId()) { $category = $this->categoryFactory->create()->load($categoryId); if ($category->getId()) { // $collection->addCategoryFilter($category); $productIds = $category->getProductsPosition(); $productIds = array_keys($productIds); if (empty($productIds)) { $productIds = 0; } $collection->addFieldToFilter('entity_id', ['in' => $productIds]); } } if ($productTypeId = $this->getProductTypeId()) { $collection->addAttributeToFilter('type_id', $productTypeId); } $this->setCollection($collection); return parent::_prepareCollection(); } /** * Prepare columns for products grid * * @return Extended */ protected function _prepareColumns() { if ($this->getUseMassaction()) { $this->addColumn( 'in_products', [ 'header_css_class' => 'a-center', 'type' => 'checkbox', 'name' => 'in_products', 'inline_css' => 'checkbox entities', 'field_name' => 'in_products', 'values' => $this->getSelectedProducts(), 'align' => 'center', 'index' => 'entity_id', 'use_index' => true ] ); } $this->addColumn( 'entity_id', [ 'header' => __('ID'), 'sortable' => true, 'index' => 'entity_id', 'header_css_class' => 'col-id', 'column_css_class' => 'col-id' ] ); $this->addColumn( 'chooser_name', [ 'header' => __('Product'), 'name' => 'chooser_name', 'index' => 'name', 'header_css_class' => 'col-product', 'column_css_class' => 'col-product' ] ); $this->addColumn( 'chooser_sku', [ 'header' => __('SKU'), 'name' => 'chooser_sku', 'index' => 'sku', 'header_css_class' => 'col-sku', 'column_css_class' => 'col-sku' ] ); $this->addColumn( 'chooser_visibility', [ 'header' => __('Visibility'), 'name' => 'chooser_visibility', 'index' => 'visibility', 'header_css_class' => 'col-visibility', 'column_css_class' => 'col-visibility', 'type' => 'options', 'options' => $this->optionsToArray($this->productVisibilityOptionsProvider->toOptionArray()) ] ); $this->addColumn( 'chooser_status', [ 'header' => __('Status'), 'name' => 'chooser_status', 'index' => 'status', 'header_css_class' => 'col-status', 'column_css_class' => 'col-status', 'type' => 'options', 'options' => $this->optionsToArray($this->productStatusOptionsProvider->toOptionArray()) ] ); return parent::_prepareColumns(); } /** * Adds additional parameter to URL for loading only products grid * * @return string */ public function getGridUrl() { return $this->getUrl( $this->controllerUri, [ 'products_grid' => true, '_current' => true, 'uniq_id' => $this->getId(), 'use_massaction' => $this->getUseMassaction(), 'product_type_id' => $this->getProductTypeId() ] ); } /** * Setter * * @param int[] $selectedProducts * @return $this */ public function setSelectedProducts($selectedProducts) { $this->selectedProducts = $selectedProducts; return $this; } /** * Getter * * @return int[] */ public function getSelectedProducts() { if ($selectedProducts = $this->getRequest()->getParam('selected_products', null)) { $this->setSelectedProducts($selectedProducts); } return $this->selectedProducts; } /** * Get options in "key-value" format * * @param array $tmpOptions * @return array */ protected function optionsToArray($tmpOptions) { $_options = []; foreach ($tmpOptions as $option) { $_options[$option['value']] = $option['label']; } return $_options; } public function escapeJs($string) { return $this->_escaper->escapeJs($string); } }