Domanda

Sto cercando di impostare un tempo nel prezzo del prodotto speciale da / per le date (vale a dire, prezzo speciale da 3/20/2013 11am EST a 4/20/2013 10:59am EST), ma non riesco a ottenere un tempo di presentarsi o salvare.

Quando entro un tempo nel admin (per esempio, 03/20/2013 11:00:00), mostra sempre con 00:00:00 nel database. Non ho davvero bisogno di aggiornare l'amministratore per consentire che mostra il tempo nel widget del calendario; piuttosto ho solo bisogno di salvare se ho messo in un tempo.

È stato utile?

Soluzione

Credo che questo sia un grave bug di Magento. special_price_from ha un modello backend Mage_Catalog_Model_Product_Attribute_Backend_Startdate (che estende Mage_Eav_Model_Entity_Attribute_Backend_Datetime) e special_price_to ha il modello backend Mage_Eav_Model_Entity_Attribute_Backend_Datetime.

Ora ogni volta che si salva uno di questi attributi viene chiamato questo metodo Mage_Eav_Model_Entity_Attribute_Backend_Datetime::beforeSave($object). E perché il calendario non invia la data in un formato internazionale si finisce in questa sezione del codice nel metodo 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
            );

Questo elimina la parte di tempo. Un lavoro intorno potrebbe essere quella di cambiare questo pezzo di codice per

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

(copiare il file nella cartella locale. Non c'è altro modo per ignorare questa classe, perché ci sono altre classi extendng esso) Questo vi farà risparmiare tempo anche nel database, ma c'è un altro problema. Anche se il tempo è salvato correttamente nel database quando si modifica il prodotto la data appare ancora senza il tempo e su qualsiasi altra, salvo il tempo malato scomparire di nuovo.

Per questo è necessario modificare il programma di rendering per gli attributi di data e ora.

E qui è dove mi sono bloccato. Forse avete un'idea su come farlo. Se trovo uno che permetterà di modificare la mia risposta e descriverlo.

In conclusione non è così semplice da fare quello che vuoi e che un problema serio che dovrebbe essere portata a Magento.

Modifica

Ok ho trovato questo link . Penso che comporta cambiamenti fondamentali e io non lo consiglio. Ma è possibile copiare i file è necessario modificare la cartella local.

Altri suggerimenti

Accidenti, ha perso quasi una settimana su questo tema !! Ma questo post indicò la soluzione, che è, dopo aver scoperto che si può semplicemente andare nella 'eav_attribute' tavolo e cambiare il valore 'frontend_input' dal 'data' a 'datetime' e hanno il widget del calendario nel backend anche visualizzare l'ora ei minuti (e il campo di input per accettare il valore).

Ma poi Magento non ha salvare l'ora del giorno e quindi ...

Ho copiato il file app / code / core / Mage / Eav / Modello / Entità / attributo / backend / Datetime.php nella mia cartella locale (app / code / local / Mage / Eav / Modello / Entità / attributo / backend ) e modificato come segue:

intorno alla linea 44 sostituto:

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

questo:

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

(qui si ottiene il modello frontend_input attributo, che è 'data' o 'datetime' o qualsiasi altra cosa e poi passarlo alla funzione FormatoData)

Poi nella funzione FormatoData più avanti nel codice per accettare il nuovo secondo parametro metti in lista dei parametri nell'intestazione della funzione la variabile $ feInput

public function formatDate($date, $feInput)

e poi in giro per la linea 87 sostituto:

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

questo:

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

Qui testiamo la variabile $ feInput e utilizzare la funzione getDateTimeFormat nel nucleo codebase Magento se il modello di ingresso è uguale a 'datetime'.

Spero che qualcuno forse potrebbe risparmiare un paio di giorni di lavoro con questo. Grazie a tutti i ragazzi e le ragazze sulla pila di cambio !!

EDIT:

questo è solo per essere in grado di inserire e memorizzare correttamente datetime valori Magento back-end. Avere i valori datetime correttamente controllati e trattati nei vari punti in cui vengono trattati nel frontend è un'altra storia ...

In aggiunta al suo amico Marius pubblicato per restituire il valore html ore è necessario apportare la seguente modifica:

Cambia questo:

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

che è il motivo per cui:

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

Cioè, il cambiamento $outputFormat la funzione getValue.

Questo ha funzionato bene. Spero che questo aiuti.

Abbiamo appena trascorso 5 ore al lavoro con questo (con la combinazione di Marius risposta)

File: \ lib \ Varien \ Data \ Form \ elemento \ Data.php

Per il mio locale solo, cambiare a voi stessi funzione di aggiungere:

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

cambiamento:

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top