Использование времени по специальной цене от/до
Вопрос
Я пытаюсь установить время в продукте Специальная цена в/из дат (т.е. специальная цена от 3/20/2013 11am EST
к 4/20/2013 10:59am EST
), но я не могу получить время, чтобы появиться или сохранить.
Когда я ввожу время в администраторе (например, 03/20/2013 11:00:00
), это всегда появляется с 00:00:00
в базе данных. Мне действительно не нужно обновлять администратора, чтобы показывать время в виджете календаря; Скорее мне это просто нужно, чтобы сэкономить, если я введу время.
Решение
Я думаю, что это серьезная ошибка 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
);
(Скопируйте файл в локальной папке. Нет другого способа переопределить этот класс, потому что есть и другие классы, расширяющие его) Это будет сэкономить время в вашей базе данных, но есть другая проблема. Даже если время правильно сохранено в базе данных при редактировании продукта, дата все еще появляется без времени, а в любом другом сэкономить время, я снова исчезнет.
Для этого вам необходимо изменить рендеринг для атрибутов DateTime.
И вот где я застрял. Может быть, у вас есть идея о том, как это сделать. Если я найду один, я отредактирую свой ответ и опишу его.
В заключение не так просто делать то, что вы хотите, и это серьезная проблема, которая должна быть поднята в Magento.
РЕДАКТИРОВАТЬ
Хорошо, я нашел эта ссылка. Анкет Я думаю, что это включает в себя основные изменения, и я не рекомендую это. Но вы можете скопировать файлы, необходимые для изменения в local
папка.
Другие советы
Вот, потерял почти неделю в этом вопросе !! Но этот пост указал на решение, то есть после того, как вы обнаружили, что вы можете просто перейти в таблицу «eav_attribute» и изменить значение «frontend_input» с «даты» на «datetime» и иметь виджет календаря в бэкэнд. отобразить час и минуту (и поле ввода, чтобы принять значение).
Но тогда Магенто не сэкономил время суток и так ...
Я скопировал файловое приложение/code/core/mage/eav/model/entity/attribute/backend/datetime.php в моей локальной папке (приложение/код/локальный/маг/eav/model/entity/attribute/backend) и изменен это следующим образом:
Вокруг строки 44 заменить:
try {
$value = $this->formatDate($object->getData($attributeName), $attributeFrontendInput);
это:
try {
$attributeFrontendInput = $this->getAttribute()->getFrontendInput();
$value = $this->formatDate($object->getData($attributeName), $attributeFrontendInput);
(Здесь мы получаем модель атрибутов Frontend_input, то есть «дата» или «dateTime» или что -то еще, а затем передаем ее функции 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 Core, если входная модель равна «DateTime».
Я надеюсь, что кто -то может сэкономить несколько рабочих дней с этим. Спасибо всем парням и девочкам на обмене стека !!
РЕДАКТИРОВАТЬ:
Это просто для того, чтобы иметь возможность вводить и хранить правильные значения DateTime из Backend Magento. Наличие значений DateTime правильно проверялось и обрабатывалось в различных точках, в которых они обрабатываются на бренде, - это другая история ...
В дополнение к своему другу Мариусу, чтобы вернуть значение 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;
}