- Fixed #16160: Call to undefined function ezi18n()
[tinyz:tinyz.git] / kernel / classes / datatypes / eztime / eztimetype.php
1 <?php
2 //
3 // Definition of eZTimeType 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 eZTimeType eztimetype.php
32   \ingroup eZDatatype
33   \brief Stores a time value
34
35 */
36
37 class eZTimeType extends eZDataType
38 {
39     const DATA_TYPE_STRING = "eztime";
40     const DEFAULT_FIELD = 'data_int1';
41     const USE_SECONDS_FIELD = 'data_int2';
42     const DEFAULT_EMTPY = 0;
43     const DEFAULT_CURRENT_DATE = 1;
44
45     function eZTimeType()
46     {
47         $this->eZDataType( self::DATA_TYPE_STRING, ezpI18n::translate( 'kernel/classes/datatypes', "Time", 'Datatype name' ),
48                            array( 'serialize_supported' => true ) );
49     }
50
51     /*!
52      Private method only for use inside this class
53     */
54     function validateTimeHTTPInput( $hours, $minute, $second, $contentObjectAttribute )
55     {
56         $state = eZDateTimeValidator::validateTime( $hours, $minute, $second );
57         if ( $state == eZInputValidator::STATE_INVALID )
58         {
59             $contentObjectAttribute->setValidationError( ezpI18n::translate( 'kernel/classes/datatypes',
60                                                                  'Invalid time.' ) );
61             return eZInputValidator::STATE_INVALID;
62         }
63         return $state;
64     }
65
66     function validateObjectAttributeHTTPInput( $http, $base, $contentObjectAttribute )
67     {
68         $classAttribute = $contentObjectAttribute->contentClassAttribute();
69         $useSeconds = ( $classAttribute->attribute( self::USE_SECONDS_FIELD ) == 1 );
70
71         if ( $http->hasPostVariable( $base . '_time_hour_' . $contentObjectAttribute->attribute( 'id' ) ) and
72              $http->hasPostVariable( $base . '_time_minute_' . $contentObjectAttribute->attribute( 'id' ) ) and
73              ( !$useSeconds or $http->hasPostVariable( $base . '_time_second_' . $contentObjectAttribute->attribute( 'id' ) ) ) )
74         {
75             $hours  = $http->postVariable( $base . '_time_hour_' . $contentObjectAttribute->attribute( 'id' ) );
76             $minute = $http->postVariable( $base . '_time_minute_' . $contentObjectAttribute->attribute( 'id' ) );
77             $second = $useSeconds ? $http->postVariable( $base . '_time_second_' . $contentObjectAttribute->attribute( 'id' ) ) : 0;
78
79             if ( $hours == '' or $minute == '' or ( $useSeconds and $second == '' ) )
80             {
81                 if ( !( $hours == '' and
82                         $minute == '' and
83                         ( !$useSeconds or $second == '' ) ) or
84                      ( !$classAttribute->attribute( 'is_information_collector' ) and
85                        $contentObjectAttribute->validateIsRequired() ) )
86                 {
87                     $contentObjectAttribute->setValidationError( ezpI18n::translate( 'kernel/classes/datatypes',
88                                                                          'Time input required.' ) );
89                     return eZInputValidator::STATE_INVALID;
90                 }
91                 else
92                     return eZInputValidator::STATE_ACCEPTED;
93             }
94             else
95             {
96                 return $this->validateTimeHTTPInput( $hours, $minute, $second, $contentObjectAttribute );
97             }
98         }
99         else if ( !$classAttribute->attribute( 'is_information_collector' ) and $contentObjectAttribute->validateIsRequired() )
100         {
101             $contentObjectAttribute->setValidationError( ezpI18n::translate( 'kernel/classes/datatypes', 'Time input required.' ) );
102             return eZInputValidator::STATE_INVALID;
103         }
104         else
105             return eZInputValidator::STATE_ACCEPTED;
106     }
107
108     function fetchObjectAttributeHTTPInput( $http, $base, $contentObjectAttribute )
109     {
110         $classAttribute = $contentObjectAttribute->contentClassAttribute();
111         $useSeconds = ( $classAttribute->attribute( self::USE_SECONDS_FIELD ) == 1 );
112
113         if ( $http->hasPostVariable( $base . '_time_hour_' . $contentObjectAttribute->attribute( 'id' ) ) and
114              $http->hasPostVariable( $base . '_time_minute_' . $contentObjectAttribute->attribute( 'id' ) ) and
115              ( !$useSeconds or $http->hasPostVariable( $base . '_time_second_' . $contentObjectAttribute->attribute( 'id' ) ) ) )
116         {
117             $hours  = $http->postVariable( $base . '_time_hour_' . $contentObjectAttribute->attribute( 'id' ) );
118             $minute = $http->postVariable( $base . '_time_minute_' . $contentObjectAttribute->attribute( 'id' ) );
119             $second = $useSeconds ? $http->postVariable( $base . '_time_second_' . $contentObjectAttribute->attribute( 'id' ) ) : 0;
120
121             if ( $hours != '' or $minute != '' or ( $useSeconds and $second != '' ) )
122             {
123                 $time = new eZTime();
124                 $time->setHMS( $hours, $minute, $second );
125                 $contentObjectAttribute->setAttribute( 'data_int', $time->timeOfDay() );
126             }
127             else
128             {
129                 $contentObjectAttribute->setAttribute( 'data_int', null );
130             }
131             return true;
132         }
133         return false;
134     }
135
136     function validateCollectionAttributeHTTPInput( $http, $base, $contentObjectAttribute )
137     {
138         $classAttribute = $contentObjectAttribute->contentClassAttribute();
139         $useSeconds = ( $classAttribute->attribute( self::USE_SECONDS_FIELD ) == 1 );
140
141         if ( $http->hasPostVariable( $base . '_time_hour_' . $contentObjectAttribute->attribute( 'id' ) ) and
142              $http->hasPostVariable( $base . '_time_minute_' . $contentObjectAttribute->attribute( 'id' ) ) and
143              ( !$useSeconds or $http->hasPostVariable( $base . '_time_second_' . $contentObjectAttribute->attribute( 'id' ) ) ) )
144         {
145             $hours  = $http->postVariable( $base . '_time_hour_' . $contentObjectAttribute->attribute( 'id' ) );
146             $minute = $http->postVariable( $base . '_time_minute_' . $contentObjectAttribute->attribute( 'id' ) );
147             $second = $useSeconds ? $http->postVariable( $base . '_time_second_' . $contentObjectAttribute->attribute( 'id' ) ) : 0;
148
149             if ( $hours == '' or $minute == '' or ( $useSeconds and $second == '' ) )
150             {
151                 if ( !( $hours == '' and $minute == '' and ( !$useSeconds or $second == '' ) ) or
152                      $contentObjectAttribute->validateIsRequired() )
153                 {
154                     $contentObjectAttribute->setValidationError( ezpI18n::translate( 'kernel/classes/datatypes',
155                                                                          'Time input required.' ) );
156                     return eZInputValidator::STATE_INVALID;
157                 }
158                 else
159                     return eZInputValidator::STATE_ACCEPTED;
160             }
161             else
162             {
163                 return $this->validateTimeHTTPInput( $hours, $minute, $second, $contentObjectAttribute );
164             }
165         }
166         else
167             return eZInputValidator::STATE_INVALID;
168     }
169
170    /*!
171     Fetches the http post variables for collected information
172    */
173     function fetchCollectionAttributeHTTPInput( $collection, $collectionAttribute, $http, $base, $contentObjectAttribute )
174     {
175         $classAttribute = $contentObjectAttribute->contentClassAttribute();
176         $useSeconds = ( $classAttribute->attribute( self::USE_SECONDS_FIELD ) == 1 );
177
178         if ( $http->hasPostVariable( $base . '_time_hour_' . $contentObjectAttribute->attribute( 'id' ) ) and
179              $http->hasPostVariable( $base . '_time_minute_' . $contentObjectAttribute->attribute( 'id' ) ) and
180              ( !$useSeconds or $http->hasPostVariable( $base . '_time_second_' . $contentObjectAttribute->attribute( 'id' ) ) ) )
181         {
182             $hours  = $http->postVariable( $base . '_time_hour_' . $contentObjectAttribute->attribute( 'id' ) );
183             $minute = $http->postVariable( $base . '_time_minute_' . $contentObjectAttribute->attribute( 'id' ) );
184             $second = $useSeconds ? $http->postVariable( $base . '_time_second_' . $contentObjectAttribute->attribute( 'id' ) ) : 0;
185
186             if ( $hours != '' or $minute != '' or ( $useSeconds and $second != '' ) )
187             {
188                 $time = new eZTime();
189                 $time->setHMS( $hours, $minute, $second );
190                 $collectionAttribute->setAttribute( 'data_int', $time->timeOfDay() );
191             }
192             else
193                 $collectionAttribute->setAttribute( 'data_int', null );
194             return true;
195         }
196         return false;
197     }
198
199     /*!
200      Returns the content.
201     */
202     function objectAttributeContent( $contentObjectAttribute )
203     {
204         $stamp = $contentObjectAttribute->attribute( 'data_int' );
205
206         if ( $stamp !== null )
207         {
208             $time = new eZTime( $stamp );
209
210         }
211         else
212             $time = array( 'timestamp' => '',
213                            'time_of_day' => '',
214                            'hour' => '',
215                            'minute' => '',
216                            'second' => '',
217                            'is_valid' => false );
218         return $time;
219     }
220
221     function sortKey( $contentObjectAttribute )
222     {
223         $timestamp = $contentObjectAttribute->attribute( 'data_int' );
224         if ( $timestamp !== null )
225         {
226             $time = new eZTime( $timestamp );
227             return $time->timeOfDay();
228         }
229         else
230             return 0;
231     }
232
233     function sortKeyType()
234     {
235         return 'int';
236     }
237
238     /*!
239      \return string representation of an contentobjectattribute data for simplified export
240
241     */
242     function toString( $contentObjectAttribute )
243     {
244         $time = $contentObjectAttribute->attribute( 'content' );
245         if ( is_object( $time ) )
246         {
247             return $time->attribute( 'hour' ) . ':' . $time->attribute( 'minute' ) . ':' . $time->attribute( 'second' );
248         }
249         else
250             return '';
251     }
252
253     function fromString( $contentObjectAttribute, $string )
254     {
255         if ( $string != '' )
256         {
257             list( $hour, $minute, $second ) = explode( ':', $string );
258             if ( $hour == '' || $minute == '' )
259                 return false;
260             if ( $second == '' )
261             {
262                $second = 0;
263            }
264             $time = new eZTime();
265             $time->setHMS( $hour, $minute, $second );
266             $contentObjectAttribute->setAttribute( 'data_int', $time->timeOfDay() );
267         }
268
269         return true;
270     }
271
272     function isInformationCollector()
273     {
274         return true;
275     }
276
277     /*!
278      Set class attribute value for template version
279     */
280     function initializeClassAttribute( $classAttribute )
281     {
282         if ( $classAttribute->attribute( self::DEFAULT_FIELD ) == null )
283             $classAttribute->setAttribute( self::DEFAULT_FIELD, 0 );
284         $classAttribute->store();
285     }
286
287     /*!
288      Sets the default value.
289     */
290     function initializeObjectAttribute( $contentObjectAttribute, $currentVersion, $originalContentObjectAttribute )
291     {
292         if ( $currentVersion != false )
293         {
294             $dataInt = $originalContentObjectAttribute->attribute( 'data_int' );
295             $contentObjectAttribute->setAttribute( 'data_int', $dataInt );
296         }
297         else
298         {
299             $contentClassAttribute = $contentObjectAttribute->contentClassAttribute();
300             $defaultType = $contentClassAttribute->attribute( self::DEFAULT_FIELD );
301
302             if ( $defaultType == 1 )
303             {
304                 $time = new eZTime();
305                 $contentObjectAttribute->setAttribute( 'data_int', $time->timeOfDay() );
306             }
307         }
308     }
309
310     function fetchClassAttributeHTTPInput( $http, $base, $classAttribute )
311     {
312         $default = $base . "_eztime_default_" . $classAttribute->attribute( 'id' );
313         if ( $http->hasPostVariable( $default ) )
314         {
315             $defaultValue = $http->postVariable( $default );
316             $classAttribute->setAttribute( self::DEFAULT_FIELD,  $defaultValue );
317
318             $useSeconds = $base . "_eztime_use_seconds_" . $classAttribute->attribute( 'id' );
319             $classAttribute->setAttribute( self::USE_SECONDS_FIELD, $http->hasPostVariable( $useSeconds ) ? 1 : 0 );
320
321             return true;
322         }
323         return false;
324     }
325
326     /*!
327      Returns the meta data used for storing search indeces.
328     */
329     function metaData( $contentObjectAttribute )
330     {
331         return $contentObjectAttribute->attribute( 'data_int' );
332     }
333
334     /*!
335      Returns the date.
336     */
337     function title( $contentObjectAttribute, $name = null )
338     {
339         $timestamp = $contentObjectAttribute->attribute( 'data_int' );
340         $locale = eZLocale::instance();
341
342         if ( $timestamp !== null )
343         {
344             $time = new eZTime( $timestamp );
345             return $locale->formatTime( $time->timeStamp() );
346         }
347         return '';
348     }
349
350     function hasObjectAttributeContent( $contentObjectAttribute )
351     {
352         return $contentObjectAttribute->attribute( 'data_int' ) !== null;
353     }
354
355     function serializeContentClassAttribute( $classAttribute, $attributeNode, $attributeParametersNode )
356     {
357         $dom = $attributeParametersNode->ownerDocument;
358
359         $defaultValue = $classAttribute->attribute( self::DEFAULT_FIELD );
360         $defaultValueNode = $dom->createElement( 'default-value' );
361         switch ( $defaultValue )
362         {
363             case self::DEFAULT_EMTPY:
364                 $defaultValueNode->setAttribute( 'type', 'empty' );
365                 break;
366
367             case self::DEFAULT_CURRENT_DATE:
368                 $defaultValueNode->setAttribute( 'type', 'current-date' );
369                 break;
370         }
371         $attributeParametersNode->appendChild( $defaultValueNode );
372
373         $useSeconds = $classAttribute->attribute( self::USE_SECONDS_FIELD );
374         $useSecondsNode = $dom->createElement( 'use-seconds' );
375         $useSecondsNode->appendChild( $dom->createTextNode( $useSeconds ) );
376         $attributeParametersNode->appendChild( $useSecondsNode );
377     }
378
379     function unserializeContentClassAttribute( $classAttribute, $attributeNode, $attributeParametersNode )
380     {
381         $defaultNode = $attributeParametersNode->getElementsByTagName( 'default-value' )->item( 0 );
382         $defaultValue = strtolower( $defaultNode->getAttribute( 'type' ) );
383         switch ( $defaultValue )
384         {
385             case 'empty':
386             {
387                 $classAttribute->setAttribute( self::DEFAULT_FIELD, self::DEFAULT_EMTPY );
388             } break;
389             case 'current-date':
390             {
391                 $classAttribute->setAttribute( self::DEFAULT_FIELD, self::DEFAULT_CURRENT_DATE );
392             } break;
393         }
394
395         $useSecondsNode = $attributeParametersNode->getElementsByTagName( 'use-seconds' )->item( 0 );
396         if ( $useSecondsNode && $useSecondsNode->textContent === '1'  )
397         {
398             $classAttribute->setAttribute( self::USE_SECONDS_FIELD, 1 );
399         }
400     }
401
402     /*!
403      \param package
404      \param content attribute
405
406      \return a DOM representation of the content object attribute
407     */
408     function serializeContentObjectAttribute( $package, $objectAttribute )
409     {
410         $node = $this->createContentObjectAttributeDOMNode( $objectAttribute );
411
412         $stamp = $objectAttribute->attribute( 'data_int' );
413
414         if ( $stamp !== null )
415         {
416             $dom = $node->ownerDocument;
417             $dateNode = $dom->createElement( 'time' );
418             $dateNode->appendChild( $dom->createTextNode( eZDateUtils::rfc1123Date( $stamp ) ) );
419             $node->appendChild( $dateNode );
420         }
421         return $node;
422     }
423
424     /*!
425      \param package
426      \param contentobject attribute object
427      \param ezdomnode object
428     */
429     function unserializeContentObjectAttribute( $package, $objectAttribute, $attributeNode )
430     {
431         $timeNode = $attributeNode->getElementsByTagName( 'time' )->item( 0 );
432         if ( is_object( $timeNode ) )
433         {
434             $timestamp = eZDateUtils::textToDate( $timeNode->textContent );
435             $timeOfDay = null;
436             if ( $timestamp >= 0 )
437             {
438                 $time = new eZTime( $timestamp );
439                 $timeOfDay = $time->timeOfDay();
440             }
441             $objectAttribute->setAttribute( 'data_int', $timeOfDay );
442         }
443     }
444
445     function supportsBatchInitializeObjectAttribute()
446     {
447         return true;
448     }
449
450     function batchInitializeObjectAttributeData( $classAttribute )
451     {
452         $defaultType = $classAttribute->attribute( self::DEFAULT_FIELD );
453
454         if ( $defaultType == 1 )
455         {
456             $time = new eZTime();
457             $default = $time->timeOfDay();
458             return array( 'data_int' => $default, 'sort_key_int' => $default );
459         }
460
461         return array();
462     }
463 }
464
465 eZDataType::register( eZTimeType::DATA_TYPE_STRING, "eZTimeType" );
466
467 ?>