Як перевірити, чи продукт новий


15

Швидкий пошук, який я знайшов, був на форумах Magento, який передбачає, що вам потрібно написати якийсь спеціальний код, щоб перевірити, чи є продукт новим.

Я б міг подумати, що існує простий isNew()метод, Mage_Catalog_Model_Productякий враховує спадне меню Featured , а також встановити продукт як новий з дати та встановити продукт як новий до даної дати, але це, здається, не так?

Чи потрібні користувацькі кодекси?


isNew () перевіряє, чи це нове значення в БД (тобто воно ще не збережено, і він ще не має ідентифікатора сутності, більшість випадків
автопосилення

@Fooman Я думаю, що це, isObjectNew()але я розумію, що ти кажеш.
kalenjordan

Перевірте це посилання. У ньому зазначено, як це зробити. 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/


Стріляйте добре - за це дякую. Я швидко оновив свою відповідь.
kalenjordan

6

Немає єдиного виклику методу. Принаймні, я цього не знаю.

Тим не менш, ви завжди можете використовувати щось подібне:

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

Вибачте, я не добре в порівнянні дат PHP.

Добре питання до речі.


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

5

Для довідки, ось хелперний метод, який я придумав, щоб перевірити новизну. Він підтримує як випадаюче Featured, так і дати, а також підтримує будь-яку дату.

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)замість цього.


3

Точність, яка може комусь бути корисною. Усі ці відповіді використовують атрибут "news_from_date", але якщо ви хочете отримати фактичну дату створення продукту в базі даних, вам слід отримати атрибут "created_at", використовуючи метод:

$product->getCreatedAt()

У проекті, над яким я працюю, деякі продукти можуть мати значення "news_from_date", відмінне від "created_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
Дякую, Шираг. Єдине, що мене трохи турбує щодо цього прикладу коду - це відступ! :)
kalenjordan

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
Дякую Аншу - я думаю, що це може не підтримувати порожнє від дати або до дат, хоча.
kalenjordan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.