- Made sure the bork translator didn't translate words that start with a % (percent).
[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-2003 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' ),
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     /*!
114      Returns the meta data used for storing search indeces.
115     */
116     function metaData( $contentObjectAttribute )
117     {
118         $matrix =& $contentObjectAttribute->content();
119         $columnsArray =& $matrix->attribute( 'columns' );
120         $columns =& $columnsArray['sequential'];
121         $metaDataArray = array();
122         eZDebug::writeDebug( $matrix, 'matrix to index' );
123         foreach ( $columns as $column )
124         {
125             $rows = $column['rows'];
126             foreach ( $rows as $row )
127             {
128                 $metaDataArray[] = array( 'id' => $column['identifier'],
129                                           'text' => $row );
130             }
131         }
132 //         eZDebug::writeDebug( $metaDataArray, 'metaDataArray for matrix' );
133         return $metaDataArray;
134     }
135
136     /*!
137      Fetches the http post var matrix cells input and stores it in the data instance.
138     */
139     function fetchObjectAttributeHTTPInput( &$http, $base, &$contentObjectAttribute )
140     {
141         $cellsVarName = $base . EZ_MATRIX_CELL_VARIABLE . $contentObjectAttribute->attribute( 'id' );
142         if ( $http->hasPostVariable( $cellsVarName ) )
143         {
144             $cells = array();
145             foreach ( $http->postVariable( $cellsVarName ) as $cell )
146             {
147                 $cells[] = $cell;
148             }
149             $matrix =& $contentObjectAttribute->attribute( 'content' );
150             $matrix->Cells =& $cells;
151             $contentObjectAttribute->setContent( $matrix );
152         }
153         return true;
154     }
155
156     /*!
157     */
158     function customObjectAttributeHTTPAction( $http, $action, &$contentObjectAttribute )
159     {
160         switch ( $action )
161         {
162             case 'new_row' :
163             {
164                 $matrix =& $contentObjectAttribute->content( );
165
166                 $postvarname = 'ContentObjectAttribute' . '_data_matrix_remove_' . $contentObjectAttribute->attribute( 'id' );
167                 if ( $http->hasPostVariable( $postvarname ) )
168                 {
169                     $selected = $http->postVariable( $postvarname );
170                     $matrix->addRow( $selected[0] );
171                 }
172                 else
173                 {
174                     $matrix->addRow( );
175                 }
176                 $contentObjectAttribute->setAttribute( 'data_text', $matrix->xmlString() );
177                 $matrix->decodeXML( $contentObjectAttribute->attribute( 'data_text' ) );
178                 $contentObjectAttribute->setContent( $matrix );
179             }break;
180             case 'remove_selected' :
181             {
182                 $matrix =& $contentObjectAttribute->content( );
183                 $postvarname = 'ContentObjectAttribute' . '_data_matrix_remove_' . $contentObjectAttribute->attribute( 'id' );
184                 $arrayRemove = $http->postVariable( $postvarname );
185
186                 foreach ( $arrayRemove as $rowNum)
187                 {
188                     $matrix->removeRow( $rowNum );
189                 }
190
191                 $contentObjectAttribute->setAttribute( 'data_text', $matrix->xmlString() );
192                 $matrix->decodeXML( $contentObjectAttribute->attribute( 'data_text' ) );
193                 $contentObjectAttribute->setContent( $matrix );
194             }break;
195             default :
196             {
197                 eZDebug::writeError( 'Unknown custom HTTP action: ' . $action, 'eZMatrixType' );
198             }break;
199         }
200     }
201
202     /*!
203      Returns the integer value.
204     */
205     function title( &$contentObjectAttribute, $name = 'name' )
206     {
207         $matrix =& $contentObjectAttribute->content( );
208
209         $value = $matrix->attribute( $name );
210
211         return $value;
212     }
213
214
215     /*!
216      \return a DOM representation of the content object attribute
217     */
218     function &serializeContentObjectAttribute( $objectAttribute )
219     {
220 /*        include_once( 'lib/ezxml/classes/ezdomdocument.php' );
221         include_once( 'lib/ezxml/classes/ezdomnode.php' );
222
223         $node = new eZDOMNode();
224         $node->setName( 'attribute' );
225         $node->appendAttribute( eZDOMDocument::createAttributeNode( 'name', $objectAttribute->contentClassAttributeName() ) );
226         $node->appendAttribute( eZDOMDocument::createAttributeNode( 'type', 'ezoption' ) );
227
228         return $node;
229 */
230     }
231
232     /*!
233      Sets the default value.
234     */
235     function initializeObjectAttribute( &$contentObjectAttribute, $currentVersion, &$originalContentObjectAttribute )
236     {
237
238         if ( $currentVersion != false )
239         {
240             $matrix =& $contentObjectAttribute->content();
241             $contentClassAttribute =& $contentObjectAttribute->contentClassAttribute();
242             $matrix->setName( $contentClassAttribute->attribute( 'data_text1' ) );
243             $contentObjectAttribute->setAttribute( 'data_text', $matrix->xmlString() );
244             $contentObjectAttribute->setContent( $matrix );
245         }
246         else
247         {
248             $contentClassAttribute =& $contentObjectAttribute->contentClassAttribute();
249             $numRows = $contentClassAttribute->attribute( 'data_int1' );
250             $matrix = new eZMatrix( '', $numRows, $contentClassAttribute->attribute( 'content' ) );
251             $contentObjectAttribute->setAttribute( 'data_text', $matrix->xmlString() );
252             $contentObjectAttribute->setContent( $matrix );
253         }
254
255     }
256
257     /*!
258      \reimp
259     */
260     function fetchClassAttributeHTTPInput( &$http, $base, &$classAttribute )
261     {
262         $defaultValueName = $base . EZ_MATRIX_DEFAULT_NAME_VARIABLE . $classAttribute->attribute( 'id' );
263         $defaultNumColumnsName = $base . EZ_MATRIX_NUMCOLUMNS_VARIABLE . $classAttribute->attribute( 'id' );
264         $defaultNumRowsName = $base . EZ_MATRIX_NUMROWS_VARIABLE . $classAttribute->attribute( 'id' );
265         $dataFetched = false;
266         if ( $http->hasPostVariable( $defaultValueName ) )
267         {
268             $defaultValueValue = $http->postVariable( $defaultValueName );
269
270             if ( $defaultValueValue == '' )
271             {
272                 $defaultValueValue = '';
273             }
274             $classAttribute->setAttribute( 'data_text1', $defaultValueValue );
275             $dataFetched = true;
276         }
277
278         if ( $http->hasPostVariable( $defaultNumRowsName ) )
279         {
280             $defaultNumRowsValue = $http->postVariable( $defaultNumRowsName );
281
282             if ( $defaultNumRowsValue == '' )
283             {
284                 $defaultNumRowsValue = '1';
285             }
286             $classAttribute->setAttribute( 'data_int1', $defaultNumRowsValue );
287             $dataFetched = true;
288         }
289
290         $columnNameVariable = $base . '_data_ezmatrix_column_name_' . $classAttribute->attribute( 'id' );
291         $columnIDVariable = $base . '_data_ezmatrix_column_id_' . $classAttribute->attribute( 'id' );
292
293
294         if ( $http->hasPostVariable( $columnNameVariable ) && $http->hasPostVariable( $columnIDVariable ) )
295         {
296             $columns = array();
297             $i = 0;
298             $columnNameList = $http->postVariable( $columnNameVariable );
299             $columnIDList = $http->postVariable( $columnIDVariable );
300
301             $matrixDefinition =& $classAttribute->attribute( 'content' );
302             $columnNames =& $matrixDefinition->attribute( 'columns' );
303             foreach ( $columnNames as $columnName )
304             {
305                 $index = $columnName['index'];
306                 $columnID = $columnIDList[$index];
307                 $name = $columnNameList[$index];
308                 if ( strlen( $columnID ) == 0 )
309                 {
310                     $columnID = $name;
311                     $columnID = strtolower( $columnID );
312                     $columnID = preg_replace( array( '/[^a-z0-9_ ]/' ,
313                                        '/ /',
314                                        '/__+/' ),
315                                 array( '',
316                                        '_',
317                                        '_' ),
318                                 $columnID );
319                 }
320
321                 $columns[] = array( 'name' => $name,
322                                     'identifier' => $columnID,
323                                     'index' => $i );
324
325                 $i++;
326             }
327
328             $matrixDefinition->ColumnNames =& $columns;
329             $classAttribute->setContent( $matrixDefinition );
330             $classAttribute->setAttribute( 'data_text5', $matrixDefinition->xmlString() );
331
332             $dataFetched = true;
333         }
334         if ( $dataFetched )
335         {
336             return true;
337         }
338         return false;
339
340     }
341
342
343     /*!
344      Returns the content.
345     */
346     function &classAttributeContent( &$contentClassAttribute )
347     {
348         $matrixDefinition =& new eZMatrixDefinition();
349         $matrixDefinition->decodeClassAttribute( $contentClassAttribute->attribute( 'data_text5' ) );
350         return $matrixDefinition;
351     }
352
353     /*!
354     */
355     function customClassAttributeHTTPAction( &$http, $action, &$contentClassAttribute )
356     {
357         $id = $contentClassAttribute->attribute( 'id' );
358         switch ( $action )
359         {
360             case 'new_ezmatrix_column' :
361             {
362                 $matrixDefinition =& $contentClassAttribute->content( );
363                 $matrixDefinition->addColumn( '' );
364                 $contentClassAttribute->setContent( $matrixDefinition );
365                 $contentClassAttribute->store();
366             }break;
367             case 'remove_selected' :
368             {
369                 $matrixDefinition =& $contentClassAttribute->content( );
370
371                 $postvarname = 'ContentClass' . '_data_ezmatrix_column_remove_' . $contentClassAttribute->attribute( 'id' );
372                 $array_remove = $http->postVariable( $postvarname );
373                 foreach( $array_remove as $columnIndex )
374                 {
375                     $matrixDefinition->removeColumn( $columnIndex );
376                 }
377                 $contentClassAttribute->setContent( $matrixDefinition );
378             }break;
379             default :
380             {
381                 eZDebug::writeError( 'Unknown custom HTTP action: ' . $action, 'eZEnumType' );
382             }break;
383         }
384     }
385
386     /*!
387      \reimp
388     */
389     function isIndexable()
390     {
391         return true;
392     }
393
394     /*!
395      \reimp
396     */
397     function isInformationCollector()
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 ?>