So prüfen Sie, ob ein Produkt neu ist

15

Die einzige Referenz, die ich bei einer Schnellsuche gefunden habe, war in den Magento-Foren, was darauf hindeutet, dass Sie einen benutzerdefinierten Code schreiben müssen, um zu überprüfen, ob ein Produkt neu ist.

Ich hätte gedacht, es gäbe eine einfache isNew()Methode, die Mage_Catalog_Model_Productdas Dropdown-Menü " Empfohlen " sowie die Felder " Produkt als neu ab Datum festlegen" und " Produkt als neu bis Datum festlegen" berücksichtigt - aber das scheint nicht der Fall zu sein?

Werden die benutzerdefinierten Codez benötigt?

kalenjordan
quelle
isNew () prüft nur, ob dies neu in der DB ist (dh es wurde noch nicht gespeichert und es hat noch keine Entity-ID, die meiste Zeit das
automatische Inkrementieren
@Fooman Ich denke das ist isObjectNew()aber ich verstehe was du sagst.
Kalenjordan
Überprüfen Sie diesen Link. Hier steht, wie es geht. universalcoder.wordpress.com/2014/04/14/…
Dexter

Antworten:

13

Sie dürfen Daten NICHT manuell konvertieren und validieren, da dies zu Problemen mit der Zeitzone führen kann. Magento hat eine integrierte Methode isStoreDateInInterval()in der Mage_Core_Model_LocaleKlasse. Sie sollten also eine Hilfsmethode erstellen, die so aussehen kann

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

Weitere Details finden Sie hier http://quicktips.ru/all/check-product-is-new/

Denis Óbukhov
quelle
Schießen Sie einen guten Anruf - danke dafür. Ich habe meine Antwort sehr schnell aktualisiert.
Kalenjordan
6

Es gibt keinen einzelnen Methodenaufruf. Zumindest bin ich mir dessen nicht bewusst.

Trotzdem kann man immer so etwas benutzen:

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

Entschuldigung, ich bin nicht gut im PHP-Datumsvergleich.

Gute Frage übrigens.

user487772
quelle
Ich habe Ihre Funktion angepasst, um das Produkt anzuzeigen, für das getNewsToDate nicht definiert ist. <? php if ((date ("Ymd")> = substr ($ _ product-> getNewsFromDate (), 0, 10) && $ _product-> getNewsFromDate ()! = "") && (date ("Ymd") < = substr ($ _ product-> getNewsToDate (), 0, 10) || $ _product-> getNewsToDate () == "")):?> ... <? php endif?>
Eduardo
5

Als Referenz ist hier die Hilfsmethode, die ich mir ausgedacht habe, um nach Neuheiten zu suchen. Es werden sowohl das Dropdown-Menü "Empfohlen" als auch die Datumsangaben unterstützt. Außerdem wird unterstützt, dass beide Datumsangaben leer sind.

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

UPDATE: Vielen Dank an @Rooooomine für die Erwähnung, dass diese manuelle Datumskonvertierung, die ich vorgeschlagen habe, aufgrund möglicher Probleme mit dem Gebietsschema eine sehr schlechte Idee ist. Überprüfen Sie Mage::app()->getLocale()->isStoreDateInInterval($product->getStoreId(), $newsFromDate, $newsToDate)stattdessen aus.

kalenjordan
quelle
3

Eine Präzision, die für jemanden nützlich sein könnte. Alle diese Antworten verwenden das Attribut "news_from_date". Wenn Sie jedoch das tatsächliche Erstellungsdatum des Produkts in der Datenbank abrufen möchten, sollten Sie das Attribut "created_at" mithilfe der folgenden Methode abrufen:

$product->getCreatedAt()

In dem Projekt, an dem ich arbeite, haben einige Produkte möglicherweise den Wert "news_from_date", der sich von "created_at" unterscheidet. In der Tat kann ein Produkt gemäß den Geschäftsregeln für eine lange Zeit nicht vorrätig sein und dann als neue Produkte zurückkehren, wenn es wieder in den Katalog aufgenommen wird.

Laila
quelle
0

Schnelle Lösung

    <?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
quelle
1
Danke Chirag. Das einzige, was mich an diesem Codebeispiel ein bisschen stört, ist der Einzug! :)
kalenjordan
0

Sie können den folgenden Code ausprobieren

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

Wo $thisist das Objekt Mage_Catalog_Model_Productund Sie müssen das Produkt laden, wenn es noch nicht geladen ist.

Anshu Mishra
quelle
1
Vielen Dank Anshu - ich denke, dies könnte jedoch keine leeren Daten von oder zu unterstützen.
Kalenjordan