<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Catalog\Block\Product;
/**
* Class AbstractProduct
* @api
* @deprecated 102.0.0
* @SuppressWarnings(PHPMD.NumberOfChildren)
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
* @since 100.0.2
*/
class AbstractProduct extends \Magento\Framework\View\Element\Template
{
/**
* @var array
*/
protected $_priceBlock = [];
/**
* Flag which allow/disallow to use link for as low as price
*
* @var bool
*/
protected $_useLinkForAsLowAs = true;
/**
* Default product amount per row
*
* @var int
*/
protected $_defaultColumnCount = 3;
/**
* Product amount per row depending on custom page layout of category
*
* @var array
*/
protected $_columnCountLayoutDepend = [];
/**
* Core registry
*
* @var \Magento\Framework\Registry
*/
protected $_coreRegistry;
/**
* Tax data
*
* @var \Magento\Tax\Helper\Data
*/
protected $_taxData;
/**
* Catalog config
*
* @var \Magento\Catalog\Model\Config
*/
protected $_catalogConfig;
/**
* @var \Magento\Framework\Math\Random
*/
protected $_mathRandom;
/**
* @var \Magento\Checkout\Helper\Cart
*/
protected $_cartHelper;
/**
* @var \Magento\Wishlist\Helper\Data
*/
protected $_wishlistHelper;
/**
* @var \Magento\Catalog\Helper\Product\Compare
*/
protected $_compareProduct;
/**
* @var \Magento\Catalog\Helper\Image
*/
protected $_imageHelper;
/**
* @var ReviewRendererInterface
*/
protected $reviewRenderer;
/**
* @var \Magento\CatalogInventory\Api\StockRegistryInterface
*/
protected $stockRegistry;
/**
* @var ImageBuilder
* @since 102.0.0
*/
protected $imageBuilder;
/**
* @param Context $context
* @param array $data
*/
public function __construct(\Magento\Catalog\Block\Product\Context $context, array $data = [])
{
$this->_imageHelper = $context->getImageHelper();
$this->imageBuilder = $context->getImageBuilder();
$this->_compareProduct = $context->getCompareProduct();
$this->_wishlistHelper = $context->getWishlistHelper();
$this->_cartHelper = $context->getCartHelper();
$this->_catalogConfig = $context->getCatalogConfig();
$this->_coreRegistry = $context->getRegistry();
$this->_taxData = $context->getTaxData();
$this->_mathRandom = $context->getMathRandom();
$this->reviewRenderer = $context->getReviewRenderer();
$this->stockRegistry = $context->getStockRegistry();
parent::__construct($context, $data);
}
/**
* Retrieve url for add product to cart
*
* Will return product view page URL if product has required options
*
* @param \Magento\Catalog\Model\Product $product
* @param array $additional
* @return string
*/
public function getAddToCartUrl($product, $additional = [])
{
if (!$product->getTypeInstance()->isPossibleBuyFromList($product)) {
if (!isset($additional['_escape'])) {
$additional['_escape'] = true;
}
if (!isset($additional['_query'])) {
$additional['_query'] = [];
}
$additional['_query']['options'] = 'cart';
return $this->getProductUrl($product, $additional);
}
return $this->_cartHelper->getAddUrl($product, $additional);
}
/**
* Retrieves url for form submitting.
*
* Some objects can use setSubmitRouteData() to set route and params for form submitting,
* otherwise default url will be used
*
* @param \Magento\Catalog\Model\Product $product
* @param array $additional
* @return string
*/
public function getSubmitUrl($product, $additional = [])
{
$submitRouteData = $this->getData('submit_route_data');
if ($submitRouteData) {
$route = $submitRouteData['route'];
$params = isset($submitRouteData['params']) ? $submitRouteData['params'] : [];
$submitUrl = $this->getUrl($route, array_merge($params, $additional));
} else {
$submitUrl = $this->getAddToCartUrl($product, $additional);
}
return $submitUrl;
}
/**
* Retrieve add to wishlist params
*
* @param \Magento\Catalog\Model\Product $product
* @return string
*/
public function getAddToWishlistParams($product)
{
return $this->_wishlistHelper->getAddParams($product);
}
/**
* Retrieve Add Product to Compare Products List URL
*
* @return string
*/
public function getAddToCompareUrl()
{
return $this->_compareProduct->getAddUrl();
}
/**
* Gets minimal sales quantity
*
* @param \Magento\Catalog\Model\Product $product
* @return float|null
*/
public function getMinimalQty($product)
{
$stockItem = $this->stockRegistry->getStockItem($product->getId(), $product->getStore()->getWebsiteId());
$minSaleQty = $stockItem->getMinSaleQty();
return $minSaleQty > 0 ? $minSaleQty : null;
}
/**
* Get product reviews summary
*
* @param \Magento\Catalog\Model\Product $product
* @param bool $templateType
* @param bool $displayIfNoReviews
* @return string
*/
public function getReviewsSummaryHtml(
\Magento\Catalog\Model\Product $product,
$templateType = false,
$displayIfNoReviews = false
) {
return $this->reviewRenderer->getReviewsSummaryHtml($product, $templateType, $displayIfNoReviews);
}
/**
* Retrieve currently viewed product object
*
* @return \Magento\Catalog\Model\Product
*/
public function getProduct()
{
if (!$this->hasData('product')) {
$this->setData('product', $this->_coreRegistry->registry('product'));
}
return $this->getData('product');
}
/**
* Add all attributes and apply pricing logic to products collection
* to get correct values in different products lists.
* E.g. crosssells, upsells, new products, recently viewed
*
* @param \Magento\Catalog\Model\ResourceModel\Product\Collection $collection
* @return \Magento\Catalog\Model\ResourceModel\Product\Collection
*/
protected function _addProductAttributesAndPrices(
\Magento\Catalog\Model\ResourceModel\Product\Collection $collection
) {
return $collection
->addMinimalPrice()
->addFinalPrice()
->addTaxPercents()
->addAttributeToSelect($this->_catalogConfig->getProductAttributes())
->addUrlRewrite();
}
/**
* Retrieve Product URL using UrlDataObject
*
* @param \Magento\Catalog\Model\Product $product
* @param array $additional the route params
* @return string
*/
public function getProductUrl($product, $additional = [])
{
if ($this->hasProductUrl($product)) {
if (!isset($additional['_escape'])) {
$additional['_escape'] = true;
}
return $product->getUrlModel()->getUrl($product, $additional);
}
return '#';
}
/**
* Check Product has URL
*
* @param \Magento\Catalog\Model\Product $product
* @return bool
*/
public function hasProductUrl($product)
{
if ($product->getVisibleInSiteVisibilities()) {
return true;
}
if ($product->hasUrlDataObject()) {
if (in_array($product->hasUrlDataObject()->getVisibility(), $product->getVisibleInSiteVisibilities())) {
return true;
}
}
return false;
}
/**
* Retrieve product amount per row
*
* @return int
*/
public function getColumnCount()
{
if (!$this->_getData('column_count')) {
$pageLayout = $this->getPageLayout();
if ($pageLayout && $this->getColumnCountLayoutDepend($pageLayout->getCode())) {
$this->setData('column_count', $this->getColumnCountLayoutDepend($pageLayout->getCode()));
} else {
$this->setData('column_count', $this->_defaultColumnCount);
}
}
return (int) $this->_getData('column_count');
}
/**
* Add row size depends on page layout
*
* @param string $pageLayout
* @param int $columnCount
* @return \Magento\Catalog\Block\Product\ListProduct
*/
public function addColumnCountLayoutDepend($pageLayout, $columnCount)
{
$this->_columnCountLayoutDepend[$pageLayout] = $columnCount;
return $this;
}
/**
* Remove row size depends on page layout
*
* @param string $pageLayout
* @return \Magento\Catalog\Block\Product\ListProduct
*/
public function removeColumnCountLayoutDepend($pageLayout)
{
if (isset($this->_columnCountLayoutDepend[$pageLayout])) {
unset($this->_columnCountLayoutDepend[$pageLayout]);
}
return $this;
}
/**
* Retrieve row size depends on page layout
*
* @param string $pageLayout
* @return int|boolean
*/
public function getColumnCountLayoutDepend($pageLayout)
{
if (isset($this->_columnCountLayoutDepend[$pageLayout])) {
return $this->_columnCountLayoutDepend[$pageLayout];
}
return false;
}
/**
* Retrieve current page layout
*
* @return string
*/
public function getPageLayout()
{
// TODO: Implement of getting current page layout
return '';
}
/**
* Check whether the price can be shown for the specified product
*
* @param \Magento\Catalog\Model\Product $product
* @return bool
* @SuppressWarnings(PHPMD.BooleanGetMethodName)
*/
public function getCanShowProductPrice($product)
{
return $product->getCanShowPrice() !== false;
}
/**
* Get if it is necessary to show product stock status
*
* @return bool
*/
public function displayProductStockStatus()
{
$statusInfo = new \Magento\Framework\DataObject(['display_status' => true]);
$this->_eventManager->dispatch('catalog_block_product_status_display', ['status' => $statusInfo]);
return (bool) $statusInfo->getDisplayStatus();
}
/**
* Get random string
*
* @param int $length
* @param string|null $chars
* @return string
*/
public function getRandomString($length, $chars = null)
{
return $this->_mathRandom->getRandomString($length, $chars);
}
/**
* Return HTML block with price
*
* @param \Magento\Catalog\Model\Product $product
* @return string
*/
public function getProductPrice(\Magento\Catalog\Model\Product $product)
{
return $this->getProductPriceHtml(
$product,
\Magento\Catalog\Pricing\Price\FinalPrice::PRICE_CODE,
\Magento\Framework\Pricing\Render::ZONE_ITEM_LIST
);
}
/**
* Return HTML block with tier price
*
* @param \Magento\Catalog\Model\Product $product
* @param string $priceType
* @param string $renderZone
* @param array $arguments
* @return string
*/
public function getProductPriceHtml(
\Magento\Catalog\Model\Product $product,
$priceType,
$renderZone = \Magento\Framework\Pricing\Render::ZONE_ITEM_LIST,
array $arguments = []
) {
if (!isset($arguments['zone'])) {
$arguments['zone'] = $renderZone;
}
/** @var \Magento\Framework\Pricing\Render $priceRender */
$priceRender = $this->getLayout()->getBlock('product.price.render.default');
$price = '';
if ($priceRender) {
$price = $priceRender->render($priceType, $product, $arguments);
}
return $price;
}
/**
* Whether redirect to cart enabled
*
* @return bool
*/
public function isRedirectToCartEnabled()
{
return $this->_scopeConfig->getValue(
'checkout/cart/redirect_to_cart',
\Magento\Store\Model\ScopeInterface::SCOPE_STORE
);
}
/**
* Retrieve product details html
*
* @param \Magento\Catalog\Model\Product $product
* @return mixed
*/
public function getProductDetailsHtml(\Magento\Catalog\Model\Product $product)
{
$renderer = $this->getDetailsRenderer($product->getTypeId());
if ($renderer) {
$renderer->setProduct($product);
return $renderer->toHtml();
}
return '';
}
/**
* Get the renderer that will be used to render the details block
*
* @param string|null $type
* @return bool|\Magento\Framework\View\Element\AbstractBlock
*/
public function getDetailsRenderer($type = null)
{
if ($type === null) {
$type = 'default';
}
$rendererList = $this->getDetailsRendererList();
if ($rendererList) {
return $rendererList->getRenderer($type, 'default');
}
return null;
}
/**
* Return the list of details
*
* @return \Magento\Framework\View\Element\RendererList
*/
protected function getDetailsRendererList()
{
return $this->getDetailsRendererListName() ? $this->getLayout()->getBlock(
$this->getDetailsRendererListName()
) : $this->getChildBlock(
'details.renderers'
);
}
/**
* Retrieve product image
*
* @param \Magento\Catalog\Model\Product $product
* @param string $imageId
* @param array $attributes
* @return \Magento\Catalog\Block\Product\Image
*/
public function getImage($product, $imageId, $attributes = [])
{
return $this->imageBuilder->create($product, $imageId, $attributes);
}
}
|