Die Katalogpreisregel von heute gilt nicht

8

Ich benutze Magento 1.9.1.0. Ich habe eine Katalogpreisregel festgelegt, die für alle meine Produkte in meinem Geschäft mit einem Rabatt von 20 Prozent für nur einen Tag gilt. Die Aktion catalogrule_apply_all soll jeden Tag um 1 Uhr morgens ausgeführt werden (0 1 * * *).

Ich habe ein Problem beim Festlegen des Datumsbereichs der Aktion. Um dies zu testen, habe ich in meiner Entwicklungsumgebung das from_date und das end_date mit dem Wert 'today' eingerichtet. Nach Anwendung der Regel kann ich die Promotion im Frontend nicht sehen. Ich muss das from_date auf einen Tag zurücksetzen, damit es funktioniert.

Jetzt muss ich die Promotion, die in 2 Tagen beginnt, für meine Produktionsumgebung planen und bin mir nicht sicher, welcher Wert dem Feld from_date zugewiesen wird. Soll ich den Tag zuweisen, bevor es aktiv sein soll, oder soll ich das tatsächliche Startdatum verlassen?

gianis6
quelle

Antworten:

7

Problem in diesem Fall ist in diesen Zeilen

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

Sie verwenden keine Magento-Zeitmethoden, um Zeitzonen zu berücksichtigen, und im Vergleich wird die folgende Zeile verwendet. (Einige Zeilen nach den obigen Zeilen)

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

Wenn Sie die ersten beiden Zeilen auf aktualisieren

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

Beachten Sie, dass jetzt beide gmtTimestamp verwenden, was mit dem Vergleich übereinstimmt. Dies sollte gut funktionieren. Fügen Sie natürlich eine Klassenüberschreibung hinzu.

xelber
quelle
Diese Lösung hat einen Fehler, sie setzt alle Produkte zum Verkauf, auch wenn Bedingungen festgelegt sind.
Neuling
Dies funktioniert nicht auf Magento 1.9.3.3
Fred K
Bitte senden Sie eine PULL-Fix-Anfrage hier: github.com/OpenMage/magento-lts
snh_nl
2

Ich habe auch das gleiche Problem, aber es war in Magento EE 1.14.2.1. System / Konfiguration / Allgemein - Die Einstellungen für die Gebietsschemaoptionen scheinen zu korrigieren.

Ich kam zu dem Schluss, dass das Problem in der Datei lag: Mage / CatalogRule / Model / Resource / Rule.php Ersetzen der Zeile

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

mit

$timestamp = $coreDate->timestamp();

So wird es sein

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

Beide sollten den aktuellen Zeitstempel berechnen. Aber basierend auf meinen Tests,

$ coreDate-> timestamp ();
Konvertiert in den richtigen Zeitzonenversatz (wie meine Server-Datums- und Zeiteinstellungen), während ich immer einen Tag zuvor mit habe
$ coreDate-> gmtTimestamp ('Heute');
Wie Jeroen gesagt hat, könnte es sich um einen Magento-Fehler handeln.

Ravencoder
quelle
Dies funktioniert nicht auf Magento 1.9.3.3
Fred K
1

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

Bis jetzt sieht alles gut aus, wenn Sie das Gleiche für von und bis heute setzen. Für das Datum ist Datum + Sekunden an einem Tag - 1, also wird das Ende dieses Tages sein.

Möglicherweise ist das Kerndatum aufgrund einer widersprüchlichen Zeitzoneneinstellung falsch.

Sie können mit einem Testskript testen und einige Daten wiedergeben.

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

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

Oder rufen Sie das insertRuleDatamanuell auf und fügen Sie der Ressourcendatei einige Debugdaten zum Testen hinzu.

$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)));
Jeroen
quelle
1
Ich habe den Test wie von Ihnen vorgeschlagen durchgeführt und das von der Methode Mage :: getModel ('core / date') -> gmtTimestamp ('today') zurückgegebene Datum liegt einen Tag hinter dem tatsächlichen Tag. Beispiel: Heute ist der 19., aber mein Magento druckt den 18. als das heutige Datum. Es scheint, dass mein Problem davon abhängt, aber ich kann den Weg nicht finden, um das richtige Datum in meinem Magento-Shop einzustellen.
Gianis6
1
Das bedeutet, dass Ihr Gebietsschema einen Tag beträgt. System / Configuration / Locale options-> Zeitzone richtig einstellen
Jeroen
Welche Zeitzone soll ich verwenden? Der Server, auf dem mein Geschäft gehostet wird, hat die Zeitzone CDT (-5), während mein Geschäft in MEZ (+1) betrieben werden soll.
Gianis6
Verwenden Sie das richtige für Ihr Geschäft und führen Sie das Testskript erneut aus
Jeroen,
Ich kann nicht verstehen, welche Zeitzone ich verwenden soll. Wenn ich die CDT-Zeitzone einstelle und das Testskript ausführe, lautet das heute gedruckte Datum "2015-03-19 05:00:00". Ich muss meine Regel um 00:00:00 Uhr MEZ aktivieren / deaktivieren. Wenn Sie diese Einstellung verlassen, wird meine Katalogregel um 5 Uhr UTC aktiviert / deaktiviert.
Gianis6
1

special_to_date & special_from_date - funktioniert nicht im Regelfilter . Kann nur verwenden - special_price

Wenn jedoch Einstellungen im Produkt mit veraltetem Sonderpreis vorhanden sind, müssen die Sonderpreisattribute mit einem Skript wie - aktualisiert werden.

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();
}
Alex
quelle
1

Problem ist, dass die Funktion gmtTimestamp () Zend_Date :: TIMEZONE_SECS subtrahiert, um den GMT-Zeitstempel vom Datum in der aktuellen Zeitzone zurückzugeben. Wenn Sie dieser Funktion eine Zeichenfolge wie "Heute" übergeben und Ihre aktuelle Zeitzone nicht UTC ist, ist das Ergebnis immer falsch.

Um dies zu korrigieren, ändern Sie die Zeile 218 von Mage / CatalogRule / Model / Resource / Rule.php

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

mit

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

Ich fand es besser, den Zeitstempel zu ändern, um die Ortszeit zu verwenden, als GMT für die Berechnungen zu verwenden.

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

Das Problem besteht weiterhin in Magento 1.9.4.0. Die Verwendung der Lösung von xelber funktioniert perfekt. Schreiben Sie einfach die Funktion insertRuleData()inMage_CatalogRule_Model_Resource_Rule

Boris Mirübel
quelle