Magento 1 - Как проверить, является ли продукт новым
Из быстрого поиска единственная ссылка, которую я нашел, была на форумах Magento, в которой предлагается написать какой-то пользовательский код, чтобы проверить, является ли продукт новым.
Я бы подумал, что в Mage_Catalog_Model_Product
будет простой метод isNew()
, который учитывает раскрывающийся список С признаками , а также поля Установить продукт Как новый С даты и Установить продукт Как новый На сегодняшний день - но, похоже, это не так?
Являются нужен ли пользовательский код?
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/
Нет ни одного вызова метода. По крайней мере, я об этом не знаю.
Тем не менее, вы всегда можете использовать что-то вроде этого:
<?php if (date("Y-m-d") >= substr($_product->getNewsFromDate(), 0, 10) && date("Y-m-d") <= substr($_product->getNewsToDate(), 0, 10)) : ?>
...
<?php endif ?>
Извините, я плохо разбираюсь в сравнении дат PHP.
Кстати, хороший вопрос.
Для справки, вот вспомогательный метод, который я придумал, чтобы проверить новизну. Он поддерживает как раскрывающийся список, так и даты, а также поддерживает, чтобы любая дата была пустой.
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)
.
Точность, которая может быть кому-то полезна. Все эти ответы используют атрибут "news_from_date", но если вы хотите получить фактическую дату создания продукта в базе данных, вы должны получить атрибут "created_at", используя метод:
$product->getCreatedAt()
В проекте, над которым я работаю, некоторые продукты могут иметь значение "news_from_date", отличное от "created_at". Действительно, в соответствии с бизнес-правилами, продукт может отсутствовать на складе в течение длительного времени, а затем вернуться в качестве новые товары, когда они появятся в каталоге.
Быстрое Решение
<?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 ?>
Вы можете попробовать следующий код
$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
, и вам нужно загрузить продукт, если он еще не загружен.