использование времени по специальной цене от/до
Я пытаюсь установить время в специальной цене продукта на даты/с даты (т.Е. Специальная цена от 3/20/2013 11am EST
до 4/20/2013 10:59am EST
), но я не могу получить время для отображения или сохранения.
Когда я ввожу время в администраторе (например, 03/20/2013 11:00:00
), оно всегда отображается с 00:00:00
в базе данных. Мне действительно не нужно обновлять администратора, чтобы разрешить отображение времени в виджете календаря; скорее, мне просто нужно сохранить его, если я укажу время.
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
.
Фух, потерял почти неделю на этот вопрос!! Но это сообщение указывало на решение, то есть после того, как вы обнаружили, что вы можете просто зайти в таблицу "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. Правильная проверка и обработка значений даты и времени в различных точках, в которых они обрабатываются во внешнем интерфейсе, - это другая история...
В дополнение к своему другу Мариусу, опубликованному для возврата значения 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
.
Это сработало хорошо. Надеюсь, это поможет.
Только что потратил 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;
}