- Fixed #16160: Call to undefined function ezi18n()
[tinyz:tinyz.git] / kernel / classes / datatypes / ezstring / ezstringtype.php
1 <?php
2 //
3 // Definition of eZStringType class
4 //
5 // Created on: <16-Apr-2002 11:08:14 amos>
6 //
7 // ## BEGIN COPYRIGHT, LICENSE AND WARRANTY NOTICE ##
8 // SOFTWARE NAME: eZ Publish
9 // SOFTWARE RELEASE: 4.1.x
10 // COPYRIGHT NOTICE: Copyright (C) 1999-2010 eZ Systems AS
11 // SOFTWARE LICENSE: GNU General Public License v2.0
12 // NOTICE: >
13 //   This program is free software; you can redistribute it and/or
14 //   modify it under the terms of version 2.0  of the GNU General
15 //   Public License as published by the Free Software Foundation.
16 //
17 //   This program is distributed in the hope that it will be useful,
18 //   but WITHOUT ANY WARRANTY; without even the implied warranty of
19 //   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20 //   GNU General Public License for more details.
21 //
22 //   You should have received a copy of version 2.0 of the GNU General
23 //   Public License along with this program; if not, write to the Free
24 //   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
25 //   MA 02110-1301, USA.
26 //
27 //
28 // ## END COPYRIGHT, LICENSE AND WARRANTY NOTICE ##
29 //
30
31 /*!
32   \class eZStringType ezstringtype.php
33   \ingroup eZDatatype
34   \brief A content datatype which handles text lines
35
36   It provides the functionality to work as a text line and handles
37   class definition input, object definition input and object viewing.
38
39   It uses the spare field data_text in a content object attribute for storing
40   the attribute data.
41
42 */
43
44
45
46 class eZStringType extends eZDataType
47 {
48     const DATA_TYPE_STRING = 'ezstring';
49     const MAX_LEN_FIELD = 'data_int1';
50     const MAX_LEN_VARIABLE = '_ezstring_max_string_length_';
51     const DEFAULT_STRING_FIELD = "data_text1";
52     const DEFAULT_STRING_VARIABLE = "_ezstring_default_value_";
53
54     /*!
55      Initializes with a string id and a description.
56     */
57     function eZStringType()
58     {
59         $this->eZDataType( self::DATA_TYPE_STRING, ezpI18n::translate( 'kernel/classes/datatypes', 'Text line', 'Datatype name' ),
60                            array( 'serialize_supported' => true,
61                                   'object_serialize_map' => array( 'data_text' => 'text' ) ) );
62         $this->MaxLenValidator = new eZIntegerValidator();
63     }
64
65     /*!
66      Sets the default value.
67     */
68     function initializeObjectAttribute( $contentObjectAttribute, $currentVersion, $originalContentObjectAttribute )
69     {
70         if ( $currentVersion != false )
71         {
72 //             $contentObjectAttributeID = $contentObjectAttribute->attribute( "id" );
73 //             $currentObjectAttribute = eZContentObjectAttribute::fetch( $contentObjectAttributeID,
74 //                                                                         $currentVersion );
75             $dataText = $originalContentObjectAttribute->attribute( "data_text" );
76             $contentObjectAttribute->setAttribute( "data_text", $dataText );
77         }
78         else
79         {
80             $contentClassAttribute = $contentObjectAttribute->contentClassAttribute();
81             $default = $contentClassAttribute->attribute( 'data_text1' );
82             if ( $default !== '' && $default !== NULL )
83             {
84                 $contentObjectAttribute->setAttribute( 'data_text', $default );
85             }
86         }
87     }
88
89     /*
90      Private method, only for using inside this class.
91     */
92     function validateStringHTTPInput( $data, $contentObjectAttribute, $classAttribute )
93     {
94         $maxLen = $classAttribute->attribute( self::MAX_LEN_FIELD );
95         $textCodec = eZTextCodec::instance( false );
96         if ( $textCodec->strlen( $data ) > $maxLen and
97              $maxLen > 0 )
98         {
99             $contentObjectAttribute->setValidationError( ezpI18n::translate( 'kernel/classes/datatypes',
100                                                                  'The input text is too long. The maximum number of characters allowed is %1.' ),
101                                                          $maxLen );
102             return eZInputValidator::STATE_INVALID;
103         }
104         return eZInputValidator::STATE_ACCEPTED;
105     }
106
107
108     function validateObjectAttributeHTTPInput( $http, $base, $contentObjectAttribute )
109     {
110         $classAttribute = $contentObjectAttribute->contentClassAttribute();
111
112         if ( $http->hasPostVariable( $base . '_ezstring_data_text_' . $contentObjectAttribute->attribute( 'id' ) ) )
113         {
114             $data = $http->postVariable( $base . '_ezstring_data_text_' . $contentObjectAttribute->attribute( 'id' ) );
115
116             if ( $data == "" )
117             {
118                 if ( !$classAttribute->attribute( 'is_information_collector' ) and
119                      $contentObjectAttribute->validateIsRequired() )
120                 {
121                     $contentObjectAttribute->setValidationError( ezpI18n::translate( 'kernel/classes/datatypes',
122                                                                          'Input required.' ) );
123                     return eZInputValidator::STATE_INVALID;
124                 }
125             }
126             else
127             {
128                 return $this->validateStringHTTPInput( $data, $contentObjectAttribute, $classAttribute );
129             }
130         }
131         else if ( !$classAttribute->attribute( 'is_information_collector' ) and $contentObjectAttribute->validateIsRequired() )
132         {
133             $contentObjectAttribute->setValidationError( ezpI18n::translate( 'kernel/classes/datatypes', 'Input required.' ) );
134             return eZInputValidator::STATE_INVALID;
135         }
136         return eZInputValidator::STATE_ACCEPTED;
137     }
138
139     function validateCollectionAttributeHTTPInput( $http, $base, $contentObjectAttribute )
140     {
141         if ( $http->hasPostVariable( $base . '_ezstring_data_text_' . $contentObjectAttribute->attribute( 'id' ) ) )
142         {
143             $data = $http->postVariable( $base . '_ezstring_data_text_' . $contentObjectAttribute->attribute( 'id' ) );
144             $classAttribute = $contentObjectAttribute->contentClassAttribute();
145
146             if ( $data == "" )
147             {
148                 if ( $contentObjectAttribute->validateIsRequired() )
149                 {
150                     $contentObjectAttribute->setValidationError( ezpI18n::translate( 'kernel/classes/datatypes',
151                                                                          'Input required.' ) );
152                     return eZInputValidator::STATE_INVALID;
153                 }
154                 else
155                     return eZInputValidator::STATE_ACCEPTED;
156             }
157             else
158             {
159                 return $this->validateStringHTTPInput( $data, $contentObjectAttribute, $classAttribute );
160             }
161         }
162         else
163             return eZInputValidator::STATE_INVALID;
164     }
165
166     /*!
167      Fetches the http post var string input and stores it in the data instance.
168     */
169     function fetchObjectAttributeHTTPInput( $http, $base, $contentObjectAttribute )
170     {
171         if ( $http->hasPostVariable( $base . '_ezstring_data_text_' . $contentObjectAttribute->attribute( 'id' ) ) )
172         {
173             $data = $http->postVariable( $base . '_ezstring_data_text_' . $contentObjectAttribute->attribute( 'id' ) );
174             $contentObjectAttribute->setAttribute( 'data_text', $data );
175             return true;
176         }
177         return false;
178     }
179
180     /*!
181      Fetches the http post variables for collected information
182     */
183     function fetchCollectionAttributeHTTPInput( $collection, $collectionAttribute, $http, $base, $contentObjectAttribute )
184     {
185         if ( $http->hasPostVariable( $base . "_ezstring_data_text_" . $contentObjectAttribute->attribute( "id" ) ) )
186         {
187             $dataText = $http->postVariable( $base . "_ezstring_data_text_" . $contentObjectAttribute->attribute( "id" ) );
188             $collectionAttribute->setAttribute( 'data_text', $dataText );
189             return true;
190         }
191         return false;
192     }
193
194     /*!
195      Does nothing since it uses the data_text field in the content object attribute.
196      See fetchObjectAttributeHTTPInput for the actual storing.
197     */
198     function storeObjectAttribute( $attribute )
199     {
200     }
201
202     /*!
203      Simple string insertion is supported.
204     */
205     function isSimpleStringInsertionSupported()
206     {
207         return true;
208     }
209
210     /*!
211      Inserts the string \a $string in the \c 'data_text' database field.
212     */
213     function insertSimpleString( $object, $objectVersion, $objectLanguage,
214                                  $objectAttribute, $string,
215                                  &$result )
216     {
217         $result = array( 'errors' => array(),
218                          'require_storage' => true );
219         $objectAttribute->setContent( $string );
220         $objectAttribute->setAttribute( 'data_text', $string );
221         return true;
222     }
223
224     function storeClassAttribute( $attribute, $version )
225     {
226     }
227
228     function storeDefinedClassAttribute( $attribute )
229     {
230     }
231
232     function validateClassAttributeHTTPInput( $http, $base, $classAttribute )
233     {
234         $maxLenName = $base . self::MAX_LEN_VARIABLE . $classAttribute->attribute( 'id' );
235         if ( $http->hasPostVariable( $maxLenName ) )
236         {
237             $maxLenValue = $http->postVariable( $maxLenName );
238             $maxLenValue = str_replace(" ", "", $maxLenValue );
239             if( ( $maxLenValue == "" ) ||  ( $maxLenValue == 0 ) )
240             {
241                 $maxLenValue = 0;
242                 $http->setPostVariable( $maxLenName, $maxLenValue );
243                 return eZInputValidator::STATE_ACCEPTED;
244             }
245             else
246             {
247                 $this->MaxLenValidator->setRange( 1, false );
248                 return $this->MaxLenValidator->validate( $maxLenValue );
249             }
250         }
251         return eZInputValidator::STATE_INVALID;
252     }
253
254     function fixupClassAttributeHTTPInput( $http, $base, $classAttribute )
255     {
256         $maxLenName = $base . self::MAX_LEN_VARIABLE . $classAttribute->attribute( 'id' );
257         if ( $http->hasPostVariable( $maxLenName ) )
258         {
259             $maxLenValue = $http->postVariable( $maxLenName );
260             $this->MaxLenValidator->setRange( 1, false );
261             $maxLenValue = $this->MaxLenValidator->fixup( $maxLenValue );
262             $http->setPostVariable( $maxLenName, $maxLenValue );
263         }
264     }
265
266     function fetchClassAttributeHTTPInput( $http, $base, $classAttribute )
267     {
268         $maxLenName = $base . self::MAX_LEN_VARIABLE . $classAttribute->attribute( 'id' );
269         $defaultValueName = $base . self::DEFAULT_STRING_VARIABLE . $classAttribute->attribute( 'id' );
270         if ( $http->hasPostVariable( $maxLenName ) )
271         {
272             $maxLenValue = $http->postVariable( $maxLenName );
273             $classAttribute->setAttribute( self::MAX_LEN_FIELD, $maxLenValue );
274         }
275         if ( $http->hasPostVariable( $defaultValueName ) )
276         {
277             $defaultValueValue = $http->postVariable( $defaultValueName );
278
279             $classAttribute->setAttribute( self::DEFAULT_STRING_FIELD, $defaultValueValue );
280         }
281         return true;
282     }
283
284     /*!
285      Returns the content.
286     */
287     function objectAttributeContent( $contentObjectAttribute )
288     {
289         return $contentObjectAttribute->attribute( 'data_text' );
290     }
291
292     /*!
293      Returns the meta data used for storing search indeces.
294     */
295     function metaData( $contentObjectAttribute )
296     {
297         return $contentObjectAttribute->attribute( 'data_text' );
298     }
299     /*!
300      \return string representation of an contentobjectattribute data for simplified export
301
302     */
303     function toString( $contentObjectAttribute )
304     {
305         return $contentObjectAttribute->attribute( 'data_text' );
306     }
307
308     function fromString( $contentObjectAttribute, $string )
309     {
310         return $contentObjectAttribute->setAttribute( 'data_text', $string );
311     }
312
313
314     /*!
315      Returns the content of the string for use as a title
316     */
317     function title( $contentObjectAttribute, $name = null )
318     {
319         return $contentObjectAttribute->attribute( 'data_text' );
320     }
321
322     function hasObjectAttributeContent( $contentObjectAttribute )
323     {
324         return trim( $contentObjectAttribute->attribute( 'data_text' ) ) != '';
325     }
326
327     function isIndexable()
328     {
329         return true;
330     }
331
332     function isInformationCollector()
333     {
334         return true;
335     }
336
337     function sortKey( $contentObjectAttribute )
338     {
339         $trans = eZCharTransform::instance();
340         return $trans->transformByGroup( $contentObjectAttribute->attribute( 'data_text' ), 'lowercase' );
341     }
342
343     function sortKeyType()
344     {
345         return 'string';
346     }
347
348     function serializeContentClassAttribute( $classAttribute, $attributeNode, $attributeParametersNode )
349     {
350         $maxLength = $classAttribute->attribute( self::MAX_LEN_FIELD );
351         $defaultString = $classAttribute->attribute( self::DEFAULT_STRING_FIELD );
352         $dom = $attributeParametersNode->ownerDocument;
353         $maxLengthNode = $dom->createElement( 'max-length' );
354         $maxLengthNode->appendChild( $dom->createTextNode( $maxLength ) );
355         $attributeParametersNode->appendChild( $maxLengthNode );
356         $defaultStringNode = $dom->createElement( 'default-string' );
357         if ( $defaultString )
358         {
359             $defaultStringNode->appendChild( $dom->createTextNode( $defaultString ) );
360         }
361         $attributeParametersNode->appendChild( $defaultStringNode );
362     }
363
364     function unserializeContentClassAttribute( $classAttribute, $attributeNode, $attributeParametersNode )
365     {
366         $maxLength = $attributeParametersNode->getElementsByTagName( 'max-length' )->item( 0 )->textContent;
367         $defaultString = $attributeParametersNode->getElementsByTagName( 'default-string' )->item( 0 )->textContent;
368         $classAttribute->setAttribute( self::MAX_LEN_FIELD, $maxLength );
369         $classAttribute->setAttribute( self::DEFAULT_STRING_FIELD, $defaultString );
370     }
371
372     function diff( $old, $new, $options = false )
373     {
374         $diff = new eZDiff();
375         $diff->setDiffEngineType( $diff->engineType( 'text' ) );
376         $diff->initDiffEngine();
377         $diffObject = $diff->diff( $old->content(), $new->content() );
378         return $diffObject;
379     }
380
381     function supportsBatchInitializeObjectAttribute()
382     {
383         return true;
384     }
385
386     function batchInitializeObjectAttributeData( $classAttribute )
387     {
388         $default = $classAttribute->attribute( 'data_text1' );
389         if ( $default !== '' && $default !== NULL )
390         {
391             $db = eZDB::instance();
392             $default = "'" . $db->escapeString( $default ) . "'";
393             $trans = eZCharTransform::instance();
394             $lowerCasedDefault = $trans->transformByGroup( $default, 'lowercase' );
395             return array( 'data_text' => $default, 'sort_key_string' => $lowerCasedDefault );
396         }
397
398         return array();
399     }
400
401     /// \privatesection
402     /// The max len validator
403     public $MaxLenValidator;
404 }
405
406 eZDataType::register( eZStringType::DATA_TYPE_STRING, 'eZStringType' );
407
408 ?>