- Fixed bug #7782: The setup wizard is broken.
[tinyz:tinyz.git] / kernel / classes / datatypes / ezmatrix / ezmatrixtype.php
1 <?php
2 //
3 // Definition of eZMatrixType class
4 //
5 // Created on: <30-May-2003 14:18:35 sp>
6 //
7 // Copyright (C) 1999-2006 eZ systems as. All rights reserved.
8 //
9 // This source file is part of the eZ publish (tm) Open Source Content
10 // Management System.
11 //
12 // This file may be distributed and/or modified under the terms of the
13 // "GNU General Public License" version 2 as published by the Free
14 // Software Foundation and appearing in the file LICENSE included in
15 // the packaging of this file.
16 //
17 // Licencees holding a valid "eZ publish professional licence" version 2
18 // may use this file in accordance with the "eZ publish professional licence"
19 // version 2 Agreement provided with the Software.
20 //
21 // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING
22 // THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23 // PURPOSE.
24 //
25 // The "eZ publish professional licence" version 2 is available at
26 // http://ez.no/ez_publish/licences/professional/ and in the file
27 // PROFESSIONAL_LICENCE included in the packaging of this file.
28 // For pricing of this licence please contact us via e-mail to licence@ez.no.
29 // Further contact information is available at http://ez.no/company/contact/.
30 //
31 // The "GNU General Public License" (GPL) is available at
32 // http://www.gnu.org/copyleft/gpl.html.
33 //
34 // Contact licence@ez.no if any conditions of this licencing isn't clear to
35 // you.
36 //
37
38 /*! \file ezmatrixtype.php
39 */
40
41 /*!
42   \class eZMatrixType ezmatrixtype.php
43   \ingroup eZDatatype
44   \brief The class eZMatrixType does
45
46 */
47
48 include_once( 'kernel/classes/ezdatatype.php' );
49 include_once( 'kernel/classes/datatypes/ezmatrix/ezmatrix.php' );
50 include_once( 'kernel/classes/datatypes/ezmatrix/ezmatrixdefinition.php' );
51
52 define( 'EZ_MATRIX_DEFAULT_NAME_VARIABLE', '_ezmatrix_default_name_' );
53
54 define( 'EZ_MATRIX_NUMCOLUMNS_VARIABLE', '_ezmatrix_default_num_columns_' );
55 define( 'EZ_MATRIX_NUMROWS_VARIABLE', '_ezmatrix_default_num_rows_' );
56 define( 'EZ_MATRIX_CELL_VARIABLE', '_ezmatrix_cell_' );
57 define( 'EZ_DATATYPESTRING_MATRIX', 'ezmatrix' );
58
59 class eZMatrixType extends eZDataType
60 {
61     /*!
62      Constructor
63     */
64     function eZMatrixType()
65     {
66         $this->eZDataType( EZ_DATATYPESTRING_MATRIX, ezi18n( 'kernel/classes/datatypes', 'Matrix', 'Datatype name' ),
67                            array( 'serialize_supported' => true ) );
68     }
69
70     /*!
71      Validates the input and returns true if the input was
72      valid for this datatype.
73     */
74     function validateObjectAttributeHTTPInput( &$http, $base, &$contentObjectAttribute )
75     {
76         $data = false;
77         if ( $http->hasPostVariable( $base . '_ezmatrix_cell_' . $contentObjectAttribute->attribute( 'id' ) ) )
78             $data = $http->PostVariable( $base . '_ezmatrix_cell_' . $contentObjectAttribute->attribute( 'id' ) );
79         $count = 0;
80         for ( $i = 0; $i < count( $data ); ++$i )
81              if ( trim( $data[$i] ) <> '' )
82              {
83                  ++$count;
84                  break;
85              }
86         if ( $contentObjectAttribute->validateIsRequired() and ( $count == 0 or $data === false ) )
87         {
88             $contentObjectAttribute->setValidationError( ezi18n( 'kernel/classes/datatypes',
89                                                                  'Missing matrix input.' ) );
90             return EZ_INPUT_VALIDATOR_STATE_INVALID;
91         }
92         return EZ_INPUT_VALIDATOR_STATE_ACCEPTED;
93     }
94
95     /*!
96      Store content
97     */
98     function storeObjectAttribute( &$contentObjectAttribute )
99     {
100         $matrix =& $contentObjectAttribute->content();
101         $contentObjectAttribute->setAttribute( 'data_text', $matrix->xmlString() );
102         $matrix->decodeXML( $contentObjectAttribute->attribute( 'data_text' ) );
103         $contentObjectAttribute->setContent( $matrix );
104     }
105
106     function storeClassAttribute( &$contentClassAttribute, $version )
107     {
108         $matrixDefinition =& $contentClassAttribute->content();
109         $contentClassAttribute->setAttribute( 'data_text5', $matrixDefinition->xmlString() );
110         $matrixDefinition->decodeClassAttribute( $contentClassAttribute->attribute( 'data_text5' ) );
111         $contentClassAttribute->setContent(  $matrixDefinition );
112     }
113
114     /*!
115      Returns the content.
116     */
117     function &objectAttributeContent( &$contentObjectAttribute )
118     {
119         $matrix = new eZMatrix( '' );
120
121         $matrix->decodeXML( $contentObjectAttribute->attribute( 'data_text' ) );
122
123         return $matrix;
124     }
125
126     function hasObjectAttributeContent( &$contentObjectAttribute )
127     {
128         $matrix =& $contentObjectAttribute->content();
129         $columnsArray =& $matrix->attribute( 'columns' );
130         $columns =& $columnsArray['sequential'];
131         $count = 0;
132         foreach ( $columns as $column )
133         {
134             $count += count( $column['rows'] );
135         }
136         return $count > 0;
137     }
138
139     /*!
140      Returns the meta data used for storing search indeces.
141     */
142     function metaData( $contentObjectAttribute )
143     {
144         $matrix =& $contentObjectAttribute->content();
145         $columnsArray =& $matrix->attribute( 'columns' );
146         $columns =& $columnsArray['sequential'];
147         $metaDataArray = array();
148         foreach ( $columns as $column )
149         {
150             $rows = $column['rows'];
151             foreach ( $rows as $row )
152             {
153                 $metaDataArray[] = array( 'id' => $column['identifier'],
154                                           'text' => $row );
155             }
156         }
157         return $metaDataArray;
158     }
159
160     /*!
161      Fetches the http post var matrix cells input and stores it in the data instance.
162     */
163     function fetchObjectAttributeHTTPInput( &$http, $base, &$contentObjectAttribute )
164     {
165         $cellsVarName = $base . EZ_MATRIX_CELL_VARIABLE . $contentObjectAttribute->attribute( 'id' );
166         if ( $http->hasPostVariable( $cellsVarName ) )
167         {
168             $cells = array();
169             foreach ( $http->postVariable( $cellsVarName ) as $cell )
170             {
171                 $cells[] = $cell;
172             }
173             $matrix =& $contentObjectAttribute->attribute( 'content' );
174             $matrix->Cells =& $cells;
175
176             $contentObjectAttribute->setAttribute( 'data_text', $matrix->xmlString() );
177             $matrix->decodeXML( $contentObjectAttribute->attribute( 'data_text' ) );
178             $contentObjectAttribute->setContent( $matrix );
179         }
180         return true;
181     }
182
183     /*!
184     */
185     function customObjectAttributeHTTPAction( $http, $action, &$contentObjectAttribute )
186     {
187         switch ( $action )
188         {
189             case 'new_row' :
190             {
191                 $matrix =& $contentObjectAttribute->content( );
192
193                 $postvarname = 'ContentObjectAttribute' . '_data_matrix_remove_' . $contentObjectAttribute->attribute( 'id' );
194                 $addCountName = 'ContentObjectAttribute' . '_data_matrix_add_count_' . $contentObjectAttribute->attribute( 'id' );
195
196                 $addCount = 1;
197                 if ( $http->hasPostVariable( $addCountName ) )
198                 {
199                     $addCount = $http->postVariable( $addCountName );
200                 }
201
202                 if ( $http->hasPostVariable( $postvarname ) )
203                 {
204                     $selected = $http->postVariable( $postvarname );
205                     $matrix->addRow( $selected[0], $addCount );
206                 }
207                 else
208                 {
209                     $matrix->addRow( false, $addCount );
210                 }
211
212                 $contentObjectAttribute->setAttribute( 'data_text', $matrix->xmlString() );
213                 $matrix->decodeXML( $contentObjectAttribute->attribute( 'data_text' ) );
214                 $contentObjectAttribute->setContent( $matrix );
215                 $contentObjectAttribute->store();
216             }break;
217             case 'remove_selected' :
218             {
219                 $matrix =& $contentObjectAttribute->content( );
220                 $postvarname = 'ContentObjectAttribute' . '_data_matrix_remove_' . $contentObjectAttribute->attribute( 'id' );
221                 $arrayRemove = $http->postVariable( $postvarname );
222
223                 rsort( $arrayRemove );
224                 foreach ( $arrayRemove as $rowNum)
225                 {
226                     $matrix->removeRow( $rowNum );
227                 }
228
229                 $contentObjectAttribute->setAttribute( 'data_text', $matrix->xmlString() );
230                 $matrix->decodeXML( $contentObjectAttribute->attribute( 'data_text' ) );
231                 $contentObjectAttribute->setContent( $matrix );
232                 $contentObjectAttribute->store();
233             }break;
234             default :
235             {
236                 eZDebug::writeError( 'Unknown custom HTTP action: ' . $action, 'eZMatrixType' );
237             }break;
238         }
239     }
240
241     /*!
242      Returns the integer value.
243     */
244     function title( &$contentObjectAttribute, $name = 'name' )
245     {
246         $matrix =& $contentObjectAttribute->content( );
247
248         $value = $matrix->attribute( $name );
249
250         return $value;
251     }
252
253     /*!
254      Sets the default value.
255     */
256     function initializeObjectAttribute( &$contentObjectAttribute, $currentVersion, &$originalContentObjectAttribute )
257     {
258
259         if ( $currentVersion != false )
260         {
261             $matrix =& $originalContentObjectAttribute->content();
262             $contentClassAttribute =& $contentObjectAttribute->contentClassAttribute();
263             // make sure that $matrix contains right columns
264             $matrix->adjustColumnsToDefinition( $contentClassAttribute->attribute( 'content' ) );
265
266             $contentObjectAttribute->setAttribute( 'data_text', $matrix->xmlString() );
267             $contentObjectAttribute->setContent( $matrix );
268         }
269         else
270         {
271             $contentClassAttribute =& $contentObjectAttribute->contentClassAttribute();
272             $numRows = $contentClassAttribute->attribute( 'data_int1' );
273             $matrix = new eZMatrix( '', $numRows, $contentClassAttribute->attribute( 'content' ) );
274             // 'default name' is never used => just a stub
275             // $matrix->setName( $contentClassAttribute->attribute( 'data_text1' ) );
276             $contentObjectAttribute->setAttribute( 'data_text', $matrix->xmlString() );
277             $contentObjectAttribute->setContent( $matrix );
278         }
279
280     }
281
282     /*!
283      \reimp
284     */
285     function fetchClassAttributeHTTPInput( &$http, $base, &$classAttribute )
286     {
287         // 'default name' is never used => just a stub
288         // $defaultValueName = $base . EZ_MATRIX_DEFAULT_NAME_VARIABLE . $classAttribute->attribute( 'id' );
289         $defaultValueName = '';
290         $defaultNumColumnsName = $base . EZ_MATRIX_NUMCOLUMNS_VARIABLE . $classAttribute->attribute( 'id' );
291         $defaultNumRowsName = $base . EZ_MATRIX_NUMROWS_VARIABLE . $classAttribute->attribute( 'id' );
292         $dataFetched = false;
293         // 'default name' is never used => just a stub
294         /*
295         if ( $http->hasPostVariable( $defaultValueName ) )
296         {
297             $defaultValueValue = $http->postVariable( $defaultValueName );
298
299             if ( $defaultValueValue == '' )
300             {
301                 $defaultValueValue = '';
302             }
303             $classAttribute->setAttribute( 'data_text1', $defaultValueValue );
304             $dataFetched = true;
305         }
306         */
307
308         if ( $http->hasPostVariable( $defaultNumRowsName ) )
309         {
310             $defaultNumRowsValue = $http->postVariable( $defaultNumRowsName );
311
312             if ( $defaultNumRowsValue == '' )
313             {
314                 $defaultNumRowsValue = '1';
315             }
316             $classAttribute->setAttribute( 'data_int1', $defaultNumRowsValue );
317             $dataFetched = true;
318         }
319
320         $columnNameVariable = $base . '_data_ezmatrix_column_name_' . $classAttribute->attribute( 'id' );
321         $columnIDVariable = $base . '_data_ezmatrix_column_id_' . $classAttribute->attribute( 'id' );
322
323
324         if ( $http->hasPostVariable( $columnNameVariable ) && $http->hasPostVariable( $columnIDVariable ) )
325         {
326             $columns = array();
327             $i = 0;
328             $columnNameList = $http->postVariable( $columnNameVariable );
329             $columnIDList = $http->postVariable( $columnIDVariable );
330
331             $matrixDefinition =& $classAttribute->attribute( 'content' );
332             $columnNames =& $matrixDefinition->attribute( 'columns' );
333             foreach ( $columnNames as $columnName )
334             {
335                 $columnID = '';
336                 $name = '';
337                 $index = $columnName['index'];
338
339                 // after adding a new column $columnIDList and $columnNameList doesn't contain values for new column.
340                 // if so just add column with empty 'name' and 'columnID'.
341                 if ( isset( $columnIDList[$index] ) && isset( $columnNameList[$index] ) )
342                 {
343                     $columnID = $columnIDList[$index];
344                     $name = $columnNameList[$index];
345                     if ( strlen( $columnID ) == 0 )
346                     {
347                         $columnID = $name;
348                         // Initialize transformation system
349                         include_once( 'lib/ezi18n/classes/ezchartransform.php' );
350                         $trans =& eZCharTransform::instance();
351                         $columnID = $trans->transformByGroup( $columnID, 'identifier' );
352                     }
353                 }
354
355                 $columns[] = array( 'name' => $name,
356                                     'identifier' => $columnID,
357                                     'index' => $i );
358
359                 $i++;
360             }
361
362             $matrixDefinition->ColumnNames =& $columns;
363             $classAttribute->setContent( $matrixDefinition );
364             $classAttribute->setAttribute( 'data_text5', $matrixDefinition->xmlString() );
365
366             $dataFetched = true;
367         }
368         if ( $dataFetched )
369         {
370             return true;
371         }
372         return false;
373
374     }
375
376
377     /*!
378      Returns the content.
379     */
380     function &classAttributeContent( &$contentClassAttribute )
381     {
382         $matrixDefinition = new eZMatrixDefinition();
383         $matrixDefinition->decodeClassAttribute( $contentClassAttribute->attribute( 'data_text5' ) );
384         return $matrixDefinition;
385     }
386
387     /*!
388     */
389     function customClassAttributeHTTPAction( &$http, $action, &$contentClassAttribute )
390     {
391         $id = $contentClassAttribute->attribute( 'id' );
392         switch ( $action )
393         {
394             case 'new_ezmatrix_column' :
395             {
396                 $matrixDefinition =& $contentClassAttribute->content( );
397                 $matrixDefinition->addColumn( '' );
398                 $contentClassAttribute->setContent( $matrixDefinition );
399                 $contentClassAttribute->store();
400             }break;
401             case 'remove_selected' :
402             {
403                 $matrixDefinition =& $contentClassAttribute->content( );
404
405                 $postvarname = 'ContentClass' . '_data_ezmatrix_column_remove_' . $contentClassAttribute->attribute( 'id' );
406                 $array_remove = $http->postVariable( $postvarname );
407                 foreach( $array_remove as $columnIndex )
408                 {
409                     $matrixDefinition->removeColumn( $columnIndex );
410                 }
411                 $contentClassAttribute->setContent( $matrixDefinition );
412             }break;
413             default :
414             {
415                 eZDebug::writeError( 'Unknown custom HTTP action: ' . $action, 'eZEnumType' );
416             }break;
417         }
418     }
419
420     /*!
421      \reimp
422     */
423     function isIndexable()
424     {
425         return true;
426     }
427
428     /*!
429      \reimp
430     */
431     function serializeContentClassAttribute( &$classAttribute, &$attributeNode, &$attributeParametersNode )
432     {
433         $content =& $classAttribute->content();
434         if ( $content )
435         {
436             $defaultName = $classAttribute->attribute( 'data_text1' );
437             $defaultRowCount = $classAttribute->attribute( 'data_int1' );
438             $columns = $content->attribute( 'columns' );
439             $attributeParametersNode->appendChild( eZDOMDocument::createElementTextNode( 'default-name', $defaultName ) );
440             $attributeParametersNode->appendChild( eZDOMDocument::createElementTextNode( 'default-row-count', $defaultRowCount ) );
441             $columnsNode = eZDOMDocument::createElementNode( 'columns' );
442             $attributeParametersNode->appendChild( $columnsNode );
443             foreach ( $columns as $column )
444             {
445                 $columnsNode->appendChild( eZDOMDocument::createElementNode( 'column',
446                                                                              array( 'name' => $column['name'],
447                                                                                     'identifier' => $column['identifier'],
448                                                                                     'index' => $column['index'] ) ) );
449             }
450         }
451     }
452
453     /*!
454      \reimp
455     */
456     function unserializeContentClassAttribute( &$classAttribute, &$attributeNode, &$attributeParametersNode )
457     {
458         $defaultName = $attributeParametersNode->elementTextContentByName( 'default-name' );
459         $defaultRowCount = $attributeParametersNode->elementTextContentByName( 'default-row-count' );
460         $classAttribute->setAttribute( 'data_text1', $defaultName );
461         $classAttribute->setAttribute( 'data_int1', $defaultRowCount );
462
463         $matrixDefinition = new eZMatrixDefinition();
464         $columnsNode =& $attributeParametersNode->elementByName( 'columns' );
465         $columnsList = $columnsNode->children();
466         foreach ( $columnsList  as $columnNode )
467         {
468             $columnName = $columnNode->attributeValue( 'name' );
469             $columnIdentifier = $columnNode->attributeValue( 'identifier' );
470             $matrixDefinition->addColumn( $columnName, $columnIdentifier );
471         }
472         $classAttribute->setAttribute( 'data_text5', $matrixDefinition->xmlString() );
473     }
474
475     /*!
476      \reimp
477     */
478     function serializeContentObjectAttribute( &$package, &$objectAttribute )
479     {
480         $node = $this->createContentObjectAttributeDOMNode( $objectAttribute );
481
482         $xml = new eZXML();
483         $domDocument = $xml->domTree( $objectAttribute->attribute( 'data_text' ) );
484         $node->appendChild( $domDocument->root() );
485
486         return $node;
487     }
488
489     /*!
490      \reimp
491     */
492     function unserializeContentObjectAttribute( &$package, &$objectAttribute, $attributeNode )
493     {
494         $rootNode = $attributeNode->firstChild();
495         $xmlString = $rootNode->attributeValue( 'local_name' ) == 'data-text' ? $rootNode->toString( 0 ) : '';
496         $objectAttribute->setAttribute( 'data_text', $xmlString );
497     }
498 }
499
500 eZDataType::register( EZ_DATATYPESTRING_MATRIX, 'ezmatrixtype' );
501
502 ?>