использование времени по специальной цене от/до


Я пытаюсь установить время в специальной цене продукта на даты/с даты (т.Е. Специальная цена от 3/20/2013 11am EST до 4/20/2013 10:59am EST), но я не могу получить время для отображения или сохранения.

Когда я ввожу время в администраторе (например, 03/20/2013 11:00:00), оно всегда отображается с 00:00:00 в базе данных. Мне действительно не нужно обновлять администратора, чтобы разрешить отображение времени в виджете календаря; скорее, мне просто нужно сохранить его, если я укажу время.

Author: SR_Magento, 2013-03-20

4 answers

Я думаю, что это серьезная ошибка Magento. special_price_from имеет серверную модель Mage_Catalog_Model_Product_Attribute_Backend_Startdate (которая расширяет Mage_Eav_Model_Entity_Attribute_Backend_Datetime) и special_price_to имеет серверную модель Mage_Eav_Model_Entity_Attribute_Backend_Datetime.

Теперь каждый раз, когда вы сохраняете один из этих атрибутов, этот метод называется Mage_Eav_Model_Entity_Attribute_Backend_Datetime::beforeSave($object). И поскольку календарь не отправляет дату в международном формате, вы попадаете в этот раздел кода в методе 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
            );

Это убирает часть времени. Обходным решением было бы изменить этот фрагмент кода на

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

(копия файл в локальной папке. Нет другого способа переопределить этот класс, потому что есть другие классы, расширяющие его) Это сэкономит время и в вашей базе данных, но есть и другая проблема. Даже если время правильно сохранено в базе данных при редактировании продукта, дата все равно отображается без времени, а при любом другом сохранении времени снова исчезнет.

Для этого вам необходимо изменить средство визуализации для атрибутов даты и времени.

И вот тут я застрял. Может быть у вас есть идея, как это сделать. Если я найду его, я отредактирую свой ответ и опишу его.

В заключение, не так просто делать то, что вы хотите, и это серьезный вопрос, который следует поднять в Magento.

РЕДАКТИРОВАТЬ

Хорошо, я нашел эту ссылку . Я думаю, что это связано с основными изменениями, и я не рекомендую этого делать. Но вы можете скопировать файлы, которые вам нужно изменить, в папку local.

 3
Author: Marius, 2013-03-21 09:44:28

Фух, потерял почти неделю на этот вопрос!! Но это сообщение указывало на решение, то есть после того, как вы обнаружили, что вы можете просто зайти в таблицу "eav_attribute" и изменить значение "frontend_input" с "дата" на "дата-время" и иметь виджет календаря в бэкэнде также для отображения часа и минуты (и поля ввода, чтобы принять значение).

Но тогда Magento не экономил время суток, и поэтому...

Я скопировал файл app/code/core/Mage/Eav/Model/Entity/Attribute/Backend/Datetime.php в моей локальной папке (приложение/код/локальный/Маг/Eav/Модель/Сущность/Атрибут/Серверная часть) и изменил ее следующим образом:

В строке 44 заменить на:

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

Это:

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

(здесь мы получаем модель атрибута frontend_input, то есть "дата" или "дата-время" или что-то еще, а затем передаем ее в функцию formatDate)

Затем в функции formatDate позже в коде, чтобы принять новый второй параметр, добавьте в список параметров в заголовке функции переменная $feinput

public function formatDate($date, $feInput)

А затем в строке 87 замените на:

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

Здесь мы тестируем переменную $feinput и используем функцию getDateTimeFormat в основной кодовой базе Magento, если входная модель равна 'datetime'.

Я надеюсь, что кто-нибудь, возможно, сможет уделить этому несколько рабочих дней. Спасибо всем парням и девушкам на Stack Exchange!!

ИЗМЕНИТЬ:

Это просто для того, чтобы иметь возможность вводить и правильно храните значения даты и времени из серверной части Magento. Правильная проверка и обработка значений даты и времени в различных точках, в которых они обрабатываются во внешнем интерфейсе, - это другая история...

 3
Author: slamarca, 2014-03-13 15:33:20

В дополнение к своему другу Мариусу, опубликованному для возврата значения html в часах, необходимо внести следующее изменение:

Измените это:

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

Вот почему:

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

То есть измените $outputFormat функцию getValue.

Это сработало хорошо. Надеюсь, это поможет.

 0
Author: Amaro Júnior, 2015-04-05 08:09:29

Только что потратил 5 часов на работу с этим (с комбинацией ответа Мариуса)

Файл: \lib\Varien\Data\Form\Element\Data.php

Только для моей локали измените ее на себя , добавив функцию:

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

Изменение:

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;
}
 0
Author: hkguile, 2017-04-11 16:51:57