Question

Je suis en train de définir un temps dans le prix spécial du produit / de dates (à savoir, le prix spécial de 3/20/2013 11am EST à 4/20/2013 10:59am EST), mais je ne peux pas obtenir un temps de se présenter ou enregistrer.

Quand je rentre une fois dans l'admin (par exemple, 03/20/2013 11:00:00), il montre toujours avec 00:00:00 dans la base de données. Je ne suis pas vraiment besoin de mettre à jour l'administrateur pour permettre l'heure en le widget calendrier; plutôt j'ai besoin pour sauver si je mets dans un temps.

Était-ce utile?

La solution

Je pense que cela est un grave bug Magento. special_price_from a un modèle d'arrière-plan Mage_Catalog_Model_Product_Attribute_Backend_Startdate (qui étend Mage_Eav_Model_Entity_Attribute_Backend_Datetime) et special_price_to a le modèle d'arrière-plan Mage_Eav_Model_Entity_Attribute_Backend_Datetime.

Maintenant, chaque fois que vous enregistrez un de ces attributs cette méthode est appelée Mage_Eav_Model_Entity_Attribute_Backend_Datetime::beforeSave($object). Et parce que le calendrier n'envoie pas la date dans un format international vous vous retrouvez dans cette section du code dans la méthode 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
            );

bandes la partie du temps. Un travail autour serait de changer ce morceau de code à

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

(copier le fichier dans le dossier local. Il n'y a pas d'autre moyen de passer outre cette classe parce qu'il ya d'autres classes extendng il) Cela permettra d'économiser le temps aussi dans votre base de données, mais il y a un autre problème. Même si le temps est correctement enregistré dans la base de données lors de la modification du produit, la date apparaît toujours sans le temps et sur tout autre, sauf le temps disparaître à nouveau mal.

Pour cela, vous devez modifier le moteur de rendu pour les attributs datetime.

Et voici où je suis coincé. Peut-être que vous avez une idée sur la façon de le faire. Si je trouve que je vais modifier ma réponse et de le décrire.

En conclusion, il est pas avant de le faire directement ce que vous voulez et un problème grave qui doit être portée à Magento.

EDIT

Ok j'ai trouvé ce lien . Je pense qu'il implique des changements fondamentaux et je ne le recommande pas. Mais vous pouvez copier les fichiers que vous devez modifier dans le dossier local.

Autres conseils

Ouf, a perdu près d'une semaine sur cette question !! Mais ce poste a la solution, qui est, après avoir découvert que vous pouvez simplement aller dans la table « eav_attribute » et changez la valeur « frontend_input » de « date » à « datetime » et ont le widget calendrier dans le backend aussi afficher l'heure et les minutes (et le champ d'entrée pour accepter la valeur).

Mais Magento n'a pas épargné l'heure du jour et ainsi ...

J'ai copié le fichier app / code / core / Mage / Eav / Modèle / entité / attribut / backend / Datetime.php dans mon dossier local (app / code / local / Mage / Eav / Modèle / entité / attribut / backend ) et modifié comme suit:

autour de la ligne 44 substitut à:

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

:

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

(ici nous obtenons le modèle frontend_input d'attribut, qui est « date » ou « datetime » ou autre chose et passer ensuite à la fonction formatDate)

Ensuite, dans la fonction formatDate plus tard dans le code pour accepter le nouveau second paramètre ajouter à la liste des paramètres dans l'en-tête de la fonction de la variable $ feInput

public function formatDate($date, $feInput)

puis autour de la ligne 87 à remplacer:

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

Nous testons ici la variable $ feInput et utiliser la fonction de getDateTimeFormat dans la base de code de base Magento si le modèle d'entrée de datetime 'égal à égal.

J'espère que quelqu'un pourrait peut-être épargner quelques jours de travail avec cela. Merci à tous les gars et les filles sur Stack échange !!

EDIT:

est juste pour être en mesure d'entrer et de stocker correctement les valeurs datetime de back-end Magento. Ayant les valeurs datetime correctement vérifiées et traitées dans les différents points où ils sont traités dans le frontend est une autre histoire ...

En plus de son ami Marius affiché pour retourner la valeur html en heures est nécessaire pour effectuer le changement suivant:

Modifier ceci:

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

c'est pourquoi:

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

C'est, le changement $outputFormat la fonction getValue.

Cela a bien fonctionné. Espérons que cela aide.

Je viens de passer cinq heures à travailler avec cette (avec une combinaison de réponse Marius)

Fichier: \ lib \ Varien \ Data \ Form \ élément \ Data.php

Pour ma locale seulement, changer pour vous fonction ajouter:

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

Changement:

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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top