Comment vérifier si un produit est nouveau

15

À partir d'une recherche rapide, la seule référence que j'ai trouvée était sur les forums Magento, ce qui suggère que vous devez écrire du code personnalisé pour vérifier si un produit est nouveau.

J'aurais pensé qu'il y aurait une isNew()méthode simple sur le Mage_Catalog_Model_Productqui prend en compte la liste déroulante En vedette ainsi que les champs Définir le produit comme nouveau à partir de la date et Définir le produit comme nouveau à la date - mais cela ne semble pas être le cas?

Le code personnalisé est-il nécessaire?

kalenjordan
la source
isNew () vérifie uniquement si cela est nouveau dans la base de données (c'est-à-dire qu'il n'a pas encore été enregistré et qu'il n'a pas encore d'identifiant d'entité, la plupart du temps l'auto-incrémentation)
Kristof à Fooman
@Fooman Je pense que c'est isObjectNew()mais je comprends ce que vous dites.
kalenjordan
Vérifiez ce lien. Il indique comment procéder. universalcoder.wordpress.com/2014/04/14/…
Dexter

Réponses:

13

Vous ne devez absolument PAS convertir et valider les dates manuellement, car cela peut entraîner des problèmes de fuseau horaire. Magento a une méthode intégrée isStoreDateInInterval()en Mage_Core_Model_Localeclasse. Vous devez donc créer une méthode d'assistance qui peut ressembler à ceci

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

Plus de détails vous pouvez trouver ici http://quicktips.ru/all/check-product-is-new/

Denis Óbukhov
la source
Tirez bon appel - merci pour cela. J'ai mis à jour ma réponse très rapidement.
kalenjordan
6

Il n'y a pas d'appel de méthode unique. Au moins, je n'en suis pas conscient.

Néanmoins, vous pouvez toujours utiliser quelque chose comme ceci:

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

Désolé, je ne suis pas bon dans la comparaison des dates PHP.

Bonne question d'ailleurs.

user487772
la source
J'ai adapté votre fonction pour montrer le produit qui n'a pas défini getNewsToDate aussi. <? php if ((date ("Ymd")> = substr ($ _ product-> getNewsFromDate (), 0, 10) && $ _product-> getNewsFromDate ()! = "") && (date ("Ymd") < = substr ($ _ product-> getNewsToDate (), 0, 10) || $ _product-> getNewsToDate () == "")):?> ... <? php endif?>
Eduardo
5

Pour référence, voici la méthode d'aide que j'ai trouvée pour vérifier la nouveauté. Il prend en charge à la fois la liste déroulante En vedette ainsi que les dates et prend également en charge les deux dates.

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

MISE À JOUR: Merci à @Rooooomine d'avoir mentionné que cette conversion de date manuelle que j'ai suggérée est une très mauvaise idée en raison de problèmes locaux potentiels. Vérifiez à la Mage::app()->getLocale()->isStoreDateInInterval($product->getStoreId(), $newsFromDate, $newsToDate)place.

kalenjordan
la source
3

Une précision qui pourrait être utile à quelqu'un. Toutes ces réponses utilisent l'attribut "news_from_date" mais si vous voulez obtenir la date réelle de création du produit dans la base de données, vous devez obtenir l'attribut "created_at" en utilisant la méthode:

$product->getCreatedAt()

Dans le projet sur lequel je travaille, certains produits peuvent avoir une valeur de "news_from_date" différente de "created_at". En effet selon les règles métier, un produit peut être en rupture de stock pendant une longue période puis revenir en tant que nouveau produit lors de son retour dans le catalogue.

Laila
la source
0

Solution rapide

    <?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 ?>
chirag dodia
la source
1
Merci Chirag. La seule chose qui me dérange un peu dans cet exemple de code est l'indentation! :)
kalenjordan
0

Vous pouvez essayer ci-dessous le code

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

$thisest l'objet Mage_Catalog_Model_Productet vous devez charger le produit s'il n'est pas déjà chargé.

Anshu Mishra
la source
1
Merci Anshu - Je pense que cela pourrait ne pas prendre en charge les dates vides de ou vers.
kalenjordan