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

magento.stackexchange https://magento.stackexchange.com/questions/1480

  •  16-10-2019
  •  | 
  •  

Вопрос

Я пытаюсь установить время в продукте Специальная цена в/из дат (т.е. специальная цена от 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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top