Как проверить, если продукт новый

15

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

Я бы подумал, что будет простой isNew()метод, Mage_Catalog_Model_Productкоторый учитывает раскрывающийся список « Рекомендуемые», а также поля « Установить продукт как новый с даты» и « Установить продукт как новый с датой» - но это не так?

Нужны ли пользовательские кодеки?

kalenjordan
источник
isNew () только проверяет, является ли оно новым для БД (то есть оно еще не сохранено и у него еще нет идентификатора сущности, в большинстве случаев это автоинкремент)
Кристоф на Fooman
@ Fooman Я думаю, что это так, isObjectNew()но я понимаю, что вы говорите.
Календжордан
Проверьте эту ссылку. В нем говорится, как это сделать. universalcoder.wordpress.com/2014/04/14/…
Декстер

Ответы:

13

Вы абсолютно НЕ должны конвертировать и проверять даты вручную, потому что это может вызвать проблемы с часовым поясом. 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/

Денис Абухов
источник
Снимай хороший звонок - спасибо за это. Я обновил свой ответ очень быстро.
Календжордан
6

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

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

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

Извините, я не очень хорош в сравнении дат в PHP.

Хороший вопрос, кстати.

user487772
источник
Я адаптировал вашу функцию, чтобы показать продукт, для которого тоже не определен getNewsToDate. <? php if ((date ("Ymd")> = substr ($ _ product-> getNewsFromDate (), 0, 10) && $ _product-> getNewsFromDate ()! = "") && (date ("Ymd") < = substr ($ _ product-> getNewsToDate (), 0, 10) || $ _product-> getNewsToDate () == "")):?> ... <? php endif?>
Эдуардо
5

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

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)вместо этого.

kalenjordan
источник
3

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

$product->getCreatedAt()

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

Лайла
источник
0

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

    <?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 ?>
Чираг Додиа
источник
1
Спасибо Чираг. Единственное, что меня беспокоит в этом примере кода, это отступ! :)
Календжордан
0

Вы можете попробовать ниже код

 $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и вам нужно загрузить продукт, если он еще не загружен.

Аншу Мишра
источник
1
Спасибо Anshu - я думаю, что это может не поддерживать пустой от или до даты, хотя.
Календжордан