diff --git a/app/code/Magento/Catalog/view/frontend/templates/category/image.phtml b/app/code/Magento/Catalog/view/frontend/templates/category/image.phtml index 8f72e4713d22b..b11fa08befbe4 100644 --- a/app/code/Magento/Catalog/view/frontend/templates/category/image.phtml +++ b/app/code/Magento/Catalog/view/frontend/templates/category/image.phtml @@ -19,6 +19,7 @@ $_category = $block->getCurrentCategory(); $_imgHtml = ''; if ($_imgUrl = $block->getImage()->getUrl($_category)) { + if(file_exists($_imgUrl)) { $_imgHtml = '<div class="category-image"><img src="' . $block->escapeUrl($_imgUrl) . '" alt="' @@ -28,5 +29,6 @@ . '" class="image" /></div>'; $_imgHtml = $block->getOutput()->categoryAttribute($_category, $_imgHtml, 'image'); /* @noEscape */ echo $_imgHtml; + } } ?> diff --git a/lib/internal/Magento/Framework/Data/Form/Element/Datetime.php b/lib/internal/Magento/Framework/Data/Form/Element/Datetime.php new file mode 100644 index 0000000000000..a1af806a70fb0 --- /dev/null +++ b/lib/internal/Magento/Framework/Data/Form/Element/Datetime.php @@ -0,0 +1,204 @@ +<?php +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +/** + * Magento data selector form element + * + * @author Magento Core Team <core@magentocommerce.com> + */ + +namespace Magento\Framework\Data\Form\Element; + +use Magento\Framework\Escaper; +use Magento\Framework\Stdlib\DateTime\TimezoneInterface; + +/** + * Date element + */ +class Datetime extends AbstractElement +{ + /** + * @var \DateTime + */ + protected $_value; + + /** + * @var TimezoneInterface + */ + protected $localeDate; + + /** + * @param Factory $factoryElement + * @param CollectionFactory $factoryCollection + * @param Escaper $escaper + * @param TimezoneInterface $localeDate + * @param array $data + */ + public function __construct( + Factory $factoryElement, + CollectionFactory $factoryCollection, + Escaper $escaper, + TimezoneInterface $localeDate, + $data = [] + ) { + $this->localeDate = $localeDate; + parent::__construct($factoryElement, $factoryCollection, $escaper, $data); + $this->setType('text'); + $this->setExtType('textfield'); + if (isset($data['value'])) { + $this->setValue($data['value']); + } + } + + /** + * Check if a string is a date value + * + * @param string $value + * @return bool + */ + private function isDate(string $value): bool + { + $date = date_parse($value); + + return !empty($date['year']) && !empty($date['month']) && !empty($date['day']); + } + + /** + * If script executes on x64 system, converts large numeric values to timestamp limit + * + * @param int $value + * @return int + */ + protected function _toTimestamp($value) + { + $value = (int)$value; + if ($value > 3155760000) { + $value = 0; + } + + return $value; + } + + /** + * Set date value + * + * @param mixed $value + * @return $this + */ + public function setValue($value) + { + if (empty($value)) { + $this->_value = ''; + return $this; + } + if ($value instanceof \DateTimeInterface) { + $this->_value = $value; + return $this; + } + try { + if (preg_match('/^[0-9]+$/', $value)) { + $this->_value = (new \DateTime())->setTimestamp($this->_toTimestamp($value)); + } elseif (is_string($value) && $this->isDate($value)) { + $this->_value = new \DateTime($value, new \DateTimeZone($this->localeDate->getConfigTimezone())); + } else { + $this->_value = ''; + } + } catch (\Exception $e) { + $this->_value = ''; + } + return $this; + } + + /** + * Get date value as string. + * + * Format can be specified, or it will be taken from $this->getFormat() + * + * @param string $format (compatible with \DateTime) + * @return string + */ + public function getValue($format = null) + { + if (empty($this->_value)) { + return ''; + } + if (null === $format) { + $format = $this->getDateFormat(); + $format .= ($format && $this->getTimeFormat()) ? ' ' : ''; + $format .= $this->getTimeFormat() ? $this->getTimeFormat() : ''; + } + return $this->localeDate->formatDateTime( + $this->_value, + null, + null, + null, + $this->_value->getTimezone(), + $format + ); + } + + /** + * Get value instance, if any + * + * @return \DateTime + */ + public function getValueInstance() + { + if (empty($this->_value)) { + return null; + } + return $this->_value; + } + + /** + * Output the input field and assign calendar instance to it. + * In order to output the date: + * - the value must be instantiated (\DateTime) + * - output format must be set (compatible with \DateTime) + * + * @throws \Exception + * @return string + */ + public function getElementHtml() + { + $this->addClass('admin__control-text input-text input-date'); + $dateFormat = $this->getDateFormat() ?: $this->getFormat(); + $dateFormat = 'mm/dd/yy'; + $timeFormat = $this->getTimeFormat(); + if (empty($dateFormat)) { + throw new \Exception( + 'Output format is not specified. ' . + 'Please specify "format" key in constructor, or set it using setFormat().' + ); + } + + $dataInit = 'data-mage-init="' . $this->_escape( + json_encode( + [ + 'calendar' => [ + 'dateFormat' => $dateFormat, + 'showsTime' => true, + 'timeFormat' => 'HH:mm', + 'buttonImage' => $this->getImage(), + 'buttonText' => 'Select Date', + 'changeYear' => true, + ], + ] + ) + ) . '"'; + + $html = sprintf( + '<input name="%s" id="%s" value="%s" %s %s />', + $this->getName(), + $this->getHtmlId(), + $this->_escape($this->getValue()), + $this->serialize($this->getHtmlAttributes()), + $dataInit + ); + $html .= $this->getAfterElementHtml(); + return $html; + } +} diff --git a/lib/internal/Magento/Framework/Data/Form/Element/Factory.php b/lib/internal/Magento/Framework/Data/Form/Element/Factory.php index 582b0c8cf6549..86b2c60fcfb66 100644 --- a/lib/internal/Magento/Framework/Data/Form/Element/Factory.php +++ b/lib/internal/Magento/Framework/Data/Form/Element/Factory.php @@ -29,6 +29,7 @@ class Factory 'checkboxes', 'column', 'date', + 'datetime', 'editablemultiselect', 'editor', 'fieldset',