doug48
9/19/2016 - 7:26 AM

magento 2 is new from date

magento 2 is new from date

<?php

namespace PartyShowroom\Core\Model;

use Magento\Framework\Model\AbstractModel;

/** constructor dependent */
use Magento\Framework\Model\Context;
use Magento\Framework\Registry;
use Magento\Framework\Model\ResourceModel\AbstractResource;
use Magento\Framework\Data\Collection\AbstractDb;

/** injected Classes */
use Magento\Catalog\Model\Config;
use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
use Magento\Framework\Stdlib\DateTime\TimezoneInterface;
use Magento\Catalog\Model\Product\Visibility;

class NewProduct extends AbstractModel
{
    /**
     * @var TimezoneInterface
     */
    private $localeDate;

    /**
     * @var $productCollection \Magento\Catalog\Model\ResourceModel\Product\Collection
     */
    private $productCollection;
    /**
     * @var Visibility
     */
    private $catalogProductVisibility;
    /**
     * @var Config
     */
    private $catalogConfig;

    /**
     * NewProduct constructor.
     * @param CollectionFactory $productCollectionFactory
     * @param TimezoneInterface $localeDate
     * @param Visibility $catalogProductVisibility
     * @param Config $catalogConfig
     * @param Context $context
     * @param Registry $registry
     * @param AbstractResource|null $resource
     * @param AbstractDb|null $resourceCollection
     * @param array $data
     */
    public function __construct(
        CollectionFactory $productCollectionFactory,
        TimezoneInterface $localeDate,
        Visibility $catalogProductVisibility,
        Config $catalogConfig,

        Context $context,
        Registry $registry,
        AbstractResource $resource = null,
        AbstractDb $resourceCollection = null,
        array $data = []
    )

    {
        parent::__construct($context, $registry, $resource, $resourceCollection, $data);
        $this->localeDate = $localeDate;
        $this->productCollection = $productCollectionFactory->create();
        $this->catalogProductVisibility = $catalogProductVisibility;
        $this->catalogConfig = $catalogConfig;
    }

    /**
     * @param $pageSize
     * @return \Magento\Catalog\Model\ResourceModel\Product\Collection
     */
    public function getNewProductsCollection($pageSize)
    {
        $this->productCollection->setVisibility($this->catalogProductVisibility->getVisibleInCatalogIds());

        $this->productCollection = $this->_addProductAttributesAndPrices(
            $this->productCollection
        )->addStoreFilter()->addAttributeToFilter(
            'news_from_date',
            [
                'or' => [
                    0 => ['date' => true, 'to' => $this->_getTodayEndOfDayDate()],
                    1 => ['is' => new \Zend_Db_Expr('null')],
                ]
            ],
            'left'
        )->addAttributeToFilter(
            'news_to_date',
            [
                'or' => [
                    0 => ['date' => true, 'from' => $this->_getTodayStartOfDayData()],
                    1 => ['is' => new \Zend_Db_Expr('null')],
                ]
            ],
            'left'
        )->addAttributeToFilter(
            [
                ['attribute' => 'news_from_date', 'is' => new \Zend_Db_Expr('not null')],
                ['attribute' => 'news_to_date', 'is' => new \Zend_Db_Expr('not null')],
            ]
        )->addAttributeToSort(
            'news_from_date',
            'desc'
        )->setPageSize(
            $pageSize
        )->setCurPage(
            1
        );

        return $this->productCollection;
    }
    
    protected function _getTodayStartOfDayData()
    {
        return $this->localeDate->date()->setTime(0, 0, 0)->format('Y-m-d H:i:s');
    }
    
    protected function _getTodayEndOfDayDate()
    {
        return $this->localeDate->date()->setTime(23, 59, 59)->format('Y-m-d H:i:s');
    }

    /**
     * @param $collection
     * @return mixed
     */
    protected function _addProductAttributesAndPrices($collection) {
        return $collection
            ->addMinimalPrice()
            ->addFinalPrice()
            ->addTaxPercents()
            ->addAttributeToSelect($this->catalogConfig->getProductAttributes())
            ->addUrlRewrite();
    }
}