Magento 1 - Как проверить, является ли продукт новым


Из быстрого поиска единственная ссылка, которую я нашел, была на форумах Magento, в которой предлагается написать какой-то пользовательский код, чтобы проверить, является ли продукт новым.

Я бы подумал, что в Mage_Catalog_Model_Product будет простой метод isNew(), который учитывает раскрывающийся список С признаками , а также поля Установить продукт Как новый С даты и Установить продукт Как новый На сегодняшний день - но, похоже, это не так?

Являются нужен ли пользовательский код?

Author: Black, 2014-03-07

6 answers

Вы абсолютно не должны конвертировать и проверять даты вручную, потому что это может вызвать проблемы с часовым поясом. Magento имеет встроенный метод isStoreDateInInterval() в классе Mage_Core_Model_Locale. Поэтому вам следует создать вспомогательный метод, который может выглядеть следующим образом

function isProductNew(Mage_Catalog_Model_Product $product)
{
    $newsFromDate = $product->getNewsFromDate();
    $newsToDate   = $product->getNewsToDate();
    if (!$newsFromDate && !$newsToDate) {
        return false;
    }
    return Mage::app()->getLocale()
            ->isStoreDateInInterval($product->getStoreId(), $newsFromDate, $newsToDate);
}

Более подробную информацию вы можете найти здесь http://quicktips.ru/all/check-product-is-new/

 14
Author: Denis Óbukhov, 2018-12-17 14:54:03

Нет ни одного вызова метода. По крайней мере, я об этом не знаю.

Тем не менее, вы всегда можете использовать что-то вроде этого:

<?php if (date("Y-m-d") >= substr($_product->getNewsFromDate(), 0, 10) && date("Y-m-d") <= substr($_product->getNewsToDate(), 0, 10)) : ?>
...
<?php endif ?>

Извините, я плохо разбираюсь в сравнении дат PHP.

Кстати, хороший вопрос.

 6
Author: user487772, 2014-03-07 20:14:20

Для справки, вот вспомогательный метод, который я придумал, чтобы проверить новизну. Он поддерживает как раскрывающийся список, так и даты, а также поддерживает, чтобы любая дата была пустой.

public function isNew($product)
{
    if ($product->getData('featured_product')) {
        return true;
    }

    if ($product->getData('news_from_date') == null && $product->getData('news_to_date') == null) {
        return false;
    }

    if ($product->getData('news_from_date') !== null) {
        if (date('Y-m-d', strtotime($product->getData('news_from_date'))) > date('Y-m-d', time())) {
            return false;
        }
    }

    if ($product->getData('news_to_date') !== null) {
        if (date('Y-m-d', strtotime($product->getData('news_to_date'))) < date('Y-m-d', time())) {
            return false;
        }
    }

    return true;
}

ОБНОВЛЕНИЕ: Спасибо @Rooooomine за упоминание о том, что это ручное преобразование даты, которое я предложил, является очень плохой идеей из-за потенциальных проблем с локализацией. Вместо этого проверьте Mage::app()->getLocale()->isStoreDateInInterval($product->getStoreId(), $newsFromDate, $newsToDate).

 5
Author: kalenjordan, 2015-09-24 20:57:33

Точность, которая может быть кому-то полезна. Все эти ответы используют атрибут "news_from_date", но если вы хотите получить фактическую дату создания продукта в базе данных, вы должны получить атрибут "created_at", используя метод:

$product->getCreatedAt()

В проекте, над которым я работаю, некоторые продукты могут иметь значение "news_from_date", отличное от "created_at". Действительно, в соответствии с бизнес-правилами, продукт может отсутствовать на складе в течение длительного времени, а затем вернуться в качестве новые товары, когда они появятся в каталоге.

 3
Author: Laila, 2015-05-19 19:43:53

Быстрое Решение

    <?php
    foreach ($_productCollection as $_product):
    $date = date("Y-m-d 00:00:00");
        $newtodate = $_product['news_to_date'];
        $newfromdate = $_product['news_from_date'];

    if (isset($newfromdate) and isset($newtodate) and $date >= $newfromdate and $date <= $newtodate) 
       {
          echo "Product is new";
        }?>
     <?php endforeach ?>
 0
Author: chirag dodia, 2014-03-08 10:04:28

Вы можете попробовать следующий код

 $current_date = new DateTime($date); // compare date
 $from_date = new DateTime($this->getData('news_from_date')); // begin date
 $to_date = new DateTime($this->getData('news_to_date')); // end date        
 $new = ($current_date >= $from_date && $current_date <= $to_date);

Где $this - объект Mage_Catalog_Model_Product, и вам нужно загрузить продукт, если он еще не загружен.

 0
Author: Anshu Mishra, 2017-06-23 12:16:03