今日のカタログ価格ルールは適用されません


8

Magento 1.9.1.0を使用しています。私は、店内のすべての製品に適用されるカタログ価格ルールを設定し、20パーセントの割引で1日だけにしました。catalogrule_apply_allアクションは、午前1時に毎日午前0時に実行されることになっています(0 1 * * *)。

プロモーションの日付範囲の設定に問題があります。それをテストするために、私の開発環境で、from_dateとend_dateに「今日」の値を設定しました。ルールを適用した後、フロントエンドにプロモーションが表示されません。from_dateを設定して、それが機能することを確認する必要があります。

次に、プロダクション環境で2日後に始まるプロモーションをスケジュールする必要があります。from_dateフィールドに割り当てる値がわかりません。アクティブになる前の日を割り当てる必要がありますか、それとも実際の開始日を残すべきですか?

回答:


7

この場合の問題はこれらの行にあります

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

彼らはタイミングゾーンを考慮に入れるためにMagento時間メソッドを使用しておらず、比較では次の行を使用しています。(上記の行の後に数行)

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

最初の2行を次のように更新した場合

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

どちらも比較と一致するgmtTimestampを使用することに注意してください。これは正常に動作するはずです。明らかにクラスのオーバーライドを追加します。


このソリューションにはバグがあり、条件が設定されている場合でも、すべての製品が販売されます。
初心者

これはMagento 1.9.3.3では機能しません
Fred K

ここにプル
snh_nl

2

私も同じ問題を抱えていますが、それはMagento EE 1.14.2.1にありました。 システム/構成/全般-ロケールオプションの設定が正しいようです。

問題は次のファイルにあると結論付けました:Mage / CatalogRule / Model / Resource / Rule.php行の置き換え

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

$timestamp = $coreDate->timestamp();

だからそれは

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

どちらも現在のタイムスタンプを計算する必要があります。しかし、私のテストに基づいて、

$ coreDate-> timestamp();
正しいタイムゾーンオフセットに変換します(サーバーの日付と時刻の設定と同じです)。
$ coreDate-> gmtTimestamp( 'Today');
Jeroenが言ったように、それはMagentoのバグかもしれません。


これはMagento 1.9.3.3では機能しません
Fred K

1

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

これまでの日付と日付を同じにすると、これまでのところすべてが正常に見えます。終了日は、日付+ 1日の秒数-1なので、その日の終わりになります。

タイムゾーンの設定が競合しているため、コアの日付が正しくない可能性があります。

テストスクリプトを使用してテストし、一部のデータをエコーできます。

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

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

または、insertRuleData手動で呼び出して、テスト用のリソースファイルにデバッグデータを追加します。

$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
私はあなたが提案したようにテストを行い、メソッドMage :: getModel( 'core / date')-> gmtTimestamp( 'today')から返された日付は実際の日付の1日後です。例:今日は19日ですが、私のMagentoは今日の日付として18日を印刷します。私の問題はそれに依存しているようですが、Magentoストアで正しい日付を設定する方法が見つかりません。
gianis6 2015年

1
それはあなたのロケールが一日であることを意味します。System / Configuration / Locale options->タイムゾーンを正しく設定
Jeroen

どのタイムゾーンを使用すればよいですか?私のストアがホストされているサーバーにはCDT(-5)タイムゾーンがありますが、私のストアはCET(+1)で動作するはずです。
gianis6 2015年

ストアに適したものを使用し、テストスクリプトを再度実行してください
Jeroen

使用するタイムゾーンがわかりません。CDTタイムゾーンを設定してテストスクリプトを実行すると、出力される今日の日付は「2015-03-19 05:00:00」です。ルールを00:00:00 CETタイムゾーンでアクティブ/非アクティブにする必要があります。この設定を残すと、カタログルールがUTCの午前5時にアクティブ化/非アクティブ化されますか?
gianis6 2015年

1

special_to_datespecial_from_date-ルールフィルターでは機能しません。のみ使用できます-special_price

ただし、特別価格が古い製品に設定が存在する場合、次のようなスクリプトで特別価格属性を更新する必要があります-

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

問題は、関数gmtTimestamp()がZend_Date :: TIMEZONE_SECSを減算して、現在のタイムゾーンの日付からGMTタイムスタンプを返すことです。「今日」のような関数に文字列を渡し、現在のタイムゾーンがUTCではない場合、結果は常に間違ったものになります。

これを修正するには、Mage / CatalogRule / Model / Resource / Rule.phpの218行目を変更します

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

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

0

計算にGMTを使用するのではなく、現地時間を使用するようにタイムスタンプを変更した方がよいことがわかりました。

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

0

問題はMagento 1.9.4.0にもまだ存在します。xelberのソリューションを使用すると完璧に機能します。関数insertRuleData()を書き直すだけですMage_CatalogRule_Model_Resource_Rule

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.