- Fixed #16160: Call to undefined function ezi18n()
[tinyz:tinyz.git] / kernel / classes / datatypes / ezoption / ezoptiontype.php
1 <?php
2 //
3 // Definition of eZOptionType class
4 //
5 //Created on: <28-Jun-2002 11:12:51 sp>
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 eZOptionType ezoptiontype.php
33   \ingroup eZDatatype
34   \brief Stores option values
35
36 */
37
38 class eZOptionType extends eZDataType
39 {
40     const DEFAULT_NAME_VARIABLE = "_ezoption_default_name_";
41
42     const DATA_TYPE_STRING = "ezoption";
43
44     function eZOptionType()
45     {
46         $this->eZDataType( self::DATA_TYPE_STRING, ezpI18n::translate( 'kernel/classes/datatypes', "Option", 'Datatype name' ),
47                            array( 'serialize_supported' => true ) );
48     }
49
50     function validateCollectionAttributeHTTPInput( $http, $base, $contentObjectAttribute )
51     {
52         $classAttribute = $contentObjectAttribute->contentClassAttribute();
53         if ( $http->hasPostVariable( $base . "_data_option_value_" . $contentObjectAttribute->attribute( "id" ) ) )
54         {
55             $value = $http->hasPostVariable( $base . "_data_option_value_" . $contentObjectAttribute->attribute( "id" ) );
56
57             if ( $contentObjectAttribute->validateIsRequired() and !$value )
58             {
59                 $contentObjectAttribute->setValidationError( ezpI18n::translate( 'kernel/classes/datatypes',
60                                                                      'Input required.' ) );
61                 return eZInputValidator::STATE_INVALID;
62             }
63         }
64         else
65         {
66             $contentObjectAttribute->setValidationError( ezpI18n::translate( 'kernel/classes/datatypes',
67                                                                  'Input required.' ) );
68             return eZInputValidator::STATE_INVALID;
69         }
70     }
71
72     /*!
73      Validates the input and returns true if the input was
74      valid for this datatype.
75     */
76     function validateObjectAttributeHTTPInput( $http, $base, $contentObjectAttribute )
77     {
78         $count = 0;
79         $classAttribute = $contentObjectAttribute->contentClassAttribute();
80         if ( $http->hasPostVariable( $base . "_data_option_id_" . $contentObjectAttribute->attribute( "id" ) ) )
81         {
82             $idList = $http->postVariable( $base . "_data_option_id_" . $contentObjectAttribute->attribute( "id" ) );
83             $valueList = $http->postVariable( $base . "_data_option_value_" . $contentObjectAttribute->attribute( "id" ) );
84             $dataName = $http->postVariable( $base . "_data_option_name_" . $contentObjectAttribute->attribute( "id" ) );
85
86             if ( $http->hasPostVariable( $base . "_data_option_additional_price_" . $contentObjectAttribute->attribute( "id" ) ) )
87                 $optionAdditionalPriceList = $http->postVariable( $base . "_data_option_additional_price_" . $contentObjectAttribute->attribute( "id" ) );
88             else
89                 $optionAdditionalPriceList = array();
90
91             for ( $i = 0; $i < count( $valueList ); ++$i )
92                 if ( trim( $valueList[$i] ) <> '' )
93                 {
94                     ++$count;
95                     break;
96                 }
97             if ( $contentObjectAttribute->validateIsRequired() and trim( $dataName ) == '' )
98             {
99                 $contentObjectAttribute->setValidationError( ezpI18n::translate( 'kernel/classes/datatypes',
100                                                                      'NAME is required.' ) );
101                 return eZInputValidator::STATE_INVALID;
102             }
103             if ( $count != 0 )
104             {
105                 for ( $i=0;$i<count( $idList );$i++ )
106                 {
107                     $value =  $valueList[$i];
108                     if ( trim( $value )== "" )
109                     {
110                         $contentObjectAttribute->setValidationError( ezpI18n::translate( 'kernel/classes/datatypes',
111                                                                              'The option value must be provided.' ) );
112                         return eZInputValidator::STATE_INVALID;
113                     }
114                     if ( isset( $optionAdditionalPriceList[$i] ) &&
115                          strlen( $optionAdditionalPriceList[$i] ) &&
116                          !preg_match( "#^[-|+]?[0-9]+(\.){0,1}[0-9]{0,2}$#", $optionAdditionalPriceList[$i] ) )
117                     {
118                         $contentObjectAttribute->setValidationError( ezpI18n::translate( 'kernel/classes/datatypes',
119                                                                              'The Additional price value is not valid.' ) );
120                         return eZInputValidator::STATE_INVALID;
121                     }
122                 }
123             }
124         }
125         if ( $contentObjectAttribute->validateIsRequired() and
126              !$classAttribute->attribute( 'is_information_collector' ) )
127         {
128             if ( $count == 0 )
129             {
130                 $contentObjectAttribute->setValidationError( ezpI18n::translate( 'kernel/classes/datatypes',
131                                                                      'At least one option is required.' ) );
132                 return eZInputValidator::STATE_INVALID;
133             }
134         }
135         return eZInputValidator::STATE_ACCEPTED;
136     }
137
138     /*!
139      Store content
140     */
141     function storeObjectAttribute( $contentObjectAttribute )
142     {
143         $option = $contentObjectAttribute->content();
144         $contentObjectAttribute->setAttribute( "data_text", $option->xmlString() );
145     }
146
147     /*!
148      Returns the content.
149     */
150     function objectAttributeContent( $contentObjectAttribute )
151     {
152         $option = new eZOption( "" );
153
154         $option->decodeXML( $contentObjectAttribute->attribute( "data_text" ) );
155
156         return $option;
157     }
158
159     /*!
160      Returns the meta data used for storing search indeces.
161     */
162     function metaData( $contentObjectAttribute )
163     {
164         return $contentObjectAttribute->attribute( "data_text" );
165     }
166
167     /*!
168      Fetches the http post var integer input and stores it in the data instance.
169     */
170     function fetchObjectAttributeHTTPInput( $http, $base, $contentObjectAttribute )
171     {
172         $optionName = $http->postVariable( $base . "_data_option_name_" . $contentObjectAttribute->attribute( "id" ) );
173         if ( $http->hasPostVariable( $base . "_data_option_id_" . $contentObjectAttribute->attribute( "id" ) ) )
174             $optionIDArray = $http->postVariable( $base . "_data_option_id_" . $contentObjectAttribute->attribute( "id" ) );
175         else
176             $optionIDArray = array();
177         if ( $http->hasPostVariable( $base . "_data_option_value_" . $contentObjectAttribute->attribute( "id" ) ) )
178             $optionValueArray = $http->postVariable( $base . "_data_option_value_" . $contentObjectAttribute->attribute( "id" ) );
179         else
180             $optionValueArray = array();
181         if ( $http->hasPostVariable( $base . "_data_option_additional_price_" . $contentObjectAttribute->attribute( "id" ) ) )
182             $optionAdditionalPriceArray = $http->postVariable( $base . "_data_option_additional_price_" . $contentObjectAttribute->attribute( "id" ) );
183         else
184             $optionAdditionalPriceArray = array();
185
186         $option = new eZOption( $optionName );
187
188         $i = 0;
189         foreach ( $optionIDArray as $id )
190         {
191             $option->addOption( array( 'value' => $optionValueArray[$i],
192                                        'additional_price' => ( isset( $optionAdditionalPriceArray[$i] ) ? $optionAdditionalPriceArray[$i] : 0 ) ) );
193             $i++;
194         }
195         $contentObjectAttribute->setContent( $option );
196         return true;
197     }
198
199
200     /*!
201      Fetches the http post variables for collected information
202     */
203     function fetchCollectionAttributeHTTPInput( $collection, $collectionAttribute, $http, $base, $contentObjectAttribute )
204     {
205         if ( $http->hasPostVariable( $base . "_data_option_value_" . $contentObjectAttribute->attribute( "id" ) ) )
206         {
207             $optionValue = $http->postVariable( $base . "_data_option_value_" . $contentObjectAttribute->attribute( "id" ) );
208
209             $collectionAttribute->setAttribute( 'data_int', $optionValue );
210             $attr = $contentObjectAttribute->attribute( 'contentclass_attribute' );
211
212             return true;
213         }
214         return false;
215     }
216
217     function customObjectAttributeHTTPAction( $http, $action, $contentObjectAttribute, $parameters )
218     {
219         switch ( $action )
220         {
221             case "new_option" :
222             {
223                 $option = $contentObjectAttribute->content( );
224
225                 $postvarname = "ContentObjectAttribute" . "_data_option_remove_" . $contentObjectAttribute->attribute( "id" );
226                 if ( $http->hasPostVariable( $postvarname ) )
227                 {
228                     $idArray = $http->postVariable( $postvarname );
229                     $beforeID = array_shift( $idArray );
230                     if ( $beforeID >= 0 )
231                     {
232                         $option->insertOption( array(), $beforeID );
233                         $contentObjectAttribute->setContent( $option );
234                         $contentObjectAttribute->store();
235                         $option = new eZOption( "" );
236                         $option->decodeXML( $contentObjectAttribute->attribute( "data_text" ) );
237                         $contentObjectAttribute->setContent( $option );
238                         return;
239                     }
240                 }
241                 $option->addOption( "" );
242                 $contentObjectAttribute->setContent( $option );
243                 $contentObjectAttribute->store();
244             }break;
245             case "remove_selected" :
246             {
247                 $option = $contentObjectAttribute->content( );
248                 $postvarname = "ContentObjectAttribute" . "_data_option_remove_" . $contentObjectAttribute->attribute( "id" );
249                 $array_remove = $http->postVariable( $postvarname );
250                 $option->removeOptions( $array_remove );
251                 $contentObjectAttribute->setContent( $option );
252                 $contentObjectAttribute->store();
253                 $option = new eZOption( "" );
254                 $option->decodeXML( $contentObjectAttribute->attribute( "data_text" ) );
255                 $contentObjectAttribute->setContent( $option );
256             }break;
257             default :
258             {
259                 eZDebug::writeError( "Unknown custom HTTP action: " . $action, "eZOptionType" );
260             }break;
261         }
262     }
263
264     /*!
265      Finds the option which has the ID that matches \a $optionID, if found it returns
266      an option structure.
267     */
268     function productOptionInformation( $objectAttribute, $optionID, $productItem )
269     {
270         $option = $objectAttribute->attribute( 'content' );
271         foreach( $option->attribute( 'option_list' ) as $optionArray )
272         {
273             if ( $optionArray['id'] == $optionID )
274             {
275                 return array( 'id' => $optionArray['id'],
276                               'name' => $option->attribute( 'name' ),
277                               'value' => $optionArray['value'],
278                               'additional_price' => $optionArray['additional_price'] );
279             }
280         }
281         return false;
282     }
283
284     /*!
285      Returns the integer value.
286     */
287     function title( $contentObjectAttribute, $name = "name" )
288     {
289         $option = $contentObjectAttribute->content( );
290
291         $value = $option->attribute( $name );
292
293         return $value;
294     }
295
296     function hasObjectAttributeContent( $contentObjectAttribute )
297     {
298         $option = $contentObjectAttribute->content( );
299         $options = $option->attribute( 'option_list' );
300         return count( $options ) > 0;
301     }
302
303     /*!
304      Sets the default value.
305     */
306     function initializeObjectAttribute( $contentObjectAttribute, $currentVersion, $originalContentObjectAttribute )
307     {
308         if ( $currentVersion == false )
309         {
310             $option = $contentObjectAttribute->content();
311             $contentClassAttribute = $contentObjectAttribute->contentClassAttribute();
312             if ( !$option )
313             {
314                 $option = new eZOption( $contentClassAttribute->attribute( 'data_text1' ) );
315             }
316             else
317             {
318                 $option->setName( $contentClassAttribute->attribute( 'data_text1' ) );
319             }
320             $contentObjectAttribute->setAttribute( "data_text", $option->xmlString() );
321             $contentObjectAttribute->setContent( $option );
322         }
323         else
324         {
325             $dataText = $originalContentObjectAttribute->attribute( "data_text" );
326             $contentObjectAttribute->setAttribute( "data_text", $dataText );
327         }
328     }
329
330     function fetchClassAttributeHTTPInput( $http, $base, $classAttribute )
331     {
332         $defaultValueName = $base . self::DEFAULT_NAME_VARIABLE . $classAttribute->attribute( 'id' );
333         if ( $http->hasPostVariable( $defaultValueName ) )
334         {
335             $defaultValueValue = $http->postVariable( $defaultValueName );
336
337             if ($defaultValueValue == "")
338             {
339                 $defaultValueValue = "";
340             }
341             $classAttribute->setAttribute( 'data_text1', $defaultValueValue );
342             return true;
343         }
344         return false;
345     }
346
347     function toString( $contentObjectAttribute )
348     {
349
350         $option = $contentObjectAttribute->attribute( 'content' );
351         $optionArray = array();
352         $optionArray[] = $option->attribute( 'name' );
353
354         $optionList = $option->attribute( 'option_list' );
355
356         foreach ( $optionList as $key => $value )
357         {
358             $optionArray[] = $value['value'];
359             $optionArray[] = $value['additional_price'];
360         }
361         return eZStringUtils::implodeStr( $optionArray, "|" );
362     }
363
364
365     function fromString( $contentObjectAttribute, $string )
366     {
367         if ( $string == '' )
368             return true;
369
370         $optionArray = eZStringUtils::explodeStr( $string, '|' );
371
372         $option = new eZOption( );
373
374         $option->OptionCount = 0;
375         $option->Options = array();
376         $option->Name = array_shift( $optionArray );
377         $count = count( $optionArray );
378         for ( $i = 0; $i < $count; $i +=2 )
379         {
380
381             $option->addOption( array( 'value' => array_shift( $optionArray ),
382                                        'additional_price' => array_shift( $optionArray ) ) );
383         }
384
385
386         $contentObjectAttribute->setAttribute( "data_text", $option->xmlString() );
387
388         return $option;
389
390     }
391     function serializeContentClassAttribute( $classAttribute, $attributeNode, $attributeParametersNode )
392     {
393         $defaultValue = $classAttribute->attribute( 'data_text1' );
394         $dom = $attributeParametersNode->ownerDocument;
395         $defaultValueNode = $dom->createElement( 'default-value' );
396         $defaultValueNode->appendChild( $dom->createTextNode( $defaultValue ) );
397         $attributeParametersNode->appendChild( $defaultValueNode );
398     }
399
400     function unserializeContentClassAttribute( $classAttribute, $attributeNode, $attributeParametersNode )
401     {
402         $defaultValue = $attributeParametersNode->getElementsByTagName( 'default-value' )->item( 0 )->textContent;
403         $classAttribute->setAttribute( 'data_text1', $defaultValue );
404     }
405
406     function serializeContentObjectAttribute( $package, $objectAttribute )
407     {
408         $node = $this->createContentObjectAttributeDOMNode( $objectAttribute );
409
410         $domDocument = new DOMDocument( '1.0', 'utf-8' );
411         $success = $domDocument->loadXML( $objectAttribute->attribute( 'data_text' ) );
412
413         $importedRoot = $node->ownerDocument->importNode( $domDocument->documentElement, true );
414         $node->appendChild( $importedRoot );
415
416         return $node;
417     }
418
419     function unserializeContentObjectAttribute( $package, $objectAttribute, $attributeNode )
420     {
421         $xmlString = '';
422         $optionNode = $attributeNode->getElementsByTagName( 'ezoption' )->item( 0 );
423
424         if ( $optionNode )
425         {
426             $xmlString = $optionNode->ownerDocument->saveXML( $optionNode );
427         }
428         else
429         {
430             // backward compatibility
431             $optionNode = $attributeNode->getElementsByTagName( 'data-text' )->item( 0 );
432             if ( $optionNode )
433             {
434                 $xmlString = $optionNode->textContent;
435             }
436             else
437             {
438                 // dl: unknown case. Probably should be removed at all.
439                 $optionNode = $attributeNode->firstChild;
440                 $xmlString = $optionNode->getAttribute( 'local_name' ) == 'data-text' ? '' : $optionNode->textContent;
441             }
442         }
443
444         $objectAttribute->setAttribute( 'data_text', $xmlString );
445     }
446
447     function isInformationCollector()
448     {
449         return true;
450     }
451
452     function supportsBatchInitializeObjectAttribute()
453     {
454         return true;
455     }
456
457     function batchInitializeObjectAttributeData( $classAttribute )
458     {
459         $option = new eZOption( $classAttribute->attribute( 'data_text1' ) );
460         $db = eZDB::instance();
461         return array( 'data_text' =>  "'" . $db->escapeString( $option->xmlString() ) . "'" );
462     }
463 }
464
465 eZDataType::register( eZOptionType::DATA_TYPE_STRING, "eZOptionType" );
466
467 ?>