diff --git a/src/Contao/View/Contao2BackendView/EventListener/ConvertTimestampWidgetListener.php b/src/Contao/View/Contao2BackendView/EventListener/ConvertTimestampWidgetListener.php new file mode 100644 index 000000000..425400ea1 --- /dev/null +++ b/src/Contao/View/Contao2BackendView/EventListener/ConvertTimestampWidgetListener.php @@ -0,0 +1,92 @@ + + * @copyright 2013-2018 Contao Community Alliance. + * @license https://github.com/contao-community-alliance/dc-general/blob/master/LICENSE LGPL-3.0-or-later + * @filesource + */ + +namespace ContaoCommunityAlliance\DcGeneral\Contao\View\Contao2BackendView\EventListener; + + +use Contao\Config; +use ContaoCommunityAlliance\Contao\Bindings\ContaoEvents; +use ContaoCommunityAlliance\Contao\Bindings\Events\Date\ParseDateEvent; +use ContaoCommunityAlliance\DcGeneral\Contao\View\Contao2BackendView\Event\DecodePropertyValueForWidgetEvent; +use ContaoCommunityAlliance\DcGeneral\Contao\View\Contao2BackendView\Event\EncodePropertyValueFromWidgetEvent; + +class ConvertTimestampWidgetListener +{ + + /** + * Encode an timestamp attribute value from a widget value. + * + * @param EncodePropertyValueFromWidgetEvent $event The subscribed event. + * + * @return void + */ + public function handleEncodePropertyValueFromWidget(EncodePropertyValueFromWidgetEvent $event) + { + $environment = $event->getEnvironment(); + $dataDefinition = $environment->getDataDefinition(); + $propertyDefinition = $dataDefinition->getPropertiesDefinition()->getProperty($event->getProperty()); + + $extra = $propertyDefinition->getExtra(); + $rgxp = $extra['rgxp']; + if (!\in_array($rgxp, ['date', 'time', 'datim'])) { + return; + } + + $date = \DateTime::createFromFormat($this->getDateTimeFormat($rgxp), $event->getValue()); + + if ($date) { + $event->setValue($date->getTimestamp()); + } + } + + /** + * Decode an timestamp attribute value for a widget value. + * + * @param DecodePropertyValueForWidgetEvent $event The subscribed event. + * + * @return void + */ + public function handleDecodePropertyValueForWidgetEvent(DecodePropertyValueForWidgetEvent $event) + { + $environment = $event->getEnvironment(); + $dataDefinition = $environment->getDataDefinition(); + $propertyDefinition = $dataDefinition->getPropertiesDefinition()->getProperty($event->getProperty()); + + $extra = $propertyDefinition->getExtra(); + $rgxp = $extra['rgxp']; + if (!\in_array($rgxp, ['date', 'time', 'datim'])) { + return; + } + + $dispatcher = $event->getEnvironment()->getEventDispatcher(); + $value = $event->getValue(); + + if (\is_numeric($value)) { + $dateEvent = new ParseDateEvent($value, $this->getDateTimeFormat($rgxp)); + $dispatcher->dispatch(ContaoEvents::DATE_PARSE, $dateEvent); + + $event->setValue($dateEvent->getResult()); + } + } + + private function getDateTimeFormat($format) + { + return Config::get($format.'Format'); + } +} diff --git a/src/Resources/config/contao/widget_backend_listeners.yml b/src/Resources/config/contao/widget_backend_listeners.yml index b7799ffe9..3dfb6ca90 100644 --- a/src/Resources/config/contao/widget_backend_listeners.yml +++ b/src/Resources/config/contao/widget_backend_listeners.yml @@ -19,3 +19,13 @@ services: - name: kernel.event_listener event: dc-general.view.contao2backend.build-widget method: handleEvent + + cca.dc-general.backend_listener.convert_timestamp_widget: + class: ContaoCommunityAlliance\DcGeneral\Contao\View\Contao2BackendView\EventListener\ConvertTimestampWidgetListener + tags: + - name: kernel.event_listener + event: dc-general.view.contao2backend.decode-property-value-for-widget + method: handleDecodePropertyValueForWidgetEvent + - name: kernel.event_listener + event: dc-general.view.contao2backend.encode-property-value-from-widget + method: handleEncodePropertyValueFromWidget \ No newline at end of file