Jak sprawdzić, czy produkt jest nowy


15

Z szybkiego wyszukiwania jedyne odniesienie, które znalazłem, znalazłem na forach Magento, co sugeruje, że musisz napisać niestandardowy kod, aby sprawdzić, czy produkt jest nowy.

Myślałem, że istnieje prosta isNew()metoda Mage_Catalog_Model_Productuwzględniająca menu rozwijane Polecane, a także pola Ustaw produkt jako nowy od daty i Ustaw produkt jako nowy na datę - ale tak nie jest?

Czy potrzebne są niestandardowe kody?


isNew () sprawdza tylko, czy jest nowy w DB (tj. nie został jeszcze zapisany i nie ma jeszcze identyfikatora encji, przez większość czasu autoinkrementacji)
Kristof z Fooman

@Fooman Myślę, że tak, isObjectNew()ale rozumiem, co mówisz.
kalenjordan

Sprawdź ten link. Określa, jak to zrobić. universalcoder.wordpress.com/2014/04/14/…
Dexter

Odpowiedzi:


13

Absolutnie NIE wolno ręcznie konwertować i weryfikować dat, ponieważ może to powodować problemy ze strefą czasową. Magento ma wbudowaną metodę isStoreDateInInterval()w Mage_Core_Model_Localeklasie. Powinieneś więc stworzyć metodę pomocniczą, która może wyglądać tak

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);
}

Więcej informacji można znaleźć tutaj http://quicktips.ru/all/check-product-is-new/


Nagraj dobrą rozmowę - dzięki za to. Naprawdę szybko zaktualizowałem swoją odpowiedź.
kalenjordan

6

Nie ma jednego wywołania metody. Przynajmniej nie jestem tego świadomy.

Niemniej jednak zawsze możesz użyć czegoś takiego:

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

Niestety nie jestem dobry w porównywaniu dat PHP.

Przy okazji, dobre pytanie.


Dostosowałem twoją funkcję, aby pokazać produkt, który również nie ma zdefiniowanej metody getNewsToDate. <? php if ((date („Ymd”)> = substr ($ _ product-> getNewsFromDate (), 0, 10) && $ _product-> getNewsFromDate ()! = "") && (date ("Ymd") < = substr ($ _ produkt-> getNewsToDate (), 0, 10) || $ _product-> getNewsToDate () == "")):?> ... <? php endif?>
Eduardo

5

Dla porównania, oto metoda pomocnicza, którą wymyśliłem, aby sprawdzić nowość. Obsługuje zarówno menu rozwijane Polecane, jak i daty, a także obsługuje pustą datę.

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;
}

AKTUALIZACJA: Podziękowania dla @Rooooomine za wspomnienie, że sugerowana przeze mnie ręczna konwersja daty jest bardzo złym pomysłem ze względu na potencjalne problemy z ustawieniami regionalnymi. Sprawdź Mage::app()->getLocale()->isStoreDateInInterval($product->getStoreId(), $newsFromDate, $newsToDate)zamiast tego.


3

Precyzja, która może być komuś przydatna. Wszystkie te odpowiedzi używają atrybutu „news_from_date”, ale jeśli chcesz uzyskać rzeczywistą datę utworzenia produktu w bazie danych, powinieneś otrzymać atrybut „Created_at”, używając metody:

$product->getCreatedAt()

W projekcie, nad którym pracuję, niektóre produkty mogą mieć wartość „news_from_date” różną od „Created_at”. Rzeczywiście, zgodnie z regułami biznesowymi, produkt może być przez długi czas niedostępny, a następnie wrócić jako nowe produkty, gdy wróci do katalogu.


0

Szybkie rozwiązanie

    <?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
Dzięki Chirag. Jedyne, co niepokoi mnie nieco w tym przykładzie kodu, to wcięcie! :)
kalenjordan

0

Możesz spróbować poniżej kodu

 $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);

Gdzie $thisjest przedmiotem Mage_Catalog_Model_Producti musisz załadować produkt, jeśli nie jest jeszcze załadowany.


1
Dzięki, Anshu - Myślę, że to może nie obsługiwać pustych dat lub dat.
kalenjordan
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.