Cách kiểm tra xem sản phẩm có mới không


15

Từ một tìm kiếm nhanh, tài liệu tham khảo duy nhất tôi tìm thấy là trên các diễn đàn Magento gợi ý rằng bạn phải viết một số mã tùy chỉnh để kiểm tra xem sản phẩm có mới không.

Tôi đã nghĩ rằng sẽ có một isNew()phương pháp đơn giản trong Mage_Catalog_Model_Productđó có tính đến danh sách thả xuống Nổi bật cũng như Đặt sản phẩm là mới từ ngàyĐặt sản phẩm là trường mới đến ngày - nhưng dường như không phải vậy?

Có phải codez tùy chỉnh cần thiết?


isNew () chỉ kiểm tra xem cái này có mới đối với DB không (nghĩa là nó chưa được lưu và nó chưa có id thực thể, hầu hết thời gian tự động hóa)
Kristof tại Fooman

@Fooman Tôi nghĩ đó là isObjectNew()nhưng tôi hiểu những gì bạn nói.
kalenjordan

Kiểm tra liên kết này. Nó nói làm thế nào để làm điều đó. Universalcoder.wordpress.com/2014/04/14/NH
Dexter

Câu trả lời:


13

Bạn tuyệt đối KHÔNG được chuyển đổi và xác thực ngày theo cách thủ công, vì điều này có thể gây ra sự cố múi giờ. Magento có phương thức tích hợp isStoreDateInInterval()trong Mage_Core_Model_Localelớp. Vì vậy, bạn nên tạo phương thức trợ giúp có thể trông như thế này

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

Thông tin chi tiết bạn có thể tìm thấy ở đây http://quicktips.ru/all/check-product-is-new/


Bắn cuộc gọi tốt - cảm ơn vì điều đó. Tôi đã cập nhật câu trả lời của tôi rất nhanh.
kalenjordan

6

Không có cuộc gọi phương thức duy nhất. Ít nhất là tôi không nhận thức được nó.

Tuy nhiên, bạn luôn có thể sử dụng một cái gì đó như thế này:

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

Xin lỗi tôi không tốt trong so sánh ngày PHP.

Bằng cách này, câu hỏi hay.


Tôi đã điều chỉnh chức năng của bạn để hiển thị sản phẩm không có getNewsToDate đã xác định. <? php if ((ngày ("Ymd")> = chất nền ($ _ sản phẩm-> getNewsFromDate (), 0, 10) && $ _product-> getNewsFromDate ()! = "") && (ngày ("Ymd") < = chất nền ($ _ sản phẩm-> getNewsToDate (), 0, 10) || $ _product-> getNewsToDate () == "")):?> ... <? php endif?>
Eduardo

5

Để tham khảo, đây là phương pháp trợ giúp mà tôi nghĩ ra để kiểm tra tính mới. Nó hỗ trợ cả danh sách thả xuống Nổi bật cũng như ngày và cũng hỗ trợ cả ngày trống.

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

CẬP NHẬT: Cảm ơn @Rooooomine đã đề cập rằng việc chuyển đổi ngày thủ công này mà tôi đề xuất là một ý tưởng rất tồi tệ do các vấn đề địa phương tiềm năng. Kiểm tra Mage::app()->getLocale()->isStoreDateInInterval($product->getStoreId(), $newsFromDate, $newsToDate)thay thế.


3

Một độ chính xác có thể hữu ích cho ai đó. Tất cả các câu trả lời này đang sử dụng thuộc tính "news_from_date" nhưng nếu bạn muốn lấy ngày thực sự tạo ra sản phẩm trong cơ sở dữ liệu, bạn nên lấy thuộc tính "created_at" bằng phương thức:

$product->getCreatedAt()

Trong dự án tôi đang làm việc, một số sản phẩm có thể có giá trị "news_from_date" khác với "created_at". Thật vậy, theo các quy tắc kinh doanh, một sản phẩm có thể hết hàng trong một thời gian dài và sau đó trở lại như một sản phẩm mới khi nó trở lại trong danh mục.


0

Giải pháp nhanh

    <?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
Cảm ơn Chirag. Điều duy nhất làm phiền tôi một chút về ví dụ mã này là vết lõm! :)
kalenjordan

0

Bạn có thể thử mã dưới đây

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

Trong trường hợp $thislà đối tượng của Mage_Catalog_Model_Productvà bạn cần phải tải các sản phẩm nếu nó chưa được nạp.


1
Cảm ơn Anshu - Tôi nghĩ rằng điều này có thể không hỗ trợ trống từ hoặc đến ngày.
kalenjordan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.