如何检查产品是否是新的


15

通过快速搜索,我发现的唯一参考是在Magento论坛上的,这表明您必须编写一些自定义代码来检查产品是否是新产品。

我本来以为会有一个简单的isNew()方法,Mage_Catalog_Model_Product其中考虑了“ 特色”下拉列表以及“ 将产品设置为新的起始日期”和“ 将产品设置为新的截止日期”字段-但事实并非如此?

是否需要自定义编解码器?


isNew()仅检查它是否对数据库来说是新的(即,它尚未被保存,并且在大多数情况下还没有实体ID,大多数情况下是自动递增的)
Fooman

@Fooman我认为是的,isObjectNew()但我明白你的意思。
kalenjordan 2014年

检查此链接。它说明了如何做。universalcoder.wordpress.com/2014/04/14/...
德克斯特

Answers:


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((date(“ Ymd”)> = substr($ _ product-> getNewsFromDate(),0,10)&& $ _product-> getNewsFromDate()!=“”)&&(date(“ Ymd”)< = substr($ _ product-> getNewsToDate(),0,10)|| $ _product-> getNewsToDate()==“”)):?> ... <?php endif?>
Eduardo

5

作为参考,这是我想出新方法来检查的辅助方法。它同时支持“特色”下拉列表和日期,并支持任一日期为空。

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
谢谢Chirag。关于这个代码示例,唯一让我困扰的是缩进!:)
kalenjordan 2014年

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
感谢Anshu-我认为这可能不支持从日期到日期为空。
kalenjordan 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.