- Fixed #16160: Call to undefined function ezi18n()
[tinyz:tinyz.git] / kernel / classes / datatypes / ezmultioption2 / ezmultioption2type.php
1 <?php
2 //
3 // Definition of eZMultiOption2Type class
4 //
5 // Created on: <07-Jul-2007 15:52:24 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 eZMultiOption2Type ezmultioption2type.php
33   \ingroup eZDatatype
34   \brief A datatype which works with multiple options.
35
36   This allows the user to add several option choices almost as if he
37   was adding attributes with option datatypes.
38
39   This class implements the interface for a datatype but passes
40   most of the work over to the eZMultiOption2 class which handles
41   parsing, storing and manipulation of multioption2s and options.
42
43   This datatype supports:
44   - fetch and validation of HTTP data
45   - search indexing
46   - product option information
47   - class title
48   - class serialization
49
50 */
51
52 class eZMultiOption2Type extends eZDataType
53 {
54     const DEFAULT_NAME_VARIABLE = "_ezmultioption2_default_name_";
55     const MAX_CHILD_LEVEL = 50;
56     const DATA_TYPE_STRING = "ezmultioption2";
57
58     /*!
59      Constructor to initialize the datatype.
60     */
61     function eZMultiOption2Type()
62     {
63         $this->eZDataType( self::DATA_TYPE_STRING, ezpI18n::translate( 'kernel/classes/datatypes', "Multi-option2", 'Datatype name' ),
64                            array( 'serialize_supported' => true ) );
65     }
66
67     /*!
68      Validates the input for this datatype.
69      \return True if input is valid.
70     */
71     function validateObjectAttributeHTTPInput( $http, $base, $contentObjectAttribute )
72     {
73         return eZInputValidator::STATE_ACCEPTED;
74     }
75
76     /*!
77      This function calles xmlString function to create xml string and then store the content.
78     */
79     function storeObjectAttribute( $contentObjectAttribute )
80     {
81         $optiongroup = $contentObjectAttribute->content();
82         $contentObjectAttribute->setAttribute( "data_text", $optiongroup->xmlString() );
83     }
84
85     /*!
86      \return An eZMultiOption2 object which contains all the option data
87     */
88     function objectAttributeContent( $contentObjectAttribute )
89     {
90         $optiongroup = new eZMultiOption2( "" );
91         $optiongroup->decodeXML( $contentObjectAttribute->attribute( "data_text" ) );
92         return $optiongroup;
93     }
94
95     function isIndexable()
96     {
97         return true;
98     }
99
100     /*!
101      \return The internal XML text.
102     */
103     function metaData( $contentObjectAttribute )
104     {
105         return $contentObjectAttribute->attribute( "data_text" );
106     }
107
108     /*!
109      Fetches the http post var integer input and stores it in the data instance.
110     */
111     function fetchObjectAttributeHTTPInput( $http, $base, $contentObjectAttribute )
112     {
113         $editMode = $http->postVariable( $base . "_data_edit_mode_" . $contentObjectAttribute->attribute( "id" ) );
114         if( $editMode == 'rules' )
115         {
116             $optiongroup = $contentObjectAttribute->content();
117
118             $optionRulesArray = $http->hasPostVariable( $base . "_data_multioption_rule_for" )
119                                  ? $http->postVariable( $base . "_data_multioption_rule_for" )
120                                  : array();
121             $rules = array();
122             foreach( $optionRulesArray  as $ruleFor )
123             {
124                 $parentMultioptionIDList = $http->postVariable( $base . "_data_rule_parent_multioption_id_" . $ruleFor );
125                 $rule = array();
126                 foreach ( $parentMultioptionIDList as $parentMultioptionID )
127                 {
128                     $parentMultioptionData = $optiongroup->findMultiOption( $parentMultioptionID );
129                     $parentMultioptionGroup = $parentMultioptionData['group'];
130
131                     $parentMultioptionOptionList = $parentMultioptionGroup->Options[$parentMultioptionData['id']]['optionlist'];
132
133                     $ruleData = $http->hasPostVariable( $base . "_data_multioption_rule_" . $ruleFor . '_' . $parentMultioptionID )
134                                  ? $http->postVariable( $base . "_data_multioption_rule_" . $ruleFor . '_' . $parentMultioptionID )
135                                 : array();
136                     if ( count( $parentMultioptionOptionList ) == count( $ruleData ) )
137                         continue;
138                     $rule[$parentMultioptionID] = $ruleData;
139                 }
140                 if ( count( $rule ) )
141                     $rules[$ruleFor] = $rule;
142             }
143             $optiongroup->Rules = $rules;
144             $contentObjectAttribute->setContent( $optiongroup );
145             return true;
146         }
147
148         $optiongroup = new eZMultiOption2( '' );
149
150         $oldoptiongroup = $contentObjectAttribute->content();
151         if ( $oldoptiongroup->Rules )
152            $optiongroup->Rules = $oldoptiongroup->Rules;
153         $this->fetchHTTPInputForGroup( $optiongroup, $http, $base, $contentObjectAttribute );
154         $optiongroup->initCountersRecursive();
155         $contentObjectAttribute->setContent( $optiongroup );
156         return true;
157     }
158
159     function fetchHTTPInputForGroup( $parentOptionGroup, $http, $base, $contentObjectAttribute, $depth = 0 )
160     {
161
162         $optionGroupIDArray = $http->hasPostVariable( $base . "_data_optiongroup_id_" .
163                                                       $contentObjectAttribute->attribute( "id" ) . '_' .
164                                                       $parentOptionGroup->attribute( 'group_id' ) )
165                               ? $http->postVariable( $base . "_data_optiongroup_id_" .
166                                                       $contentObjectAttribute->attribute( "id" ) . '_' .
167                                                       $parentOptionGroup->attribute( 'group_id' ) )
168                               : array();
169         $optionGroupNameList = count( $optionGroupIDArray ) > 0
170              ? $http->postVariable( $base . "_data_optiongroup_name_" .
171                                     $contentObjectAttribute->attribute( "id" )  . '_' .
172                                     $parentOptionGroup->attribute( 'group_id' ) )
173              : array();
174         foreach ( $optionGroupIDArray as $key => $optionGroupID )
175         {
176             unset( $optionGroup );
177             $optionGroup = new eZMultiOption2( $optionGroupNameList[$key], 0,0,0, $optionGroupID );
178
179             if ( $http->hasPostVariable( $base . "_data_optiongroup_id_parent_multioption_" .
180                                                       $contentObjectAttribute->attribute( "id" ) . '_' .
181                                                       $optionGroupID ) )
182             {
183                $parentMultioptionID =   $http->postVariable( $base . "_data_optiongroup_id_parent_multioption_" .
184                                                              $contentObjectAttribute->attribute( "id" ) . '_' .
185                                                              $optionGroupID );
186                $parentOptionGroup->addChildGroup( $optionGroup, $parentMultioptionID );
187             }
188             else
189             {
190                 $parentOptionGroup->addChildGroup( $optionGroup );
191             }
192             if ( $optionGroupID == 0 )
193                 continue ;
194
195             $multioptionIDArray = $http->hasPostVariable( $base . "_data_multioption_id_" .
196                                                           $contentObjectAttribute->attribute( "id" ) . '_' .
197                                                           $optionGroupID )
198                  ? $http->postVariable( $base . "_data_multioption_id_" .
199                                         $contentObjectAttribute->attribute( "id" ). '_' .
200                                         $optionGroupID )
201                               : array();
202             foreach( $multioptionIDArray as $multioptionID )
203             {
204
205                 $multioptionName = $http->postVariable( $base . "_data_multioption_name_" .
206                                                         $contentObjectAttribute->attribute( "id" ). '_' .
207                                                         $optionGroupID . '_' . $multioptionID );
208
209                 $defaultValue = $http->hasPostVariable( $base . "_data_default_option_" .
210                                                         $contentObjectAttribute->attribute( "id" ). '_' .
211                                                         $optionGroupID . '_' . $multioptionID )
212                      ? $http->postVariable( $base . "_data_default_option_" .
213                                             $contentObjectAttribute->attribute( "id" ). '_' .
214                                             $optionGroupID . '_' . $multioptionID )
215                      : '';
216
217                 $multiOptionPriority = 0;
218
219                 $newID = $optionGroup->addMultiOption( $multioptionName, $multiOptionPriority, $defaultValue, $multioptionID  );
220
221
222                 $optionCountArray = $http->hasPostVariable( $base . "_data_option_option_id_" .
223                                                             $contentObjectAttribute->attribute( "id" ) . '_' .
224                                                             $optionGroupID . '_' .  $multioptionID )
225                                 ? $http->postVariable( $base . "_data_option_option_id_" .
226                                                        $contentObjectAttribute->attribute( "id" ) . '_' .
227                                                        $optionGroupID . '_' .  $multioptionID )
228                                 : array();
229
230                 $optionValueArray = $http->hasPostVariable( $base . "_data_option_value_" .
231                                                             $contentObjectAttribute->attribute( "id" ) . '_' .
232                                                             $optionGroupID . '_' .  $multioptionID )
233                      ? $http->postVariable( $base . "_data_option_value_" .
234                                             $contentObjectAttribute->attribute( "id" ) . '_' .
235                                             $optionGroupID . '_' .  $multioptionID )
236                      : array();
237                 $http->postVariable( $base . "_data_option_value_" .
238                                             $contentObjectAttribute->attribute( "id" ) . '_' .
239                                      $optionGroupID . '_' .  $multioptionID );
240                 $http->postVariable( $base . "_data_option_additional_price_" .
241                                             $contentObjectAttribute->attribute( "id" ) . '_' .
242                                      $optionGroupID . '_' .  $multioptionID );
243                 $optionAdditionalPriceArray = $http->hasPostVariable( $base . "_data_option_additional_price_" .
244                                                             $contentObjectAttribute->attribute( "id" ) . '_' .
245                                                             $optionGroupID . '_' .  $multioptionID )
246                      ? $http->postVariable( $base . "_data_option_additional_price_" .
247                                             $contentObjectAttribute->attribute( "id" ) . '_' .
248                                             $optionGroupID . '_' .  $multioptionID )
249                      : array();
250                 for ( $i = 0; $i < count( $optionCountArray ); $i++ )
251                 {
252                     $isSelectable = $http->hasPostVariable( $base . "_data_option_is_selectable_" .
253                                                             $contentObjectAttribute->attribute( "id" ) . '_' .
254                                                             $optionGroupID . '_' .  $multioptionID . '_' . $optionCountArray[$i] )
255                          ? 0 : 1;
256                     $objectID = $http->hasPostVariable( $base . "_data_option_object_" .
257                                                             $contentObjectAttribute->attribute( "id" ) . '_' .
258                                                             $optionGroupID . '_' .  $multioptionID . '_' . $optionCountArray[$i] )
259                                 ? $http->postVariable( $base . "_data_option_object_" .
260                                                             $contentObjectAttribute->attribute( "id" ) . '_' .
261                                                             $optionGroupID . '_' .  $multioptionID . '_' . $optionCountArray[$i] ) : 0;
262                     $optionGroup->addOption( $newID, $optionCountArray[$i], $optionValueArray[$i], $optionAdditionalPriceArray[$i], $isSelectable, $objectID );
263                 }
264             }
265             if ( $depth > self::MAX_CHILD_LEVEL)
266                 die('max recursion level has been reached');
267             $this->fetchHTTPInputForGroup( $optionGroup, $http, $base, $contentObjectAttribute, $depth+1 );
268
269             $parentOptionGroup->initCounters( $optionGroup );
270
271         }
272
273     }
274
275
276     /*!
277      This function performs specific actions.
278
279      It has some special actions with parameters which is done by exploding
280      $action into several parts with delimeter '_'.
281      The first element is the name of specific action to perform.
282      The second element will contain the key value or id.
283
284      The various operation's that is performed by this function are as follow.
285      - new-option - A new option is added to a multioption.
286      - remove-selected-option - Removes a selected option.
287      - new_multioption - Adds a new multioption.
288      - remove_selected_multioption - Removes all multioptions given by a selection list
289     */
290     function customObjectAttributeHTTPAction( $http, $action, $contentObjectAttribute, $parameters )
291     {
292         $actionlist = explode( "_", $action );
293         if ( $actionlist[0] == "new-option" )
294         {
295             $rootGroup = $contentObjectAttribute->content();
296             $groupID = $actionlist[1];
297             $multioptionID = $actionlist[2];
298             $optionID = $rootGroup->addOptionForMultioptionID( $multioptionID,  "", "", "" );
299
300             $group = $rootGroup->findGroup( $groupID );
301
302             $rootGroup->addOptionToRules( $multioptionID, $optionID );
303
304             $rootGroup->initCounters( $group );
305             $rootGroup->initCountersRecursive();
306             $contentObjectAttribute->setContent( $rootGroup );
307             $contentObjectAttribute->store();
308         }
309         else if ( $actionlist[0] == "new-sublevel" )
310         {
311             $rootGroup = $contentObjectAttribute->content();
312             $groupID = $actionlist[1];
313             $multioptionID = $actionlist[2];
314
315             $group = $rootGroup->findGroup( $groupID );
316             if ( !$group )
317                 return;
318             $childGroup = new eZMultiOption2( '', 0, $rootGroup->getMultiOptionIDCounter(),$rootGroup->getOptionCounter() );
319
320             $group->addChildGroup( $childGroup, $multioptionID );
321
322             $newID = $childGroup->addMultiOption( "", 0, false , '' );
323             $childGroup->addOption( $newID, "", "", "" );
324             $rootGroup->initCounters( $childGroup );
325
326             $rootGroup->initCountersRecursive();
327
328             $contentObjectAttribute->setContent( $rootGroup );
329             $contentObjectAttribute->store();
330         }
331         else if ( $actionlist[0] == "new-group" )
332         {
333             $rootGroup = $contentObjectAttribute->content();
334             $childGroup = new eZMultiOption2( '', 0, $rootGroup->getMultiOptionIDCounter(),$rootGroup->getOptionCounter() );
335             $rootGroup->addChildGroup( $childGroup );
336             $newID = $childGroup->addMultiOption( "", 0, false , '' );
337             $childGroup->addOption( $newID, "", "", "" );
338             $rootGroup->initCounters( $childGroup );
339             $rootGroup->initCountersRecursive();
340
341             $contentObjectAttribute->setContent( $rootGroup );
342             $contentObjectAttribute->store();
343         }
344         else if ( $actionlist[0] == "remove-selected-option" )
345         {
346             $rootGroup = $contentObjectAttribute->content();
347             $groupID = $actionlist[1];
348             $multioptionID = $actionlist[2];
349             $postvarname = "ContentObjectAttribute" . "_data_option_remove_" . $contentObjectAttribute->attribute( "id" ) . "_" .
350                             $groupID . "_" . $multioptionID;
351             $array_remove = $http->hasPostVariable( $postvarname ) ? $http->postVariable( $postvarname ) : array();
352
353             $group = $rootGroup->findGroup( $groupID );
354
355             if ( $group )
356             {
357                 $group->removeOptions( $array_remove, $multioptionID );
358                 $rootGroup->cleanupRules();
359                 $contentObjectAttribute->setContent( $rootGroup );
360                 $contentObjectAttribute->store();
361             }
362         }
363         else if ( $actionlist[0] == "new-multioption" )
364         {
365             $rootGroup = $contentObjectAttribute->content();
366             $groupID = $actionlist[1];
367             $group = $rootGroup->findGroup( $groupID );
368             if ( !$group )
369                 return;
370
371             $newID = $group->addMultiOption( "" ,0,false, '' );
372             $group->addOption( $newID, "", "", "" );
373             $group->addOption( $newID, "" ,"", "" );
374             $rootGroup->initCounters( $group );
375             $rootGroup->initCountersRecursive();
376             $contentObjectAttribute->setContent( $rootGroup );
377             $contentObjectAttribute->store();
378
379         }
380         else if ( $actionlist[0] == "remove-selected-multioption" )
381         {
382             $rootGroup = $contentObjectAttribute->content();
383             $groupID = $actionlist[1];
384             $postvarname = "ContentObjectAttribute" . "_data_multioption_remove_" . $contentObjectAttribute->attribute( "id" ) . "_" . $groupID;
385             $array_remove = $http->hasPostVariable( $postvarname ) ? $http->postVariable( $postvarname ) : array();
386
387             $group = $rootGroup->findGroup( $groupID );
388
389             if ( $group )
390             {
391                 $group->removeMultiOptions( $array_remove );
392                 $rootGroup->cleanupRules();
393                 if ( count( $group->attribute( 'multioption_list') ) == 0 )
394                 {
395                     $rootGroup->removeChildGroup( $group->attribute( 'group_id' ) );
396                 }
397                 $contentObjectAttribute->setContent( $rootGroup );
398                 $contentObjectAttribute->store();
399             }
400
401         }
402         else if ( $actionlist[0] == "switch-mode" )
403         {
404             $editMode = $actionlist[1];
405             $sessionVarName = 'eZEnhancedMultioption_edit_mode_' . $contentObjectAttribute->attribute( 'id' );
406             $http->setSessionVariable( $sessionVarName, $editMode );
407             $rootGroup = $contentObjectAttribute->content();
408             $contentObjectAttribute->setContent( $rootGroup );
409         }
410         else if ( $actionlist[0] == "reset-rules" )
411         {
412             $rootGroup = $contentObjectAttribute->content();
413             $rootGroup->Rules = array();
414             $contentObjectAttribute->setContent( $rootGroup );
415             $contentObjectAttribute->store();
416
417         }
418         else if ( $actionlist[0] == "set-object" )
419         {
420
421             if ( $http->hasPostVariable( 'BrowseActionName' ) and
422                  $http->postVariable( 'BrowseActionName' ) == ( 'AddRelatedObject_' . $contentObjectAttribute->attribute( 'id' ) ) and
423                  $http->hasPostVariable( "SelectedObjectIDArray" ) )
424             {
425                 if ( !$http->hasPostVariable( 'BrowseCancelButton' ) )
426                 {
427                     $selectedObjectArray = $http->hasPostVariable( "SelectedObjectIDArray" );
428                     $selectedObjectIDArray = $http->postVariable( "SelectedObjectIDArray" );
429                     $rootGroup = $contentObjectAttribute->content();
430                     $groupID = $actionlist[1];
431                     $multioptionID = $actionlist[2];
432                     $optionID = $actionlist[3];
433
434                     $objectID = $selectedObjectIDArray[0];
435
436                     $rootGroup->setObjectForOption(  $multioptionID,  $optionID, $objectID );
437                     $contentObjectAttribute->setContent( $rootGroup );
438                     $contentObjectAttribute->store();
439
440                 }
441            }
442         }
443         else if ( $actionlist[0] == "browse-object" )
444         {
445             $module = $parameters['module'];
446
447             $redirectionURI = $parameters['current-redirection-uri'];
448             $ini = eZINI::instance( 'content.ini' );
449
450             $browseType = 'AddRelatedObjectToDataType';
451             $browseTypeINIVariable = $ini->variable( 'ObjectRelationDataTypeSettings', 'ClassAttributeStartNode' );
452             foreach( $browseTypeINIVariable as $value )
453             {
454                 list( $classAttributeID, $type ) = explode( ';',$value );
455                 if ( $classAttributeID == $contentObjectAttribute->attribute( 'contentclassattribute_id' ) && strlen( $type ) > 0 )
456                 {
457                     $browseType = $type;
458                     break;
459                 }
460             }
461             eZContentBrowse::browse( array( 'action_name' => 'AddRelatedObject_' . $contentObjectAttribute->attribute( 'id' ),
462                                             'type' =>  $browseType,
463                                             'browse_custom_action' => array( 'name' => 'CustomActionButton[' . $contentObjectAttribute->attribute( 'id' ) .
464                                                                              '_set-object_'. $actionlist[1] . '_' . $actionlist[2] . '_' .$actionlist[3] . ']',
465                                                                              'value' => $contentObjectAttribute->attribute( 'id' ) ),
466                                                 'persistent_data' => array( 'HasObjectInput' => 0 ),
467                                                 'from_page' => $redirectionURI ),
468                                          $module );
469
470         }
471         else if ( $actionlist[0] == "remove-object" )
472         {
473
474
475             $rootGroup = $contentObjectAttribute->content();
476             $groupID = $actionlist[1];
477             $multioptionID = $actionlist[2];
478             $optionID = $actionlist[3];
479
480             $rootGroup->removeObjectFromOption( $multioptionID, $optionID );
481
482             $contentObjectAttribute->setContent( $rootGroup );
483             $contentObjectAttribute->store();
484
485
486         }
487         else
488         {
489             eZDebug::writeError( "Unknown custom HTTP action: " . $action, "eZMultiOptionType" );
490         }
491     }
492
493     /*!
494      Finds the option which has the correct ID , if found it returns an option structure.
495     */
496     function productOptionInformation( $objectAttribute, $optionID, $productItem )
497     {
498         $optiongroup = $objectAttribute->attribute( 'content' );
499
500         $option = $optiongroup->findOption( false, $optionID );
501         if ( $option )
502         {
503             return array( 'id' => $option['option_id'],
504                           'name' => $option['multioption_name'],
505                           'value' => $option['value'],
506                           'additional_price' => $option['additional_price'] );
507         }
508         return null;
509     }
510
511
512     /*!
513       \return \c true if there are more than one multioption in the list.
514     */
515     function hasObjectAttributeContent( $contentObjectAttribute )
516     {
517         $groups = $contentObjectAttribute->content();
518         $grouplist = $groups->attribute( 'optiongroup_list' );
519         return count( $grouplist ) > 0;
520     }
521
522     /*!
523      Sets default multioption values.
524     */
525     function initializeObjectAttribute( $contentObjectAttribute, $currentVersion, $originalContentObjectAttribute )
526     {
527         if ( $currentVersion == false )
528         {
529             $optiongroup = $contentObjectAttribute->content();
530             if ( $optiongroup )
531             {
532                 $contentClassAttribute = $contentObjectAttribute->contentClassAttribute();
533                 $optiongroup->setName( $contentClassAttribute->attribute( 'data_text1' ) );
534                 $contentObjectAttribute->setAttribute( "data_text", $optiongroup->xmlString() );
535                 $contentObjectAttribute->setContent( $optiongroup );
536             }
537         }
538         else
539         {
540             $dataText = $originalContentObjectAttribute->attribute( "data_text" );
541             $contentObjectAttribute->setAttribute( "data_text", $dataText );
542         }
543     }
544
545     function fetchClassAttributeHTTPInput( $http, $base, $classAttribute )
546     {
547         return false;
548     }
549
550
551     /*!
552      Validates the input for an object attribute during add to basket process
553      and returns a validation state as defined in eZInputValidator.
554     */
555     function validateAddToBasket( $objectAttribute, $data, &$errors )
556     {
557
558         $optiongroup = $objectAttribute->attribute( 'content' );
559         $rules = $optiongroup->Rules;
560
561         $validationErrors = array();
562
563
564         foreach( $data as $moptionID => $selectedItem )
565         {
566             $failedOptionData = $optiongroup->findMultiOption( $moptionID );
567             $failedMultiOption = $failedOptionData['group']->Options[$failedOptionData['id']];
568             $failedOption = $optiongroup->findOption( $failedMultiOption, $selectedItem );
569             if ( $failedOption['is_selectable'] != 1 )
570             {
571                 $objectAttribute->setValidationError( ezpI18n::translate( 'kernel/classes/datatypes',
572                                                               "You cannot choose option value \"%1\" from \"%2\" because it is unselectable " ),
573                                                       $failedOption['value'],
574                                                       $failedMultiOption['name'] );
575                 $validationErrors[] = $objectAttribute->attribute( 'validation_error' );
576             }
577             if ( ! isset( $rules[$selectedItem] ) )
578                 continue;
579
580             $rulesForOption = $rules[$selectedItem];
581             foreach( array_keys( $rulesForOption ) as $ruleKey )
582             {
583
584                 if ( isset( $data[$ruleKey] ) )
585                 {
586                     $selectedMultioptionValue = $data[$ruleKey];
587                     $canSelectIfIdArray = $rulesForOption[$ruleKey];
588                     if ( !in_array( $data[$ruleKey], $canSelectIfIdArray  ) )
589                     {
590                         $wrongParentData =  $optiongroup->findMultiOption( $ruleKey );
591                         $wrongParentMultiOption = $wrongParentData['group']->Options[$wrongParentData['id']];
592
593                         $wrongParentOptionID = $data[$ruleKey];
594                         $wrongParentOption =  $optiongroup->findOption( $wrongParentMultiOption, $wrongParentOptionID );
595
596                         $objectAttribute->setValidationError( ezpI18n::translate( 'kernel/classes/datatypes',
597                                                                       "You cannot choose option value \"%1\" from \"%2\"  \n if you selected option \"%3\" from \"%4\" " ),
598                                                               $failedOption['value'],
599                                                               $failedMultiOption['name'],
600                                                               $wrongParentOption['value'],
601                                                               $wrongParentMultiOption['name'] );
602                         $validationErrors[] = $objectAttribute->attribute( 'validation_error' );
603
604                     }
605                 }
606             }
607         }
608
609         if ( count( $validationErrors ) > 0 )
610         {
611             $errors = $validationErrors;
612             return eZInputValidator::STATE_INVALID;
613         }
614         return eZInputValidator::STATE_ACCEPTED;
615     }
616
617     /*!
618      \return true if the datatype requires validation during add to basket procedure
619     */
620     function isAddToBasketValidationRequired()
621     {
622         return true;
623     }
624
625     function serializeContentClassAttribute( $classAttribute, $attributeNode, $attributeParametersNode )
626     {
627         $defaultValue = $classAttribute->attribute( 'data_text1' );
628         $dom = $attributeParametersNode->ownerDocument;
629         $defaultValueNode = $dom->createElement( 'default-value' );
630         $defaultValueNode->appendChild( $dom->createTextNode( $defaultValue ) );
631         $attributeParametersNode->appendChild( $defaultValueNode );
632     }
633
634     function unserializeContentClassAttribute( $classAttribute, $attributeNode, $attributeParametersNode )
635     {
636         $defaultValue = $attributeParametersNode->getElementsByTagName( 'default-value' )->item( 0 )->textContent;
637         $classAttribute->setAttribute( 'data_text1', $defaultValue );
638     }
639
640     function serializeContentObjectAttribute( $package, $objectAttribute )
641     {
642         $node = $this->createContentObjectAttributeDOMNode( $objectAttribute );
643
644         $dom = new DOMDocument( '1.0', 'utf-8' );
645         $success = $dom->loadXML( $objectAttribute->attribute( 'data_text' ) );
646
647         $importedNode = $node->ownerDocument->importNode( $dom->documentElement, true );
648         $node->appendChild( $importedNode );
649
650         return $node;
651     }
652
653     function unserializeContentObjectAttribute( $package, $objectAttribute, $attributeNode )
654     {
655         $rootNode = $attributeNode->getElementsByTagName( 'ezmultioption2' )->item( 0 );
656         $xmlString = $attributeNode->ownerDocument->saveXML( $rootNode );
657         $objectAttribute->setAttribute( 'data_text', $xmlString );
658     }
659
660     /*!
661      \return the template name to use for editing the attribute.
662      \note Default is to return the datatype string which is OK
663            for most datatypes, if you want dynamic templates
664            reimplement this function and return a template name.
665      \note The returned template name does not include the .tpl extension.
666      \sa viewTemplate, informationTemplate
667     */
668     function editTemplate( $contentObjectAttribute )
669     {
670         $http = eZHTTPTool::instance();
671         $sessionVarName = 'eZEnhancedMultioption_edit_mode_' . $contentObjectAttribute->attribute( 'id' );
672         if ( $http->hasSessionVariable( $sessionVarName )  && $http->sessionVariable( $sessionVarName )  == 'rules' )
673         {
674             return $this->DataTypeString . '_rules';
675         }
676         return $this->DataTypeString;
677     }
678
679     function supportsBatchInitializeObjectAttribute()
680     {
681         return true;
682     }
683
684     function batchInitializeObjectAttributeData( $classAttribute )
685     {
686         $optionGroup = new eZMultiOption2( $classAttribute->attribute( 'data_text1' ) );
687         $db = eZDB::instance();
688         return array( 'data_text' => "'" . $db->escapeString( $optionGroup->xmlString() ) . "'" );
689     }
690 }
691
692 eZDataType::register( eZMultiOption2Type::DATA_TYPE_STRING, "eZMultiOption2Type" );
693
694 ?>