Cara memeriksa apakah suatu produk baru

15

Dari pencarian cepat, satu-satunya referensi yang saya temukan adalah di forum Magento yang menyarankan Anda harus menulis beberapa kode khusus untuk memeriksa apakah suatu produk baru.

Saya akan berpikir akan ada isNew()metode sederhana Mage_Catalog_Model_Productyang memperhitungkan dropdown Unggulan serta bidang Set Produk Baru Dari Tanggal dan Setel Produk Sebagai Baru Ke Tanggal - tapi itu tampaknya tidak menjadi masalah?

Apakah kode khusus diperlukan?

kalenjordan
sumber
isNew () hanya memeriksa apakah ini baru untuk DB (artinya belum disimpan dan belum memiliki id entitas, sebagian besar waktu autoincrement)
Kristof di Fooman
@ Fooman Saya pikir itu isObjectNew()tapi saya mengerti apa yang Anda katakan.
kalenjordan
Periksa tautan ini. Ini menyatakan bagaimana melakukannya. universalcoder.wordpress.com/2014/04/14/…
Dexter

Jawaban:

13

Anda benar-benar TIDAK boleh mengonversi dan memvalidasi tanggal secara manual, karena ini dapat menyebabkan masalah zona waktu. Magento memiliki metode bawaan isStoreDateInInterval()di Mage_Core_Model_Localekelas. Jadi, Anda harus membuat metode pembantu yang bisa terlihat seperti ini

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

Detail lebih lanjut dapat Anda temukan di sini http://quicktips.ru/all/check-product-is-new/

Denis Óbukhov
sumber
Tembak panggilan yang baik - terima kasih untuk itu. Saya telah memperbarui jawaban saya dengan sangat cepat.
kalenjordan
6

Tidak ada panggilan metode tunggal. Setidaknya saya tidak menyadarinya.

Namun demikian Anda selalu dapat menggunakan sesuatu seperti ini:

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

Maaf saya tidak bagus dalam perbandingan tanggal PHP.

Pertanyaan yang bagus.

pengguna487772
sumber
Saya menyesuaikan fungsi Anda untuk menunjukkan produk yang tidak memiliki definisi getNewsToDate juga. <? php if ((date ("Ymd")> = substr ($ _ product-> getNewsFromDate (), 0, 10) && $ _product-> getNewsFromDate ()! = "") && (date ("Ymd") < = substr ($ _ product-> getNewsToDate (), 0, 10) || $ _product-> getNewsToDate () == "")):?> ... <? php endif?>
Eduardo
5

Untuk referensi, inilah metode pembantu yang saya buat untuk memeriksa kebaruan. Ini mendukung dropdown Featured serta tanggal, dan mendukung tanggal yang kosong juga.

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: Terima kasih kepada @Rooooomine untuk menyebutkan bahwa konversi tanggal manual ini yang saya sarankan adalah ide yang sangat buruk karena potensi masalah lokal. Lihat Mage::app()->getLocale()->isStoreDateInInterval($product->getStoreId(), $newsFromDate, $newsToDate)saja.

kalenjordan
sumber
3

Ketepatan yang mungkin berguna bagi seseorang. Semua jawaban ini menggunakan atribut "news_from_date" tetapi jika Anda ingin mendapatkan tanggal pembuatan produk yang sebenarnya dalam database, Anda harus mendapatkan atribut "Created_at" menggunakan metode:

$product->getCreatedAt()

Dalam proyek yang saya kerjakan, beberapa produk mungkin memiliki nilai "news_from_date" berbeda dari "Created_at". Memang menurut aturan bisnis, suatu produk bisa kehabisan stok untuk waktu yang lama dan kemudian kembali sebagai produk baru ketika kembali ke katalog.

Laila
sumber
0

Solusi Cepat

    <?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
sumber
1
Terima kasih Chirag. Satu-satunya hal yang sedikit mengganggu saya tentang contoh kode ini adalah indentasi! :)
kalenjordan
0

Anda dapat mencoba kode di bawah ini

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

Di mana $thisobjek Mage_Catalog_Model_Productdan Anda perlu memuat produk jika belum dimuat.

Anshu Mishra
sumber
1
Terima kasih Anshu - Saya pikir ini mungkin tidak mendukung kosong dari atau ke tanggal sekalipun.
kalenjordan