Frage

Ich versuche, eine Zeit im Produktspezialpreis für/von Daten festzulegen (dh Sonderpreis von 3/20/2013 11am EST zu 4/20/2013 10:59am EST), aber ich kann keine Zeit bekommen, um zu erscheinen oder zu speichern.

Wenn ich eine Zeit im Administrator eingehe (zum Beispiel,,, 03/20/2013 11:00:00), es taucht immer mit 00:00:00 in der Datenbank. Ich muss den Administrator nicht wirklich aktualisieren, damit die Zeit im Kalender -Widget angezeigt wird. Ich brauche es nur, um es zu sparen, wenn ich eine Zeit investiere.

War es hilfreich?

Lösung

Ich denke, das ist ein ernsthafter Magento -Fehler.special_price_from Hat ein Backend -Modell Mage_Catalog_Model_Product_Attribute_Backend_Startdate (Das erstreckt sich Mage_Eav_Model_Entity_Attribute_Backend_Datetime) und special_price_to Hat das Backend -Modell Mage_Eav_Model_Entity_Attribute_Backend_Datetime.

Jedes Mal, wenn Sie eines dieser Attribute speichern, wird diese Methode aufgerufen Mage_Eav_Model_Entity_Attribute_Backend_Datetime::beforeSave($object). Und weil der Kalender das Datum in einem internationalen Format nicht sendet, landen Sie in diesem Abschnitt des Codes in der Methode Mage_Eav_Model_Entity_Attribute_Backend_Datetime::formatDate($date):

$date = Mage::app()->getLocale()->date($date,
               Mage::app()->getLocale()->getDateFormat(Mage_Core_Model_Locale::FORMAT_TYPE_SHORT),
               null, false
            );

Dadurch wird der Zeitteil ausgedehnt. Eine Arbeit wäre es, diesen Code -Stück an zu ändern

$date = Mage::app()->getLocale()->date($date,
               Mage::app()->getLocale()->getDateFormat(Mage_Core_Model_Locale::FORMAT_TYPE_SHORT. ' HH:mm:ss'),
               null, false
            );

(Kopieren Sie die Datei in lokalem Ordner. Es gibt keine andere Möglichkeit, diese Klasse zu überschreiben, da es andere Klassen gibt.) Dies speichert die Zeit auch in Ihrer Datenbank, aber es gibt ein anderes Problem. Auch wenn die Zeit in der Datenbank korrekt gespeichert wird, wenn das Produkt bearbeitet wird, erscheint das Datum immer noch ohne Zeit und in anderen anderen Zeiten, die die Zeit speichern.

Dazu müssen Sie den Renderer für die DateTime -Attribute ändern.

Und hier bin ich festgefahren. Vielleicht haben Sie eine Idee, wie es geht. Wenn ich eine finde, werde ich meine Antwort bearbeiten und beschreiben.

Zusammenfassend ist es nicht so einfach, das zu tun, was Sie wollen, und ein ernstes Problem, das auf Magento aufgeworfen werden sollte.

BEARBEITEN

Ok, ich habe gefunden dieser Link. Ich denke, es beinhaltet Kernänderungen und ich empfehle es nicht. Sie können jedoch die Dateien kopieren, die Sie an der ändern müssen local Mappe.

Andere Tipps

Puh, fast eine Woche in dieser Ausgabe verloren !! Dieser Beitrag zeigte jedoch auf die Lösung, dh nachdem Sie festgestellt haben, dass Sie einfach in die Tabelle 'eAV_ATTRIBUTE' gehen und den Wert 'Frontend_input' von 'Datum' bis 'DateTime' ändern und das Kalender -Widget auch im Backend zu haben können Zeigen Sie die Stunde und die Minute (und das Eingangsfeld an, um den Wert zu akzeptieren).

Aber dann hat Magento die Tageszeit nicht gerettet und so ...

Ich habe in meinem lokalen Ordner (App/Code/Local/Mage/EAV/Modell/Entity/Attribut/Backend) die Datei app/code/core/mage/eav/modell/entity/attribut/backend/datetime.php kopiert und geändert es wie folgt:

Rund Linie 44 Ersatz an:

try {
  $value = $this->formatDate($object->getData($attributeName), $attributeFrontendInput);

Dies:

try {
  $attributeFrontendInput = $this->getAttribute()->getFrontendInput();
  $value = $this->formatDate($object->getData($attributeName), $attributeFrontendInput);

(Hier erhalten wir das Attribut -Frontend_Input -Modell, das "Datum" oder "DateTime" oder was auch immer und übergeben es dann an die Formatdatfunktion)

Dann in der Formatdatfunktion später im Code, um den neuen zweiten Parameter zur Parameterliste im Funktionsheader zu akzeptieren.

public function formatDate($date, $feInput)

und dann um Linie 87 ersetzen Sie:

$date = Mage::app()->getLocale()->date($date,
   Mage::app()->getLocale()->getDateFormat(Mage_Core_Model_Locale::FORMAT_TYPE_SHORT),
    null, false
);

Dies:

if ($feInput == 'datetime') {
    $date = Mage::app()->getLocale()->date($date,
        Mage::app()->getLocale()->getDateTimeFormat(Mage_Core_Model_Locale::FORMAT_TYPE_SHORT),
        null, false
    );
} else {
    $date = Mage::app()->getLocale()->date($date,
        Mage::app()->getLocale()->getDateFormat(Mage_Core_Model_Locale::FORMAT_TYPE_SHORT),
        null, false
    );
}

Hier testen wir die $ feinput -Variable und verwenden die Funktion getDateTimeFormat in der Magento -Core -Codebasis, wenn das Eingabemodell "DateTime" entspricht.

Ich hoffe, jemand könnte damit ein paar Arbeitstage sparen. Vielen Dank an alle Jungs und Mädchen auf Stack Exchange !!

BEARBEITEN:

Dies dient nur zum Eingeben und Speichern von DateTime -Werten aus dem Magento -Backend. Es ist eine andere Geschichte, die DateTime -Werte in den verschiedenen Punkten, in denen sie in der Frontend verarbeitet werden, korrekt überprüft und verarbeitet zu haben ...

Zusätzlich zu seinem Freund Marius ist erforderlich, um den HTML -Wert in Stunden zurückzugeben, um die folgende Änderung vorzunehmen:

Ändere das:

    $html = sprintf(
        '<input name="%s" id="%s" value="%s" %s style="width:110px !important;" />'
        .' <img src="%s" alt="" class="v-middle" id="%s_trig" title="%s" style="%s" />',
        $this->getName(), $this->getHtmlId(), $this->_escape($this->getValue()), $this->serialize($this->getHtmlAttributes()),
        $this->getImage(), $this->getHtmlId(), 'Select Date', ($this->getDisabled() ? 'display:none;' : '')
    );

deswegen:

    $html = sprintf(
        '<input name="%s" id="%s" value="%s" %s style="width:110px !important;" />'
        .' <img src="%s" alt="" class="v-middle" id="%s_trig" title="%s" style="%s" />',
        $this->getName(), $this->getHtmlId(), $this->_escape($this->getValue($outputFormat)), $this->serialize($this->getHtmlAttributes()),
        $this->getImage(), $this->getHtmlId(), 'Select Date', ($this->getDisabled() ? 'display:none;' : '')
    );

Das heißt, Veränderung $outputFormat das getValue Funktion.

Das hat gut funktioniert. Hoffe das hilft.

Ich habe gerade 5 Stunden damit verbracht, damit zu arbeiten (mit Kombination von Marius -Antwort)

Datei: lib variien Data Form Element data.php

Ändern Sie sie nur für mein Gebietsschema in sich selbst: Fügen Sie die Funktion hinzu:

public function getRawMysqlDateFormat ($value) {
    if (empty($this->_value)) {
        return null;
    }
    $new_date = explode(" ", $value);
    //2017年4月1日 下午4:16:16
    $str_to_replace1 = array("年","月");
    $str_to_replace2 = "日";
    $new_date_part1 = str_replace($str_to_replace1, "-", $new_date[0]);
    $new_date_part1 = str_replace($str_to_replace2, "", $new_date_part1);

    $new_date_part2 = explode(":", $new_date[1]);
    $hour = "";
    $min = $new_date_part2[1];
    $sec = $new_date_part2[2];
    if (stripos($new_date_part2[0], "下午") !== false) {
        $temp = str_replace("下午", "", $new_date_part2[0]);
        $hour = $temp+12;
    } else {
        $temp = str_replace("上午", "", $new_date_part2[0]);
        $hour = $new_date_part2[0];
    }

    return $new_date_part1.' '.$hour.':'.$min.':'.$sec;
}

Rückgeld:

public function getElementHtml()
{
    $this->addClass('input-text');

    $html = sprintf(
        '<input name="%s" id="%s" value="%s" %s style="width:110px !important;" />'
        .' <img src="%s" alt="" class="v-middle" id="%s_trig" title="%s" style="%s" />',
        $this->getName(), $this->getHtmlId(), $this->getRawMysqlDateFormat($this->_value), $this->serialize($this->getHtmlAttributes()),
        $this->getImage(), $this->getHtmlId(), 'Select Date', ($this->getDisabled() ? 'display:none;' : '')
    );
    $outputFormat = $this->getFormat();
    if (empty($outputFormat)) {
        throw new Exception('Output format is not specified. Please, specify "format" key in constructor, or set it using setFormat().');
    }
    $displayFormat = Varien_Date::convertZendToStrFtime($outputFormat, true, (bool)$this->getTime());
    $test = $this->getRawMysqlDateFormat($this->_value);
    $html .= sprintf('
        <script type="text/javascript">
        //<![CDATA[
            Calendar.setup({
                inputField: "%s",
                ifFormat: "%s",
                showsTime: "true",
                button: "%s_trig",
                align: "Bl",
                singleClick : true
            });
        //]]>
        </script>',
        $this->getHtmlId(), "%Y-%m-%d %H:%M:%S",
        $this->getTime() ? 'true' : 'false', $this->getHtmlId()
    );

    $html .= $this->getAfterElementHtml();

    return $html;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top