- Removed debug output from eZMatrix datatype
[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-2004 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
39 /*! \file ezmatrixtype.php
40 */
41
42 /*!
43   \class eZMatrixType ezmatrixtype.php
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 /*        if ( $http->hasPostVariable( $base . '_data_option_id_' . $contentObjectAttribute->attribute( 'id' ) ) )
77         {
78                     return EZ_INPUT_VALIDATOR_STATE_INVALID;
79         }
80 */      return EZ_INPUT_VALIDATOR_STATE_ACCEPTED;
81     }
82
83     /*!
84      Store content
85     */
86     function storeObjectAttribute( &$contentObjectAttribute )
87     {
88         $matrix =& $contentObjectAttribute->content();
89         $contentObjectAttribute->setAttribute( 'data_text', $matrix->xmlString() );
90         $matrix->decodeXML( $contentObjectAttribute->attribute( 'data_text' ) );
91         $contentObjectAttribute->setContent( $matrix );
92     }
93
94     function storeClassAttribute( &$contentClassAttribute, $version )
95     {
96         $matrixDefinition =& $contentClassAttribute->content();
97         $contentClassAttribute->setAttribute( 'data_text5', $matrixDefinition->xmlString() );
98         $matrixDefinition->decodeClassAttribute( $contentClassAttribute->attribute( 'data_text5' ) );
99         $contentClassAttribute->setContent(  $matrixDefinition );
100     }
101
102     /*!
103      Returns the content.
104     */
105     function &objectAttributeContent( &$contentObjectAttribute )
106     {
107         $matrix = new eZMatrix( '' );
108
109         $matrix->decodeXML( $contentObjectAttribute->attribute( 'data_text' ) );
110
111         return $matrix;
112     }
113
114     function hasObjectAttributeContent( &$contentObjectAttribute )
115     {
116         $matrix =& $contentObjectAttribute->content();
117         $columnsArray =& $matrix->attribute( 'columns' );
118         $columns =& $columnsArray['sequential'];
119         $count = 0;
120         foreach ( $columns as $column )
121         {
122             $count += count( $column['rows'] );
123         }
124         return $count > 0;
125     }
126
127     /*!
128      Returns the meta data used for storing search indeces.
129     */
130     function metaData( $contentObjectAttribute )
131     {
132         $matrix =& $contentObjectAttribute->content();
133         $columnsArray =& $matrix->attribute( 'columns' );
134         $columns =& $columnsArray['sequential'];
135         $metaDataArray = array();
136         foreach ( $columns as $column )
137         {
138             $rows = $column['rows'];
139             foreach ( $rows as $row )
140             {
141                 $metaDataArray[] = array( 'id' => $column['identifier'],
142                                           'text' => $row );
143             }
144         }
145         return $metaDataArray;
146     }
147
148     /*!
149      Fetches the http post var matrix cells input and stores it in the data instance.
150     */
151     function fetchObjectAttributeHTTPInput( &$http, $base, &$contentObjectAttribute )
152     {
153         $cellsVarName = $base . EZ_MATRIX_CELL_VARIABLE . $contentObjectAttribute->attribute( 'id' );
154         if ( $http->hasPostVariable( $cellsVarName ) )
155         {
156             $cells = array();
157             foreach ( $http->postVariable( $cellsVarName ) as $cell )
158             {
159                 $cells[] = $cell;
160             }
161             $matrix =& $contentObjectAttribute->attribute( 'content' );
162             $matrix->Cells =& $cells;
163
164             $contentObjectAttribute->setAttribute( 'data_text', $matrix->xmlString() );
165             $matrix->decodeXML( $contentObjectAttribute->attribute( 'data_text' ) );
166             $contentObjectAttribute->setContent( $matrix );
167         }
168         return true;
169     }
170
171     /*!
172     */
173     function customObjectAttributeHTTPAction( $http, $action, &$contentObjectAttribute )
174     {
175         switch ( $action )
176         {
177             case 'new_row' :
178             {
179                 $matrix =& $contentObjectAttribute->content( );
180
181                 $postvarname = 'ContentObjectAttribute' . '_data_matrix_remove_' . $contentObjectAttribute->attribute( 'id' );
182                 $addCountName = 'ContentObjectAttribute' . '_data_matrix_add_count_' . $contentObjectAttribute->attribute( 'id' );
183
184                 $addCount = 1;
185                 if ( $http->hasPostVariable( $addCountName ) )
186                 {
187                     $addCount = $http->postVariable( $addCountName );
188                 }
189
190                 if ( $http->hasPostVariable( $postvarname ) )
191                 {
192                     $selected = $http->postVariable( $postvarname );
193                     $matrix->addRow( $selected[0], $addCount );
194                 }
195                 else
196                 {
197                     $matrix->addRow( false, $addCount );
198                 }
199
200                 $contentObjectAttribute->setAttribute( 'data_text', $matrix->xmlString() );
201                 $matrix->decodeXML( $contentObjectAttribute->attribute( 'data_text' ) );
202                 $contentObjectAttribute->setContent( $matrix );
203                 $contentObjectAttribute->store();
204             }break;
205             case 'remove_selected' :
206             {
207                 $matrix =& $contentObjectAttribute->content( );
208                 $postvarname = 'ContentObjectAttribute' . '_data_matrix_remove_' . $contentObjectAttribute->attribute( 'id' );
209                 $arrayRemove = $http->postVariable( $postvarname );
210
211                 foreach ( $arrayRemove as $rowNum)
212                 {
213                     $matrix->removeRow( $rowNum );
214                 }
215
216                 $contentObjectAttribute->setAttribute( 'data_text', $matrix->xmlString() );
217                 $matrix->decodeXML( $contentObjectAttribute->attribute( 'data_text' ) );
218                 $contentObjectAttribute->setContent( $matrix );
219                 $contentObjectAttribute->store();
220             }break;
221             default :
222             {
223                 eZDebug::writeError( 'Unknown custom HTTP action: ' . $action, 'eZMatrixType' );
224             }break;
225         }
226     }
227
228     /*!
229      Returns the integer value.
230     */
231     function title( &$contentObjectAttribute, $name = 'name' )
232     {
233         $matrix =& $contentObjectAttribute->content( );
234
235         $value = $matrix->attribute( $name );
236
237         return $value;
238     }
239
240     /*!
241      Sets the default value.
242     */
243     function initializeObjectAttribute( &$contentObjectAttribute, $currentVersion, &$originalContentObjectAttribute )
244     {
245
246         if ( $currentVersion != false )
247         {
248             $matrix =& $contentObjectAttribute->content();
249             $contentClassAttribute =& $contentObjectAttribute->contentClassAttribute();
250             $matrix->setName( $contentClassAttribute->attribute( 'data_text1' ) );
251             $contentObjectAttribute->setAttribute( 'data_text', $matrix->xmlString() );
252             $contentObjectAttribute->setContent( $matrix );
253         }
254         else
255         {
256             $contentClassAttribute =& $contentObjectAttribute->contentClassAttribute();
257             $numRows = $contentClassAttribute->attribute( 'data_int1' );
258             $matrix = new eZMatrix( '', $numRows, $contentClassAttribute->attribute( 'content' ) );
259             $contentObjectAttribute->setAttribute( 'data_text', $matrix->xmlString() );
260             $contentObjectAttribute->setContent( $matrix );
261         }
262
263     }
264
265     /*!
266      \reimp
267     */
268     function fetchClassAttributeHTTPInput( &$http, $base, &$classAttribute )
269     {
270         $defaultValueName = $base . EZ_MATRIX_DEFAULT_NAME_VARIABLE . $classAttribute->attribute( 'id' );
271         $defaultNumColumnsName = $base . EZ_MATRIX_NUMCOLUMNS_VARIABLE . $classAttribute->attribute( 'id' );
272         $defaultNumRowsName = $base . EZ_MATRIX_NUMROWS_VARIABLE . $classAttribute->attribute( 'id' );
273         $dataFetched = false;
274         if ( $http->hasPostVariable( $defaultValueName ) )
275         {
276             $defaultValueValue = $http->postVariable( $defaultValueName );
277
278             if ( $defaultValueValue == '' )
279             {
280                 $defaultValueValue = '';
281             }
282             $classAttribute->setAttribute( 'data_text1', $defaultValueValue );
283             $dataFetched = true;
284         }
285
286         if ( $http->hasPostVariable( $defaultNumRowsName ) )
287         {
288             $defaultNumRowsValue = $http->postVariable( $defaultNumRowsName );
289
290             if ( $defaultNumRowsValue == '' )
291             {
292                 $defaultNumRowsValue = '1';
293             }
294             $classAttribute->setAttribute( 'data_int1', $defaultNumRowsValue );
295             $dataFetched = true;
296         }
297
298         $columnNameVariable = $base . '_data_ezmatrix_column_name_' . $classAttribute->attribute( 'id' );
299         $columnIDVariable = $base . '_data_ezmatrix_column_id_' . $classAttribute->attribute( 'id' );
300
301
302         if ( $http->hasPostVariable( $columnNameVariable ) && $http->hasPostVariable( $columnIDVariable ) )
303         {
304             $columns = array();
305             $i = 0;
306             $columnNameList = $http->postVariable( $columnNameVariable );
307             $columnIDList = $http->postVariable( $columnIDVariable );
308
309             $matrixDefinition =& $classAttribute->attribute( 'content' );
310             $columnNames =& $matrixDefinition->attribute( 'columns' );
311             foreach ( $columnNames as $columnName )
312             {
313                 $index = $columnName['index'];
314                 $columnID = $columnIDList[$index];
315                 $name = $columnNameList[$index];
316                 if ( strlen( $columnID ) == 0 )
317                 {
318                     $columnID = $name;
319                     $columnID = strtolower( $columnID );
320                     $columnID = preg_replace( array( '/[^a-z0-9_ ]/' ,
321                                        '/ /',
322                                        '/__+/' ),
323                                 array( '',
324                                        '_',
325                                        '_' ),
326                                 $columnID );
327                 }
328
329                 $columns[] = array( 'name' => $name,
330                                     'identifier' => $columnID,
331                                     'index' => $i );
332
333                 $i++;
334             }
335
336             $matrixDefinition->ColumnNames =& $columns;
337             $classAttribute->setContent( $matrixDefinition );
338             $classAttribute->setAttribute( 'data_text5', $matrixDefinition->xmlString() );
339
340             $dataFetched = true;
341         }
342         if ( $dataFetched )
343         {
344             return true;
345         }
346         return false;
347
348     }
349
350
351     /*!
352      Returns the content.
353     */
354     function &classAttributeContent( &$contentClassAttribute )
355     {
356         $matrixDefinition =& new eZMatrixDefinition();
357         $matrixDefinition->decodeClassAttribute( $contentClassAttribute->attribute( 'data_text5' ) );
358         return $matrixDefinition;
359     }
360
361     /*!
362     */
363     function customClassAttributeHTTPAction( &$http, $action, &$contentClassAttribute )
364     {
365         $id = $contentClassAttribute->attribute( 'id' );
366         switch ( $action )
367         {
368             case 'new_ezmatrix_column' :
369             {
370                 $matrixDefinition =& $contentClassAttribute->content( );
371                 $matrixDefinition->addColumn( '' );
372                 $contentClassAttribute->setContent( $matrixDefinition );
373                 $contentClassAttribute->store();
374             }break;
375             case 'remove_selected' :
376             {
377                 $matrixDefinition =& $contentClassAttribute->content( );
378
379                 $postvarname = 'ContentClass' . '_data_ezmatrix_column_remove_' . $contentClassAttribute->attribute( 'id' );
380                 $array_remove = $http->postVariable( $postvarname );
381                 foreach( $array_remove as $columnIndex )
382                 {
383                     $matrixDefinition->removeColumn( $columnIndex );
384                 }
385                 $contentClassAttribute->setContent( $matrixDefinition );
386             }break;
387             default :
388             {
389                 eZDebug::writeError( 'Unknown custom HTTP action: ' . $action, 'eZEnumType' );
390             }break;
391         }
392     }
393
394     /*!
395      \reimp
396     */
397     function isIndexable()
398     {
399         return true;
400     }
401
402     /*!
403      \reimp
404     */
405     function &serializeContentClassAttribute( &$classAttribute, &$attributeNode, &$attributeParametersNode )
406     {
407         $content =& $classAttribute->content();
408         if ( $content )
409         {
410             $defaultName = $classAttribute->attribute( 'data_text1' );
411             $defaultRowCount = $classAttribute->attribute( 'data_int1' );
412             $columns = $content->attribute( 'columns' );
413             $attributeParametersNode->appendChild( eZDOMDocument::createElementTextNode( 'default-name', $defaultName ) );
414             $attributeParametersNode->appendChild( eZDOMDocument::createElementTextNode( 'default-row-count', $defaultRowCount ) );
415             $columnsNode =& eZDOMDocument::createElementNode( 'columns' );
416             $attributeParametersNode->appendChild( $columnsNode );
417             foreach ( $columns as $column )
418             {
419                 $columnsNode->appendChild( eZDOMDocument::createElementNode( 'column',
420                                                                              array( 'name' => $column['name'],
421                                                                                     'identifier' => $column['identifier'],
422                                                                                     'index' => $column['index'] ) ) );
423             }
424         }
425     }
426
427     /*!
428      \reimp
429     */
430     function &unserializeContentClassAttribute( &$classAttribute, &$attributeNode, &$attributeParametersNode )
431     {
432         $defaultName = $attributeParametersNode->elementTextContentByName( 'default-name' );
433         $defaultRowCount = $attributeParametersNode->elementTextContentByName( 'default-row-count' );
434         $classAttribute->setAttribute( 'data_text1', $defaultName );
435         $classAttribute->setAttribute( 'data_int1', $defaultRowCount );
436
437         $matrixDefinition =& new eZMatrixDefinition();
438         $columnsNode =& $attributeParametersNode->elementByName( 'columns' );
439         $columnsList =& $columnsNode->children();
440         foreach ( array_keys( $columnsList ) as $columnKey )
441         {
442             $columnNode =& $columnsList[$columnKey];
443             $columnName = $columnNode->attributeValue( 'name' );
444             $columnIdentifier = $columnNode->attributeValue( 'identifier' );
445             $matrixDefinition->addColumn( $columnName, $columnIdentifier );
446         }
447         $classAttribute->setAttribute( 'data_text5', $matrixDefinition->xmlString() );
448     }
449 }
450
451 eZDataType::register( EZ_DATATYPESTRING_MATRIX, 'ezmatrixtype' );
452
453 ?>