Pregunta

Estoy tratando de establecer un tiempo en el precio de productos especiales a / de fechas (es decir, el precio especial de 3/20/2013 11am EST a 4/20/2013 10:59am EST), pero no puede conseguir un tiempo para presentarse o guardar.

Cuando entro en un momento en el admin (por ejemplo, 03/20/2013 11:00:00), siempre aparece con 00:00:00 en la base de datos. Realmente no es necesario que actualice el administrador para permitir que muestra el tiempo en el widget de calendario; más bien yo sólo necesito para salvar si pongo en un tiempo.

¿Fue útil?

Solución

creo que esto es un grave error de Magento. special_price_from tiene un modelo de backend Mage_Catalog_Model_Product_Attribute_Backend_Startdate (que se extiende Mage_Eav_Model_Entity_Attribute_Backend_Datetime) y special_price_to tiene el modelo backend Mage_Eav_Model_Entity_Attribute_Backend_Datetime.

Ahora, cada vez que se guarda uno de estos atributos este método se llama Mage_Eav_Model_Entity_Attribute_Backend_Datetime::beforeSave($object). Y porque el calendario no envía la fecha en un formato internacional, se llega a esta sección del código en el método 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
            );

Esta tiras de la parte de hora. Un trabajo alrededor sería cambiar esta pieza de código a

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

(copiar el archivo en la carpeta local. No hay otra forma de anular esta clase, porque hay otras clases que extendng) Esto ahorrará el tiempo también en su base de datos, pero hay otro problema. Incluso si el tiempo se guarda correctamente en la base de datos cuando se edita el producto de la fecha sigue apareciendo sin el tiempo y en cualquier otro ahorrar el tiempo enfermo desaparecer de nuevo.

Para ello, tiene que modificar el procesador para los atributos de fecha y hora.

Y aquí es donde me quedé atrapado. Tal vez usted tiene una idea de cómo hacerlo. Si encuentro uno voy a editar mi respuesta y describirlo.

En conclusión no es tan sencillo de hacer lo que quiere y que un problema grave que debe ser elevado a Magento.

Editar

este enlace . Creo que implica cambios fundamentales y yo no lo recomiendo. Sin embargo, puede copiar los archivos que necesita para modificar la carpeta local.

Otros consejos

¡Menos mal, perdió casi una semana en este tema !! Pero este post señaló a la solución, es decir, después de haber descubierto que simplemente podría ir en el 'eav_attribute' mesa y cambiar el valor 'frontend_input' de 'la fecha' a 'fecha y hora' y tienen el widget de calendario en el backend también mostrar la hora y los minutos (y el campo de entrada para aceptar el valor).

Pero entonces Magento no salvó a la hora del día y así ...

Me copió el archivo app / código / core / Mago / Eav / modelo / entidad / atributo / backend / Datetime.php en mi carpeta local (app / código / local / Mago / Eav / modelo / entidad / atributo / Backend ) y modificado como sigue:

alrededor de la línea 44 sustituto a:

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

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

(aquí obtenemos el modelo frontend_input atributo, que es 'fecha' o 'fecha y hora' o lo que sea y luego pasarlo a la función formatDate)

A continuación, en la función formatDate adelante en el código para aceptar el nuevo segundo parámetro añadir a la lista de parámetros en la cabecera de la función de la variable $ feInput

public function formatDate($date, $feInput)

y luego alrededor de la línea 87 a sustituto:

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

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

A continuación ponemos a prueba la variable $ feInput y utilizar la función getDateTimeFormat en el código base del núcleo de Magento si el modelo de entrada de fecha y hora iguales ''.

Espero que alguien tal vez podía prescindir de unos pocos días de trabajo con esto. Gracias a todos los chicos y chicas en pila Cambio !!

EDIT:

esto es sólo por ser capaz de introducir y almacenar correctamente los valores de fecha y hora de Magento backend. Tener los valores de fecha y hora correcta comprueban y se procesan en los diversos puntos en los que se traten en el frontend es otra historia ...

Además de su amigo Mario ha escrito para devolver el valor HTML en horas es necesario para realizar el cambio siguiente:

Cambiar esto:

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

Es por eso que:

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

Es decir, el cambio $outputFormat la función getValue.

Esto funcionó bien. Espero que esto ayude.

Sólo pasamos 5 horas para trabajar con este (con combinación de respuesta Marius)

Archivo: \ lib \ Varien \ Data \ Form \ Elemento \ Data.php

Para mi local solamente, cambie a sí mismo añadir la función:

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

Cambio:

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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top