Quy tắc giá danh mục từ hôm nay không áp dụng


8

Tôi đang sử dụng Magento 1.9.1.0. Tôi thiết lập quy tắc giá danh mục áp dụng cho tất cả các sản phẩm của mình trong cửa hàng với mức giảm giá 20% chỉ trong một ngày. Hành động catalogrule_apply_all được cho là được chạy mỗi ngày vào lúc 1 giờ sáng trong mornig (0 1 * * *).

Tôi có một vấn đề trong việc thiết lập phạm vi ngày của chương trình khuyến mãi. Để kiểm tra nó, trong môi trường phát triển của mình, tôi đã thiết lập from_date và end_date với giá trị 'hôm nay'. Sau khi áp dụng quy tắc, tôi không thể thấy chương trình khuyến mãi ở lối vào. Tôi cần thiết lập back_date trở lại sau một ngày để thấy nó hoạt động.

Bây giờ tôi phải lên lịch quảng cáo, sẽ bắt đầu sau 2 ngày nữa, đối với môi trường sản xuất của tôi và tôi không chắc chắn về giá trị nào được gán cho trường from_date. Tôi có nên chỉ định ngày trước khi nó hoạt động hay tôi nên rời khỏi ngày bắt đầu thực sự?

Câu trả lời:


7

Vấn đề trong trường hợp này là trên những dòng này

$fromTime = (int) strtotime($rule->getFromDate());
$toTime = (int) strtotime($rule->getToDate());

Họ không sử dụng các phương pháp thời gian Magento để xem xét các vùng thời gian và trong so sánh, nó sử dụng dòng sau. (Vài dòng sau các dòng trên)

$coreDate  = $this->_factory->getModel('core/date');
$timestamp = $coreDate->gmtTimestamp('Today');

Nếu bạn cập nhật hai dòng đầu tiên thành

$fromTime = (int) Mage::getModel('core/date')->gmtTimestamp(strtotime($rule->getFromDate()));
$toTime = (int) Mage::getModel('core/date')->gmtTimestamp(strtotime($rule->getToDate()));

Lưu ý rằng bây giờ cả hai đều sử dụng gmtTimestamp là nội tuyến với so sánh. Điều này sẽ làm việc tốt. Rõ ràng là thêm một ghi đè lớp.


Giải pháp này có lỗi, nó sẽ đặt tất cả các sản phẩm được bán, ngay cả khi có các điều kiện được đặt.
newbie

Điều này không hoạt động trên Magento 1.9.3.3
Fred K

vui lòng gửi yêu cầu sửa lỗi
PULL

2

Tôi cũng có vấn đề tương tự nhưng đó là trong Magento EE 1.14.2.1. Hệ thống / Cấu hình / Chung - Cài đặt Tùy chọn Địa điểm dường như chính xác.

Tôi kết luận rằng vấn đề nằm ở tệp: Mage / CatalogRule / Model / Resource / Rule.php Thay thế dòng

$timestamp = $coreDate->gmtTimestamp('Today');

với

$timestamp = $coreDate->timestamp();

Vì vậy nó sẽ được

public function insertRuleData(Mage_CatalogRule_Model_Rule $rule, array $websiteIds, array $productIds = array())
{
    /** @var $write Varien_Db_Adapter_Interface */
    $write = $this->_getWriteAdapter();

    $customerGroupIds = $rule->getCustomerGroupIds();

    $fromTime = (int) strtotime($rule->getFromDate());
    $toTime = (int) strtotime($rule->getToDate());
    $toTime = $toTime ? ($toTime + self::SECONDS_IN_DAY - 1) : 0;

    /** @var Mage_Core_Model_Date $coreDate */
    $coreDate  = $this->_factory->getModel('core/date');

    // $timestamp = $coreDate->gmtTimestamp('Today');
    $timestamp = $coreDate->timestamp();

    if ($fromTime > $timestamp
        || ($toTime && $toTime < $timestamp)
    ) {
        return;
    }

Cả hai nên tính dấu thời gian hiện tại. Nhưng dựa trên các thử nghiệm của tôi,

$ coreDate-> dấu thời gian ();
chuyển đổi thành phần bù múi giờ chính xác (giống như cài đặt ngày và giờ của máy chủ của tôi), trong khi tôi luôn kết thúc với 1 ngày trước đó với
$ coreDate-> gmtTimestamp ('Hôm nay');
Giống như những gì Jeroen nói, nó có thể là lỗi Magento.


Điều này không hoạt động trên Magento 1.9.3.3
Fred K

1

Từ Mage/CatalogRule/Model/Resource/Rule.php

/**
 * Inserts rule data into catalogrule/rule_product table
 *
 * @param Mage_CatalogRule_Model_Rule $rule
 * @param array $websiteIds
 * @param array $productIds
 */
public function insertRuleData(Mage_CatalogRule_Model_Rule $rule, array $websiteIds, array $productIds = array())
{
    /** @var $write Varien_Db_Adapter_Interface */
    $write = $this->_getWriteAdapter();

    $customerGroupIds = $rule->getCustomerGroupIds();

    $fromTime = (int) strtotime($rule->getFromDate());
    $toTime = (int) strtotime($rule->getToDate());
    $toTime = $toTime ? ($toTime + self::SECONDS_IN_DAY - 1) : 0;

    /** @var Mage_Core_Model_Date $coreDate */
    $coreDate  = $this->_factory->getModel('core/date');
    $timestamp = $coreDate->gmtTimestamp('Today');
    if ($fromTime > $timestamp
        || ($toTime && $toTime < $timestamp)
    ) {
        return;
    }

Mọi thứ có vẻ ổn cho đến nay nếu bạn đặt tương tự cho đến ngày. Cho đến ngày là ngày + giây trong một ngày - 1, vì vậy sẽ kết thúc ngày đó.

Có thể ngày cốt lõi không chính xác do cài đặt múi giờ xung đột.

Bạn có thể kiểm tra với một kịch bản thử nghiệm và lặp lại một số dữ liệu.

include('app/Mage.php');
Mage::app('admin');

echo date('Ymd His', Mage::getModel('core/date')->gmtTimestamp('today'));

Hoặc gọi insertRuleDatathủ công và thêm một số dữ liệu gỡ lỗi trong tệp tài nguyên để kiểm tra.

$ruleId = 1; // Your rule id here
/** @var $rule Mage_CatalogRule_Model_Rule */
$rule = Mage::getModel('catalogrule/rule')->load($ruleId);

/** @var $resource Mage_CatalogRule_Model_Resource_Rule */
$resource = Mage::getResourceModel('catalogrule/rule');

$resource->insertRuleData($rule, array_keys(Mage::app()->getWebsites(true)));

1
Tôi đã thực hiện kiểm tra như bạn đề xuất và ngày được trả về từ phương thức Mage :: getModel ('core / date') -> gmtTimestamp ('hôm nay') là một ngày trở lại ngày thực tế. ví dụ: hôm nay là ngày 19 nhưng Magento của tôi in ngày 18 là ngày hôm nay. Có vẻ như vấn đề của tôi phụ thuộc vào nó nhưng tôi không thể tìm ra cách đặt ngày chính xác trong cửa hàng Magento của mình.
gianis6

1
Điều đó có nghĩa là địa phương của bạn là của một ngày. System / Configuration / Locale options-> đặt múi giờ chính xác
Jeroen

Tôi nên sử dụng múi giờ nào? Máy chủ nơi lưu trữ cửa hàng của tôi có múi giờ CDT (-5) trong khi cửa hàng của tôi được cho là hoạt động trong CET (+1).
gianis6

Sử dụng đúng cho cửa hàng của bạn, sau đó chạy lại bản kiểm tra
Jeroen

Tôi không thể hiểu nên sử dụng múi giờ nào. Nếu tôi đặt múi giờ CDT và tôi chạy bản kiểm tra thì ngày hôm nay được in là '2015-03-19 05:00:00'. Tôi cần quy tắc của mình để được kích hoạt / hủy kích hoạt vào 00:00:00 múi giờ CET. Rời khỏi cài đặt này, quy tắc danh mục của tôi sẽ được kích hoạt / hủy kích hoạt lúc 5 giờ sáng theo giờ UTC?
gianis6

1

Special_to_date & Special_from_date - không hoạt động trong bộ lọc Quy tắc. Chỉ có thể sử dụng - Special_price

Nhưng nếu tồn tại cài đặt trong sản phẩm có giá Đặc biệt, cần cập nhật các thuộc tính giá đặc biệt với tập lệnh như -

require_once 'app/Mage.php';
$app = Mage::app('admin');

$now = strtotime(date('Y-m-d H:i:s'));
$collection = Mage::getModel('catalog/product')->getCollection()->addAttributeToSelect(array('sku', 'special_price'))
    ->addAttributeToFilter(
        'special_to_date',
        array('to' => date('Y-m-d H:i:s', $now))
    );


foreach ($collection as $oProduct) {
    $product = '';
    $product = Mage::getModel('catalog/product')->load($oProduct->getId());
    $product->setData('special_to_date', '');
    $product->setData('special_from_date', '');
    $product->setData('special_price', '');
    $product->save();
}

1

Vấn đề là hàm gmtTimestamp () trừ Zend_Date :: TIMEZONE_SECS để trả về dấu thời gian GMT từ ngày trong múi giờ hiện tại. Khi bạn chuyển một chuỗi cho hàm đó như 'Hôm nay' và múi giờ hiện tại của bạn không phải là UTC, kết quả sẽ luôn sai.

Để sửa lỗi này, dòng Mage / CatalogRule / Model / Resource / Rule.php thay đổi 218

$timestamp = $coreDate->gmtTimestamp('Today');

với

$timestamp = $coreDate->gmtTimestamp('Today +'.Mage::app()->getLocale()->date()->get(Zend_Date::TIMEZONE_SECS).' seconds');

0

Tôi thấy tốt hơn là thay đổi dấu thời gian để sử dụng giờ địa phương thay vì sử dụng GMT cho các phép tính.

$timestamp = Mage::app()->getLocale()->date(null, null, null, true)->get(Zend_Date::TIMESTAMP);

0

Vấn đề vẫn tồn tại trong Magento 1.9.4.0. Sử dụng giải pháp từ xelber hoạt động hoàn hảo. Chỉ cần viết lại hàm insertRuleData()trongMage_CatalogRule_Model_Resource_Rule

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.