- Added edit button link for class view.
[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.GPL included in
15 // the packaging of this file.
16 //
17 // Licencees holding valid "eZ publish professional licences" may use this
18 // file in accordance with the "eZ publish professional licence" Agreement
19 // 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" is available at
26 // http://ez.no/products/licences/professional/. For pricing of this licence
27 // please contact us via e-mail to licence@ez.no. Further contact
28 // information is available at http://ez.no/home/contact/.
29 //
30 // The "GNU General Public License" (GPL) is available at
31 // http://www.gnu.org/copyleft/gpl.html.
32 //
33 // Contact licence@ez.no if any conditions of this licencing isn't clear to
34 // you.
35 //
36
37 /*! \file ezmatrixtype.php
38 */
39
40 /*!
41   \class eZMatrixType ezmatrixtype.php
42   \brief The class eZMatrixType does
43
44 */
45
46 include_once( 'kernel/classes/ezdatatype.php' );
47 include_once( 'kernel/classes/datatypes/ezmatrix/ezmatrix.php' );
48 include_once( 'kernel/classes/datatypes/ezmatrix/ezmatrixdefinition.php' );
49
50 define( 'EZ_MATRIX_DEFAULT_NAME_VARIABLE', '_ezmatrix_default_name_' );
51
52 define( 'EZ_MATRIX_NUMCOLUMNS_VARIABLE', '_ezmatrix_default_num_columns_' );
53 define( 'EZ_MATRIX_NUMROWS_VARIABLE', '_ezmatrix_default_num_rows_' );
54 define( 'EZ_MATRIX_CELL_VARIABLE', '_ezmatrix_cell_' );
55 define( 'EZ_DATATYPESTRING_MATRIX', 'ezmatrix' );
56
57 class eZMatrixType extends eZDataType
58 {
59     /*!
60      Constructor
61     */
62     function eZMatrixType()
63     {
64         $this->eZDataType( EZ_DATATYPESTRING_MATRIX, ezi18n( 'kernel/classes/datatypes', 'Matrix', 'Datatype name' ),
65                            array( 'serialize_supported' => true ) );
66     }
67
68     /*!
69      Validates the input and returns true if the input was
70      valid for this datatype.
71     */
72     function validateObjectAttributeHTTPInput( &$http, $base, &$contentObjectAttribute )
73     {
74 /*        if ( $http->hasPostVariable( $base . '_data_option_id_' . $contentObjectAttribute->attribute( 'id' ) ) )
75         {
76                     return EZ_INPUT_VALIDATOR_STATE_INVALID;
77         }
78 */      return EZ_INPUT_VALIDATOR_STATE_ACCEPTED;
79     }
80
81     /*!
82      Store content
83     */
84     function storeObjectAttribute( &$contentObjectAttribute )
85     {
86         $matrix =& $contentObjectAttribute->content();
87         $contentObjectAttribute->setAttribute( 'data_text', $matrix->xmlString() );
88         $matrix->decodeXML( $contentObjectAttribute->attribute( 'data_text' ) );
89         $contentObjectAttribute->setContent( $matrix );
90     }
91
92     function storeClassAttribute( &$contentClassAttribute, $version )
93     {
94         $matrixDefinition =& $contentClassAttribute->content();
95         $contentClassAttribute->setAttribute( 'data_text5', $matrixDefinition->xmlString() );
96         $matrixDefinition->decodeClassAttribute( $contentClassAttribute->attribute( 'data_text5' ) );
97         $contentClassAttribute->setContent(  $matrixDefinition );
98     }
99
100     /*!
101      Returns the content.
102     */
103     function &objectAttributeContent( &$contentObjectAttribute )
104     {
105         $matrix = new eZMatrix( '' );
106
107         $matrix->decodeXML( $contentObjectAttribute->attribute( 'data_text' ) );
108
109         return $matrix;
110     }
111
112
113     function hasObjectAttributeContent( &$contentObjectAttribute )
114     {
115         $matrix =& $contentObjectAttribute->content();
116         $columnsArray =& $matrix->attribute( 'columns' );
117         $columns =& $columnsArray['sequential'];
118         $count = 0;
119         foreach ( $columns as $column )
120         {
121             $count += count( $column['rows'] );
122         }
123         return $count > 0;
124     }
125
126     /*!
127      Returns the meta data used for storing search indeces.
128     */
129     function metaData( $contentObjectAttribute )
130     {
131         $matrix =& $contentObjectAttribute->content();
132         $columnsArray =& $matrix->attribute( 'columns' );
133         $columns =& $columnsArray['sequential'];
134         $metaDataArray = array();
135         eZDebug::writeDebug( $matrix, 'matrix to index' );
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 //         eZDebug::writeDebug( $metaDataArray, 'metaDataArray for matrix' );
146         return $metaDataArray;
147     }
148
149     /*!
150      Fetches the http post var matrix cells input and stores it in the data instance.
151     */
152     function fetchObjectAttributeHTTPInput( &$http, $base, &$contentObjectAttribute )
153     {
154         $cellsVarName = $base . EZ_MATRIX_CELL_VARIABLE . $contentObjectAttribute->attribute( 'id' );
155         if ( $http->hasPostVariable( $cellsVarName ) )
156         {
157             $cells = array();
158             foreach ( $http->postVariable( $cellsVarName ) as $cell )
159             {
160                 $cells[] = $cell;
161             }
162             $matrix =& $contentObjectAttribute->attribute( 'content' );
163             $matrix->Cells =& $cells;
164             $contentObjectAttribute->setContent( $matrix );
165         }
166         return true;
167     }
168
169     /*!
170     */
171     function customObjectAttributeHTTPAction( $http, $action, &$contentObjectAttribute )
172     {
173         switch ( $action )
174         {
175             case 'new_row' :
176             {
177                 $matrix =& $contentObjectAttribute->content( );
178
179                 $postvarname = 'ContentObjectAttribute' . '_data_matrix_remove_' . $contentObjectAttribute->attribute( 'id' );
180                 if ( $http->hasPostVariable( $postvarname ) )
181                 {
182                     $selected = $http->postVariable( $postvarname );
183                     $matrix->addRow( $selected[0] );
184                 }
185                 else
186                 {
187                     $matrix->addRow( );
188                 }
189                 $contentObjectAttribute->setAttribute( 'data_text', $matrix->xmlString() );
190                 $matrix->decodeXML( $contentObjectAttribute->attribute( 'data_text' ) );
191                 $contentObjectAttribute->setContent( $matrix );
192                 $contentObjectAttribute->store();
193             }break;
194             case 'remove_selected' :
195             {
196                 $matrix =& $contentObjectAttribute->content( );
197                 $postvarname = 'ContentObjectAttribute' . '_data_matrix_remove_' . $contentObjectAttribute->attribute( 'id' );
198                 $arrayRemove = $http->postVariable( $postvarname );
199
200                 foreach ( $arrayRemove as $rowNum)
201                 {
202                     $matrix->removeRow( $rowNum );
203                 }
204
205                 $contentObjectAttribute->setAttribute( 'data_text', $matrix->xmlString() );
206                 $matrix->decodeXML( $contentObjectAttribute->attribute( 'data_text' ) );
207                 $contentObjectAttribute->setContent( $matrix );
208                 $contentObjectAttribute->store();
209             }break;
210             default :
211             {
212                 eZDebug::writeError( 'Unknown custom HTTP action: ' . $action, 'eZMatrixType' );
213             }break;
214         }
215     }
216
217     /*!
218      Returns the integer value.
219     */
220     function title( &$contentObjectAttribute, $name = 'name' )
221     {
222         $matrix =& $contentObjectAttribute->content( );
223
224         $value = $matrix->attribute( $name );
225
226         return $value;
227     }
228
229
230     /*!
231      \return a DOM representation of the content object attribute
232     */
233     function &serializeContentObjectAttribute( $objectAttribute )
234     {
235 /*        include_once( 'lib/ezxml/classes/ezdomdocument.php' );
236         include_once( 'lib/ezxml/classes/ezdomnode.php' );
237
238         $node = new eZDOMNode();
239         $node->setName( 'attribute' );
240         $node->appendAttribute( eZDOMDocument::createAttributeNode( 'name', $objectAttribute->contentClassAttributeName() ) );
241         $node->appendAttribute( eZDOMDocument::createAttributeNode( 'type', 'ezoption' ) );
242
243         return $node;
244 */
245     }
246
247     /*!
248      Sets the default value.
249     */
250     function initializeObjectAttribute( &$contentObjectAttribute, $currentVersion, &$originalContentObjectAttribute )
251     {
252
253         if ( $currentVersion != false )
254         {
255             $matrix =& $contentObjectAttribute->content();
256             $contentClassAttribute =& $contentObjectAttribute->contentClassAttribute();
257             $matrix->setName( $contentClassAttribute->attribute( 'data_text1' ) );
258             $contentObjectAttribute->setAttribute( 'data_text', $matrix->xmlString() );
259             $contentObjectAttribute->setContent( $matrix );
260         }
261         else
262         {
263             $contentClassAttribute =& $contentObjectAttribute->contentClassAttribute();
264             $numRows = $contentClassAttribute->attribute( 'data_int1' );
265             $matrix = new eZMatrix( '', $numRows, $contentClassAttribute->attribute( 'content' ) );
266             $contentObjectAttribute->setAttribute( 'data_text', $matrix->xmlString() );
267             $contentObjectAttribute->setContent( $matrix );
268         }
269
270     }
271
272     /*!
273      \reimp
274     */
275     function fetchClassAttributeHTTPInput( &$http, $base, &$classAttribute )
276     {
277         $defaultValueName = $base . EZ_MATRIX_DEFAULT_NAME_VARIABLE . $classAttribute->attribute( 'id' );
278         $defaultNumColumnsName = $base . EZ_MATRIX_NUMCOLUMNS_VARIABLE . $classAttribute->attribute( 'id' );
279         $defaultNumRowsName = $base . EZ_MATRIX_NUMROWS_VARIABLE . $classAttribute->attribute( 'id' );
280         $dataFetched = false;
281         if ( $http->hasPostVariable( $defaultValueName ) )
282         {
283             $defaultValueValue = $http->postVariable( $defaultValueName );
284
285             if ( $defaultValueValue == '' )
286             {
287                 $defaultValueValue = '';
288             }
289             $classAttribute->setAttribute( 'data_text1', $defaultValueValue );
290             $dataFetched = true;
291         }
292
293         if ( $http->hasPostVariable( $defaultNumRowsName ) )
294         {
295             $defaultNumRowsValue = $http->postVariable( $defaultNumRowsName );
296
297             if ( $defaultNumRowsValue == '' )
298             {
299                 $defaultNumRowsValue = '1';
300             }
301             $classAttribute->setAttribute( 'data_int1', $defaultNumRowsValue );
302             $dataFetched = true;
303         }
304
305         $columnNameVariable = $base . '_data_ezmatrix_column_name_' . $classAttribute->attribute( 'id' );
306         $columnIDVariable = $base . '_data_ezmatrix_column_id_' . $classAttribute->attribute( 'id' );
307
308
309         if ( $http->hasPostVariable( $columnNameVariable ) && $http->hasPostVariable( $columnIDVariable ) )
310         {
311             $columns = array();
312             $i = 0;
313             $columnNameList = $http->postVariable( $columnNameVariable );
314             $columnIDList = $http->postVariable( $columnIDVariable );
315
316             $matrixDefinition =& $classAttribute->attribute( 'content' );
317             $columnNames =& $matrixDefinition->attribute( 'columns' );
318             foreach ( $columnNames as $columnName )
319             {
320                 $index = $columnName['index'];
321                 $columnID = $columnIDList[$index];
322                 $name = $columnNameList[$index];
323                 if ( strlen( $columnID ) == 0 )
324                 {
325                     $columnID = $name;
326                     $columnID = strtolower( $columnID );
327                     $columnID = preg_replace( array( '/[^a-z0-9_ ]/' ,
328                                        '/ /',
329                                        '/__+/' ),
330                                 array( '',
331                                        '_',
332                                        '_' ),
333                                 $columnID );
334                 }
335
336                 $columns[] = array( 'name' => $name,
337                                     'identifier' => $columnID,
338                                     'index' => $i );
339
340                 $i++;
341             }
342
343             $matrixDefinition->ColumnNames =& $columns;
344             $classAttribute->setContent( $matrixDefinition );
345             $classAttribute->setAttribute( 'data_text5', $matrixDefinition->xmlString() );
346
347             $dataFetched = true;
348         }
349         if ( $dataFetched )
350         {
351             return true;
352         }
353         return false;
354
355     }
356
357
358     /*!
359      Returns the content.
360     */
361     function &classAttributeContent( &$contentClassAttribute )
362     {
363         $matrixDefinition =& new eZMatrixDefinition();
364         $matrixDefinition->decodeClassAttribute( $contentClassAttribute->attribute( 'data_text5' ) );
365         return $matrixDefinition;
366     }
367
368     /*!
369     */
370     function customClassAttributeHTTPAction( &$http, $action, &$contentClassAttribute )
371     {
372         $id = $contentClassAttribute->attribute( 'id' );
373         switch ( $action )
374         {
375             case 'new_ezmatrix_column' :
376             {
377                 $matrixDefinition =& $contentClassAttribute->content( );
378                 $matrixDefinition->addColumn( '' );
379                 $contentClassAttribute->setContent( $matrixDefinition );
380                 $contentClassAttribute->store();
381             }break;
382             case 'remove_selected' :
383             {
384                 $matrixDefinition =& $contentClassAttribute->content( );
385
386                 $postvarname = 'ContentClass' . '_data_ezmatrix_column_remove_' . $contentClassAttribute->attribute( 'id' );
387                 $array_remove = $http->postVariable( $postvarname );
388                 foreach( $array_remove as $columnIndex )
389                 {
390                     $matrixDefinition->removeColumn( $columnIndex );
391                 }
392                 $contentClassAttribute->setContent( $matrixDefinition );
393             }break;
394             default :
395             {
396                 eZDebug::writeError( 'Unknown custom HTTP action: ' . $action, 'eZEnumType' );
397             }break;
398         }
399     }
400
401     /*!
402      \reimp
403     */
404     function isIndexable()
405     {
406         return true;
407     }
408
409     /*!
410      \reimp
411     */
412     function &serializeContentClassAttribute( &$classAttribute, &$attributeNode, &$attributeParametersNode )
413     {
414         $content =& $classAttribute->content();
415         if ( $content )
416         {
417             $defaultName = $classAttribute->attribute( 'data_text1' );
418             $defaultRowCount = $classAttribute->attribute( 'data_int1' );
419             $columns = $content->attribute( 'columns' );
420             $attributeParametersNode->appendChild( eZDOMDocument::createElementTextNode( 'default-name', $defaultName ) );
421             $attributeParametersNode->appendChild( eZDOMDocument::createElementTextNode( 'default-row-count', $defaultRowCount ) );
422             $columnsNode =& eZDOMDocument::createElementNode( 'columns' );
423             $attributeParametersNode->appendChild( $columnsNode );
424             foreach ( $columns as $column )
425             {
426                 $columnsNode->appendChild( eZDOMDocument::createElementNode( 'column',
427                                                                              array( 'name' => $column['name'],
428                                                                                     'identifier' => $column['identifier'],
429                                                                                     'index' => $column['index'] ) ) );
430             }
431         }
432     }
433
434     /*!
435      \reimp
436     */
437     function &unserializeContentClassAttribute( &$classAttribute, &$attributeNode, &$attributeParametersNode )
438     {
439         $defaultName = $attributeParametersNode->elementTextContentByName( 'default-name' );
440         $defaultRowCount = $attributeParametersNode->elementTextContentByName( 'default-row-count' );
441         $classAttribute->setAttribute( 'data_text1', $defaultName );
442         $classAttribute->setAttribute( 'data_int1', $defaultRowCount );
443
444         $matrixDefinition =& new eZMatrixDefinition();
445         $columnsNode =& $attributeParametersNode->elementByName( 'columns' );
446         $columnsList =& $columnsNode->children();
447         foreach ( array_keys( $columnsList ) as $columnKey )
448         {
449             $columnNode =& $columnsList[$columnKey];
450             $columnName = $columnNode->attributeValue( 'name' );
451             $columnIdentifier = $columnNode->attributeValue( 'identifier' );
452             $matrixDefinition->addColumn( $columnName, $columnIdentifier );
453         }
454         $classAttribute->setAttribute( 'data_text5', $matrixDefinition->xmlString() );
455     }
456 }
457
458 eZDataType::register( EZ_DATATYPESTRING_MATRIX, 'ezmatrixtype' );
459
460 ?>