- Fixed #16160: Call to undefined function ezi18n()
[tinyz:tinyz.git] / kernel / classes / datatypes / ezdatetime / ezdatetimetype.php
1 <?php
2 //
3 // Definition of eZDateTimeType class
4 //
5 //
6 // ## BEGIN COPYRIGHT, LICENSE AND WARRANTY NOTICE ##
7 // SOFTWARE NAME: eZ Publish
8 // SOFTWARE RELEASE: 4.1.x
9 // COPYRIGHT NOTICE: Copyright (C) 1999-2010 eZ Systems AS
10 // SOFTWARE LICENSE: GNU General Public License v2.0
11 // NOTICE: >
12 //   This program is free software; you can redistribute it and/or
13 //   modify it under the terms of version 2.0  of the GNU General
14 //   Public License as published by the Free Software Foundation.
15 //
16 //   This program is distributed in the hope that it will be useful,
17 //   but WITHOUT ANY WARRANTY; without even the implied warranty of
18 //   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 //   GNU General Public License for more details.
20 //
21 //   You should have received a copy of version 2.0 of the GNU General
22 //   Public License along with this program; if not, write to the Free
23 //   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
24 //   MA 02110-1301, USA.
25 //
26 //
27 // ## END COPYRIGHT, LICENSE AND WARRANTY NOTICE ##
28 //
29
30 /*!
31   \class eZDateTimeType ezdatetimetype.php
32   \ingroup eZDatatype
33   \brief Stores a date and time value
34
35 */
36
37 class eZDateTimeType extends eZDataType
38 {
39     const DATA_TYPE_STRING = 'ezdatetime';
40
41     const DEFAULT_FIELD = 'data_int1';
42
43     const USE_SECONDS_FIELD = 'data_int2';
44
45     const ADJUSTMENT_FIELD = 'data_text5';
46
47     const DEFAULT_EMTPY = 0;
48
49     const DEFAULT_CURRENT_DATE = 1;
50
51     const DEFAULT_ADJUSTMENT = 2;
52
53     function eZDateTimeType()
54     {
55         $this->eZDataType( self::DATA_TYPE_STRING, ezpI18n::translate( 'kernel/classes/datatypes', "Date and time", 'Datatype name' ),
56                            array( 'serialize_supported' => true ) );
57     }
58
59     /*!
60      Private method only for use inside this class
61     */
62     function validateDateTimeHTTPInput( $day, $month, $year, $hour, $minute, $second, $contentObjectAttribute )
63     {
64         $state = eZDateTimeValidator::validateDate( $day, $month, $year );
65         if ( $state == eZInputValidator::STATE_INVALID )
66         {
67             $contentObjectAttribute->setValidationError( ezpI18n::translate( 'kernel/classes/datatypes',
68                                                                  'Date is not valid.' ) );
69             return eZInputValidator::STATE_INVALID;
70         }
71
72         $state = eZDateTimeValidator::validateTime( $hour, $minute, $second );
73
74         if ( $state == eZInputValidator::STATE_INVALID )
75         {
76             $contentObjectAttribute->setValidationError( ezpI18n::translate( 'kernel/classes/datatypes',
77                                                                  'Time is not valid.' ) );
78             return eZInputValidator::STATE_INVALID;
79         }
80         return $state;
81     }
82
83     /*!
84      Validates the input and returns true if the input was
85      valid for this datatype.
86     */
87     function validateObjectAttributeHTTPInput( $http, $base, $contentObjectAttribute )
88     {
89         $classAttribute = $contentObjectAttribute->contentClassAttribute();
90         $useSeconds = ( $classAttribute->attribute( self::USE_SECONDS_FIELD ) == 1 );
91
92         if ( $http->hasPostVariable( $base . '_datetime_year_' . $contentObjectAttribute->attribute( 'id' ) ) and
93              $http->hasPostVariable( $base . '_datetime_month_' . $contentObjectAttribute->attribute( 'id' ) ) and
94              $http->hasPostVariable( $base . '_datetime_day_' . $contentObjectAttribute->attribute( 'id' ) ) and
95              $http->hasPostVariable( $base . '_datetime_hour_' . $contentObjectAttribute->attribute( 'id' ) ) and
96              $http->hasPostVariable( $base . '_datetime_minute_' . $contentObjectAttribute->attribute( 'id' ) ) and
97              ( !$useSeconds or $http->hasPostVariable( $base . '_datetime_second_' . $contentObjectAttribute->attribute( 'id' ) ) ) )
98         {
99             $year   = $http->postVariable( $base . '_datetime_year_' . $contentObjectAttribute->attribute( 'id' ) );
100             $month  = $http->postVariable( $base . '_datetime_month_' . $contentObjectAttribute->attribute( 'id' ) );
101             $day    = $http->postVariable( $base . '_datetime_day_' . $contentObjectAttribute->attribute( 'id' ) );
102             $hour   = $http->postVariable( $base . '_datetime_hour_' . $contentObjectAttribute->attribute( 'id' ) );
103             $minute = $http->postVariable( $base . '_datetime_minute_' . $contentObjectAttribute->attribute( 'id' ) );
104             $second = $useSeconds ? $http->postVariable( $base . '_datetime_second_' . $contentObjectAttribute->attribute( 'id' ) ) : 0;
105
106             if ( $year == '' or
107                  $month == '' or
108                  $day == '' or
109                  $hour == '' or
110                  $minute == '' or
111                  ( $useSeconds and $second == '' ) )
112             {
113                 if ( !( $year == '' and
114                         $month == '' and
115                         $day == '' and
116                         $hour == '' and
117                         $minute == '' and
118                         ( !$useSeconds or $second == '' ) ) or
119                      ( !$classAttribute->attribute( 'is_information_collector' ) and
120                        $contentObjectAttribute->validateIsRequired() ) )
121                 {
122                     $contentObjectAttribute->setValidationError( ezpI18n::translate( 'kernel/classes/datatypes',
123                                                                          'Missing datetime input.' ) );
124                     return eZInputValidator::STATE_INVALID;
125                 }
126                 else
127                     return eZInputValidator::STATE_ACCEPTED;
128             }
129             else
130             {
131                 return $this->validateDateTimeHTTPInput( $day, $month, $year, $hour, $minute, $second, $contentObjectAttribute );
132             }
133         }
134         else if ( !$classAttribute->attribute( 'is_information_collector' ) and $contentObjectAttribute->validateIsRequired() )
135         {
136             $contentObjectAttribute->setValidationError( ezpI18n::translate( 'kernel/classes/datatypes', 'Missing datetime input.' ) );
137             return eZInputValidator::STATE_INVALID;
138         }
139         else
140             return eZInputValidator::STATE_ACCEPTED;
141     }
142
143     /*!
144      Fetches the http post var integer input and stores it in the data instance.
145     */
146     function fetchObjectAttributeHTTPInput( $http, $base, $contentObjectAttribute )
147     {
148         $contentClassAttribute = $contentObjectAttribute->contentClassAttribute();
149         $useSeconds = ( $contentClassAttribute->attribute( self::USE_SECONDS_FIELD ) == 1 );
150
151         if ( $http->hasPostVariable( $base . '_datetime_year_' . $contentObjectAttribute->attribute( 'id' ) ) and
152              $http->hasPostVariable( $base . '_datetime_month_' . $contentObjectAttribute->attribute( 'id' ) ) and
153              $http->hasPostVariable( $base . '_datetime_day_' . $contentObjectAttribute->attribute( 'id' ) ) and
154              $http->hasPostVariable( $base . '_datetime_hour_' . $contentObjectAttribute->attribute( 'id' ) ) and
155              $http->hasPostVariable( $base . '_datetime_minute_' . $contentObjectAttribute->attribute( 'id' ) ) and
156              ( !$useSeconds or $http->hasPostVariable( $base . '_datetime_second_' . $contentObjectAttribute->attribute( 'id' ) ) ) )
157         {
158             $year   = $http->postVariable( $base . '_datetime_year_' . $contentObjectAttribute->attribute( 'id' ) );
159             $month  = $http->postVariable( $base . '_datetime_month_' . $contentObjectAttribute->attribute( 'id' ) );
160             $day    = $http->postVariable( $base . '_datetime_day_' . $contentObjectAttribute->attribute( 'id' ) );
161             $hour   = $http->postVariable( $base . '_datetime_hour_' . $contentObjectAttribute->attribute( 'id' ) );
162             $minute = $http->postVariable( $base . '_datetime_minute_' . $contentObjectAttribute->attribute( 'id' ) );
163             $second = $useSeconds ? $http->postVariable( $base . '_datetime_second_' . $contentObjectAttribute->attribute( 'id' ) ) : 0;
164
165             $dateTime = new eZDateTime();
166
167             if ( ( $year == '' and $month == '' and $day == '' and
168                    $hour == '' and $minute == '' and ( !$useSeconds or $second == '' ) ) or
169                  !checkdate( $month, $day, $year ) or $year < 1970 )
170             {
171                     $dateTime->setTimeStamp( 0 );
172             }
173             else
174             {
175                 $dateTime->setMDYHMS( $month, $day, $year, $hour, $minute, $second );
176             }
177
178             $contentObjectAttribute->setAttribute( 'data_int', $dateTime->timeStamp() );
179             return true;
180         }
181         return false;
182     }
183
184     function validateCollectionAttributeHTTPInput( $http, $base, $contentObjectAttribute )
185     {
186         $contentClassAttribute = $contentObjectAttribute->contentClassAttribute();
187         $useSeconds = ( $contentClassAttribute->attribute( self::USE_SECONDS_FIELD ) == 1 );
188
189         if ( $http->hasPostVariable( $base . '_datetime_year_' . $contentObjectAttribute->attribute( 'id' ) ) and
190              $http->hasPostVariable( $base . '_datetime_month_' . $contentObjectAttribute->attribute( 'id' ) ) and
191              $http->hasPostVariable( $base . '_datetime_day_' . $contentObjectAttribute->attribute( 'id' ) ) and
192              $http->hasPostVariable( $base . '_datetime_hour_' . $contentObjectAttribute->attribute( 'id' ) ) and
193              $http->hasPostVariable( $base . '_datetime_minute_' . $contentObjectAttribute->attribute( 'id' ) ) and
194              ( !$useSeconds or $http->hasPostVariable( $base . '_datetime_second_' . $contentObjectAttribute->attribute( 'id' ) ) ) )
195
196         {
197             $year   = $http->postVariable( $base . '_datetime_year_' . $contentObjectAttribute->attribute( 'id' ) );
198             $month  = $http->postVariable( $base . '_datetime_month_' . $contentObjectAttribute->attribute( 'id' ) );
199             $day    = $http->postVariable( $base . '_datetime_day_' . $contentObjectAttribute->attribute( 'id' ) );
200             $hour   = $http->postVariable( $base . '_datetime_hour_' . $contentObjectAttribute->attribute( 'id' ) );
201             $minute = $http->postVariable( $base . '_datetime_minute_' . $contentObjectAttribute->attribute( 'id' ) );
202             $second = $useSeconds ? $http->postVariable( $base . '_datetime_second_' . $contentObjectAttribute->attribute( 'id' ) ) : 0;
203
204             if ( $year == '' or
205                  $month == '' or
206                  $day == '' or
207                  $hour == '' or
208                  $minute == '' or
209                  ( $useSeconds and $second == '' ) )
210             {
211                 if ( !( $year == '' and
212                         $month == '' and
213                         $day == '' and
214                         $hour == '' and
215                         $minute == '' and
216                         ( !$useSeconds or $second == '' ) ) or
217                      $contentObjectAttribute->validateIsRequired() )
218                 {
219                     $contentObjectAttribute->setValidationError( ezpI18n::translate( 'kernel/classes/datatypes',
220                                                                          'Missing datetime input.' ) );
221                     return eZInputValidator::STATE_INVALID;
222                 }
223                 else
224                     return eZInputValidator::STATE_ACCEPTED;
225             }
226             else
227             {
228                 return $this->validateDateTimeHTTPInput( $day, $month, $year, $hour, $minute, $second, $contentObjectAttribute );
229             }
230         }
231         else
232             return eZInputValidator::STATE_INVALID;
233     }
234
235    /*!
236     Fetches the http post variables for collected information
237    */
238     function fetchCollectionAttributeHTTPInput( $collection, $collectionAttribute, $http, $base, $contentObjectAttribute )
239     {
240         $contentClassAttribute = $contentObjectAttribute->contentClassAttribute();
241         $useSeconds = ( $contentClassAttribute->attribute( self::USE_SECONDS_FIELD ) == 1 );
242
243         if ( $http->hasPostVariable( $base . '_datetime_year_' . $contentObjectAttribute->attribute( 'id' ) ) and
244              $http->hasPostVariable( $base . '_datetime_month_' . $contentObjectAttribute->attribute( 'id' ) ) and
245              $http->hasPostVariable( $base . '_datetime_day_' . $contentObjectAttribute->attribute( 'id' ) ) and
246              $http->hasPostVariable( $base . '_datetime_hour_' . $contentObjectAttribute->attribute( 'id' ) ) and
247              $http->hasPostVariable( $base . '_datetime_minute_' . $contentObjectAttribute->attribute( 'id' ) ) and
248              ( !$useSeconds or $http->hasPostVariable( $base . '_datetime_second_' . $contentObjectAttribute->attribute( 'id' ) ) ) )
249         {
250             $year   = $http->postVariable( $base . '_datetime_year_' . $contentObjectAttribute->attribute( 'id' ) );
251             $month  = $http->postVariable( $base . '_datetime_month_' . $contentObjectAttribute->attribute( 'id' ) );
252             $day    = $http->postVariable( $base . '_datetime_day_' . $contentObjectAttribute->attribute( 'id' ) );
253             $hour   = $http->postVariable( $base . '_datetime_hour_' . $contentObjectAttribute->attribute( 'id' ) );
254             $minute = $http->postVariable( $base . '_datetime_minute_' . $contentObjectAttribute->attribute( 'id' ) );
255             $second = $useSeconds ? $http->postVariable( $base . '_datetime_second_' . $contentObjectAttribute->attribute( 'id' ) ) : 0;
256
257             $dateTime = new eZDateTime();
258             $contentClassAttribute = $contentObjectAttribute->contentClassAttribute();
259             if ( ( $year == '' and $month == ''and $day == '' and
260                    $hour == '' and $minute == '' and ( !$useSeconds or $second == '' ) ) or
261                  !checkdate( $month, $day, $year ) or $year < 1970 )
262             {
263                     $dateTime->setTimeStamp( 0 );
264             }
265             else
266             {
267                 $dateTime->setMDYHMS( $month, $day, $year, $hour, $minute, $second );
268             }
269
270             $collectionAttribute->setAttribute( 'data_int', $dateTime->timeStamp() );
271             return true;
272         }
273         return false;
274     }
275
276     /*!
277      Returns the content.
278     */
279     function objectAttributeContent( $contentObjectAttribute )
280     {
281         $dateTime = new eZDateTime();
282         $stamp = $contentObjectAttribute->attribute( 'data_int' );
283         $dateTime->setTimeStamp( $stamp );
284         return $dateTime;
285     }
286
287     function isIndexable()
288     {
289         return true;
290     }
291
292     function isInformationCollector()
293     {
294         return true;
295     }
296
297     /*!
298      Returns the meta data used for storing search indeces.
299     */
300     function metaData( $contentObjectAttribute )
301     {
302         return $contentObjectAttribute->attribute( 'data_int' );
303     }
304     /*!
305      \return string representation of an contentobjectattribute data for simplified export
306
307     */
308     function toString( $contentObjectAttribute )
309     {
310         return $contentObjectAttribute->attribute( 'data_int' );
311     }
312
313     function fromString( $contentObjectAttribute, $string )
314     {
315         return $contentObjectAttribute->setAttribute( 'data_int', $string );
316     }
317
318     /*!
319      Set class attribute value for template version
320     */
321     function initializeClassAttribute( $classAttribute )
322     {
323         if ( $classAttribute->attribute( self::DEFAULT_FIELD ) == null )
324             $classAttribute->setAttribute( self::DEFAULT_FIELD, 0 );
325         $classAttribute->store();
326     }
327
328     function parseXML( $xmlText )
329     {
330         $dom = new DOMDocument;
331         $success = $dom->loadXML( $xmlText );
332         return $dom;
333     }
334
335     function classAttributeContent( $classAttribute )
336     {
337         $xmlText = $classAttribute->attribute( 'data_text5' );
338         if ( trim( $xmlText ) == '' )
339         {
340             $classAttrContent = eZDateTimeType::defaultClassAttributeContent();
341             return $classAttrContent;
342         }
343         $doc = eZDateTimeType::parseXML( $xmlText );
344         $root = $doc->documentElement;
345         $type = $root->getElementsByTagName( 'year' )->item( 0 );
346         if ( $type )
347         {
348             $content['year'] = $type->getAttribute( 'value' );
349         }
350         $type = $root->getElementsByTagName( 'month' )->item( 0 );
351         if ( $type )
352         {
353             $content['month'] = $type->getAttribute( 'value' );
354         }
355         $type = $root->getElementsByTagName( 'day' )->item( 0 );
356         if ( $type )
357         {
358             $content['day'] = $type->getAttribute( 'value' );
359         }
360         $type = $root->getElementsByTagName( 'hour' )->item( 0 );
361         if ( $type )
362         {
363             $content['hour'] = $type->getAttribute( 'value' );
364         }
365         $type = $root->getElementsByTagName( 'minute' )->item( 0 );
366         if ( $type )
367         {
368             $content['minute'] = $type->getAttribute( 'value' );
369         }
370         $type = $root->getElementsByTagName( 'second' )->item( 0 );
371         if ( $type )
372         {
373             $content['second'] = $type->getAttribute( 'value' );
374         }
375         return $content;
376     }
377
378     function defaultClassAttributeContent()
379     {
380         return array( 'year' => '',
381                       'month' => '',
382                       'day' => '',
383                       'hour' => '',
384                       'minute' => '',
385                       'second' => '' );
386     }
387
388     /*!
389      Sets the default value.
390     */
391     function initializeObjectAttribute( $contentObjectAttribute, $currentVersion, $originalContentObjectAttribute )
392     {
393         if ( $currentVersion != false )
394         {
395             $dataInt = $originalContentObjectAttribute->attribute( "data_int" );
396             $contentObjectAttribute->setAttribute( "data_int", $dataInt );
397         }
398         else
399         {
400             $contentClassAttribute = $contentObjectAttribute->contentClassAttribute();
401             $defaultType = $contentClassAttribute->attribute( self::DEFAULT_FIELD );
402             if ( $defaultType == self::DEFAULT_CURRENT_DATE )
403             {
404                 $contentObjectAttribute->setAttribute( "data_int", time() );
405             }
406             else if ( $defaultType == self::DEFAULT_ADJUSTMENT )
407             {
408                 $adjustments = $this->classAttributeContent( $contentClassAttribute );
409                 $value = new eZDateTime();
410                 $secondAdjustment = $contentClassAttribute->attribute( self::USE_SECONDS_FIELD ) == 1 ? $adjustments['second'] : 0;
411                 $value->adjustDateTime( $adjustments['hour'], $adjustments['minute'], $secondAdjustment, $adjustments['month'], $adjustments['day'], $adjustments['year'] );
412                 $contentObjectAttribute->setAttribute( "data_int", $value->timeStamp() );
413             }
414             else
415                 $contentObjectAttribute->setAttribute( "data_int", 0 );
416         }
417     }
418
419     function fetchClassAttributeHTTPInput( $http, $base, $classAttribute )
420     {
421         $default = $base . "_ezdatetime_default_" . $classAttribute->attribute( 'id' );
422         if ( $http->hasPostVariable( $default ) )
423         {
424             $defaultValue = $http->postVariable( $default );
425             $classAttribute->setAttribute( self::DEFAULT_FIELD,  $defaultValue );
426             if ( $defaultValue == self::DEFAULT_ADJUSTMENT )
427             {
428                 $doc = new DOMDocument( '1.0', 'utf-8' );
429                 $root = $doc->createElement( 'adjustment' );
430                 $contentList = eZDateTimeType::contentObjectArrayXMLMap();
431                 foreach ( $contentList as $key => $value )
432                 {
433                     $postValue = $http->postVariable( $base . '_ezdatetime_' . $value . '_' . $classAttribute->attribute( 'id' ) );
434                     unset( $elementType );
435                     $elementType = $doc->createElement( $key );
436                     $elementType->setAttribute( 'value', $postValue );
437                     $root->appendChild( $elementType );
438                 }
439                 $doc->appendChild( $root );
440                 $docText = $doc->saveXML();
441                 $classAttribute->setAttribute( self::ADJUSTMENT_FIELD , $docText );
442             }
443
444             $useSeconds = $base . "_ezdatetime_use_seconds_" . $classAttribute->attribute( 'id' );
445             $classAttribute->setAttribute( self::USE_SECONDS_FIELD, $http->hasPostVariable( $useSeconds ) ? 1 : 0 );
446         }
447
448         return true;
449     }
450
451     function contentObjectArrayXMLMap()
452     {
453         return array( 'year' => 'year',
454                       'month' => 'month',
455                       'day' => 'day',
456                       'hour' => 'hour',
457                       'minute' => 'minute',
458                       'second' => 'second' );
459     }
460
461
462     /*!
463      Returns the date.
464     */
465     function title( $contentObjectAttribute, $name = null )
466     {
467         $locale = eZLocale::instance();
468         $retVal = $contentObjectAttribute->attribute( "data_int" ) == 0 ? '' : $locale->formatDateTime( $contentObjectAttribute->attribute( "data_int" ) );
469         return $retVal;
470     }
471
472     function hasObjectAttributeContent( $contentObjectAttribute )
473     {
474         return $contentObjectAttribute->attribute( "data_int" ) != 0;
475     }
476
477     function sortKey( $contentObjectAttribute )
478     {
479         return (int)$contentObjectAttribute->attribute( 'data_int' );
480     }
481
482     function sortKeyType()
483     {
484         return 'int';
485     }
486
487     function serializeContentClassAttribute( $classAttribute, $attributeNode, $attributeParametersNode )
488     {
489         $dom = $attributeParametersNode->ownerDocument;
490         $defaultValue = $classAttribute->attribute( self::DEFAULT_FIELD );
491         $defaultValueNode = $dom->createElement( 'default-value' );
492
493         switch ( $defaultValue )
494         {
495             case self::DEFAULT_CURRENT_DATE:
496             {
497                 $defaultValueNode->setAttribute( 'type', 'current-date' );
498             } break;
499             case self::DEFAULT_ADJUSTMENT:
500             {
501                 $defaultValueNode->setAttribute( 'type', 'adjustment' );
502
503                 $adjustDOMValue = new DOMDocument( '1.0', 'utf-8' );
504                 $adjustValue = $classAttribute->attribute( self::ADJUSTMENT_FIELD );
505                 $success = $adjustDOMValue->loadXML( $adjustValue );
506
507                 if ( $success )
508                 {
509                     $adjustmentNode = $adjustDOMValue->getElementsByTagName( 'adjustment' )->item( 0 );
510
511                     if ( $adjustmentNode )
512                     {
513                         $importedAdjustmentNode = $dom->importNode( $adjustmentNode, true );
514                         $defaultValueNode->appendChild( $importedAdjustmentNode );
515                     }
516                 }
517             } break;
518             case self::DEFAULT_EMTPY:
519             {
520                 $defaultValueNode->setAttribute( 'type', 'empty' );
521             } break;
522             default:
523             {
524                 eZDebug::writeError( 'Unknown type of DateTime default value. Empty type used instead.',
525                                     'eZDateTimeType::serializeContentClassAttribute()' );
526                 $defaultValueNode->setAttribute( 'type', 'empty' );
527             } break;
528         }
529         $attributeParametersNode->appendChild( $defaultValueNode );
530
531         $useSeconds = $classAttribute->attribute( self::USE_SECONDS_FIELD );
532         $useSecondsNode = $dom->createElement( 'use-seconds' );
533         $useSecondsNode->appendChild( $dom->createTextNode( $useSeconds ) );
534         $attributeParametersNode->appendChild( $useSecondsNode );
535     }
536
537     function unserializeContentClassAttribute( $classAttribute, $attributeNode, $attributeParametersNode )
538     {
539         $defaultValue = '';
540         $defaultNode = $attributeParametersNode->getElementsByTagName( 'default-value' )->item( 0 );
541         if ( $defaultNode )
542         {
543             $defaultValue = strtolower( $defaultNode->getAttribute( 'type' ) );
544         }
545         switch ( $defaultValue )
546         {
547             case 'current-date':
548             {
549                 $classAttribute->setAttribute( self::DEFAULT_FIELD, self::DEFAULT_CURRENT_DATE );
550             } break;
551             case 'adjustment':
552             {
553                 $adjustmentValue = '';
554                 $adjustmentNode = $defaultNode->getElementsByTagName( 'adjustment' )->item( 0 );
555                 if ( $adjustmentNode )
556                 {
557                     $adjustmentDOMValue = new DOMDocument( '1.0', 'utf-8' );
558                     $importedAdjustmentNode = $adjustmentDOMValue->importNode( $adjustmentNode, true );
559                     $adjustmentDOMValue->appendChild( $importedAdjustmentNode );
560                     $adjustmentValue = $adjustmentDOMValue->saveXML();
561                 }
562
563                 $classAttribute->setAttribute( self::DEFAULT_FIELD, self::DEFAULT_ADJUSTMENT );
564                 $classAttribute->setAttribute( self::ADJUSTMENT_FIELD, $adjustmentValue );
565             } break;
566             case 'empty':
567             {
568                 $classAttribute->setAttribute( self::DEFAULT_FIELD, self::DEFAULT_EMTPY );
569             } break;
570             default:
571             {
572                 eZDebug::writeError( 'Type of DateTime default value is not set. Empty type used as default.',
573                                     'eZDateTimeType::unserializeContentClassAttribute()' );
574                 $classAttribute->setAttribute( self::DEFAULT_FIELD, self::DEFAULT_EMTPY );
575             } break;
576         }
577
578         $useSecondsNode = $attributeParametersNode->getElementsByTagName( 'use-seconds' )->item( 0 );
579         if ( $useSecondsNode && $useSecondsNode->textContent === '1' )
580         {
581             $classAttribute->setAttribute( self::USE_SECONDS_FIELD, 1 );
582         }
583     }
584
585     /*!
586      \return a DOM representation of the content object attribute
587     */
588     function serializeContentObjectAttribute( $package, $objectAttribute )
589     {
590         $node = $this->createContentObjectAttributeDOMNode( $objectAttribute );
591
592         $stamp = $objectAttribute->attribute( 'data_int' );
593
594         if ( $stamp !== null )
595         {
596             $dom = $node->ownerDocument;
597             $dateTimeNode = $dom->createElement( 'date_time' );
598             $dateTimeNode->appendChild( $dom->createTextNode( eZDateUtils::rfc1123Date( $stamp ) ) );
599             $node->appendChild( $dateTimeNode );
600         }
601         return $node;
602     }
603
604     function unserializeContentObjectAttribute( $package, $objectAttribute, $attributeNode )
605     {
606         $dateTimeNode = $attributeNode->getElementsByTagName( 'date_time' )->item( 0 );
607         if ( is_object( $dateTimeNode ) )
608         {
609             $timestamp = eZDateUtils::textToDate( $dateTimeNode->textContent );
610             $objectAttribute->setAttribute( 'data_int', $timestamp );
611         }
612     }
613
614     function supportsBatchInitializeObjectAttribute()
615     {
616         return true;
617     }
618
619     function batchInitializeObjectAttributeData( $classAttribute )
620     {
621         $defaultType = $classAttribute->attribute( self::DEFAULT_FIELD );
622
623         switch( $defaultType )
624         {
625             case self::DEFAULT_CURRENT_DATE:
626             {
627                 $default = time();
628             } break;
629
630             case self::DEFAULT_ADJUSTMENT:
631             {
632                 $adjustments = $this->classAttributeContent( $classAttribute );
633                 $value = new eZDateTime();
634                 $secondAdjustment = $classAttribute->attribute( self::USE_SECONDS_FIELD ) == 1 ? $adjustments['second'] : 0;
635                 $value->adjustDateTime( $adjustments['hour'], $adjustments['minute'], $secondAdjustment, $adjustments['month'], $adjustments['day'], $adjustments['year'] );
636
637                 $default = $value->timeStamp();
638             } break;
639
640             default:
641             {
642                 $default = 0;
643             }
644         }
645
646         return array( 'data_int' => $default, 'sort_key_int' => $default );
647     }
648 }
649
650 eZDataType::register( eZDateTimeType::DATA_TYPE_STRING, "eZDateTimeType" );
651
652 ?>