- Fixed #16160: Call to undefined function ezi18n()
[tinyz:tinyz.git] / kernel / classes / datatypes / ezcountry / ezcountrytype.php
1 <?php
2 //
3 // Definition of eZCountryType class
4 //
5 // Created on: <20-Feb-2006 11:11:19 vs>
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 eZCountryType ezcountrytype.php
33   \ingroup eZDatatype
34   \brief A content datatype that contains country.
35
36   The list of countries is fetched from contenet.ini.
37   Country is stored as text string.
38 */
39
40
41
42 class eZCountryType extends eZDataType
43 {
44     const DATA_TYPE_STRING = 'ezcountry';
45
46     const DEFAULT_LIST_FIELD = 'data_text5';
47
48     const MULTIPLE_CHOICE_FIELD = 'data_int1';
49
50     function eZCountryType()
51     {
52         $this->eZDataType( self::DATA_TYPE_STRING, ezpI18n::translate( 'kernel/classes/datatypes', 'Country', 'Datatype name' ),
53                            array( 'serialize_supported' => true,
54                                   'object_serialize_map' => array( 'data_text' => 'country' ) ) );
55     }
56
57     /*!
58      Fetches country list from ini.
59     */
60     static function fetchCountryList()
61     {
62         if ( isset( $GLOBALS['CountryList'] ) )
63             return $GLOBALS['CountryList'];
64
65         $ini = eZINI::instance( 'country.ini' );
66         $countries = $ini->getNamedArray();
67         eZCountryType::fetchTranslatedNames( $countries );
68         $GLOBALS['CountryList'] = $countries;
69         return $countries;
70     }
71
72     /*!
73       Fetches translated country names from locale
74       \a $countries will be updated.
75     */
76     static function fetchTranslatedNames( &$countries )
77     {
78         $locale = eZLocale::instance();
79         $translatedCountryNames = $locale->translatedCountryNames();
80         foreach ( array_keys( $countries ) as $countryKey )
81         {
82             $translatedName = isset( $translatedCountryNames[$countryKey] ) ? $translatedCountryNames[$countryKey] : false;
83             if ( $translatedName )
84                 $countries[$countryKey]['Name'] = $translatedName;
85         }
86         usort( $countries, 'eZCountryType::compareCountryNames' );
87     }
88
89     /**
90      * Sort callback used by fetchTranslatedNames to compare two country arrays
91      *
92      * @param array $a Country 1
93      * @param array $b Country 2
94      * @return bool
95      */
96     protected static function compareCountryNames( $a, $b )
97     {
98         return strcoll( $a["Name"], $b["Name"] );
99     }
100
101     /*!
102       Fetches country by \a $fetchBy.
103       if \a $fetchBy is false country name will be used.
104     */
105     static function fetchCountry( $value, $fetchBy = false )
106     {
107         $fetchBy = !$fetchBy ? 'Name' : $fetchBy;
108
109         $allCountries = eZCountryType::fetchCountryList();
110         $result = false;
111         if ( $fetchBy == 'Alpha2' and isset( $allCountries[strtoupper( $value )] ) )
112         {
113             $result = $allCountries[$value];
114             return $result;
115         }
116
117         foreach ( $allCountries as $country )
118         {
119             if ( isset( $country[$fetchBy] ) and $country[$fetchBy] == $value )
120             {
121                 $result = $country;
122                 break;
123             }
124         }
125
126         return $result;
127     }
128
129     function fetchClassAttributeHTTPInput( $http, $base, $classAttribute )
130     {
131         $classAttributeID = $classAttribute->attribute( 'id' );
132         $content = $classAttribute->content();
133
134         if ( $http->hasPostVariable( $base . '_ezcountry_multiple_choice_value_' . $classAttribute->attribute( 'id' ) . '_exists' ) )
135         {
136              $content['multiple_choice'] = $http->hasPostVariable( $base . "_ezcountry_ismultiple_value_" . $classAttributeID ) ? 1 : 0;
137         }
138
139         if ( $http->hasPostVariable( $base . '_ezcountry_default_selection_value_' . $classAttribute->attribute( 'id' ) . '_exists' ) )
140         {
141             if ( $http->hasPostVariable( $base . "_ezcountry_default_country_list_". $classAttributeID ) )
142             {
143                 $defaultValues = $http->postVariable( $base . "_ezcountry_default_country_list_". $classAttributeID );
144                 $defaultList = array();
145                 foreach ( $defaultValues as $alpha2 )
146                 {
147                     if ( trim( $alpha2 ) == '' )
148                         continue;
149                     // Fetch ezcountry by aplha2 code (as reserved in iso-3166 code list)
150                     $eZCountry = eZCountryType::fetchCountry( $alpha2, 'Alpha2' );
151                     if ( $eZCountry )
152                         $defaultList[$alpha2] = $eZCountry;
153                 }
154                 $content['default_countries'] = $defaultList;
155             }
156             else
157             {
158                 $content['default_countries'] = array();
159             }
160         }
161         $classAttribute->setContent( $content );
162         $classAttribute->store();
163         return true;
164     }
165
166     function preStoreClassAttribute( $classAttribute, $version )
167     {
168         $content = $classAttribute->content();
169         return eZCountryType::storeClassAttributeContent( $classAttribute, $content );
170     }
171
172     function storeClassAttributeContent( $classAttribute, $content )
173     {
174         if ( is_array( $content ) )
175         {
176             $multipleChoice = $content['multiple_choice'];
177             $defaultCountryList = $content['default_countries'];
178             $defaultCountry = implode( ',', array_keys( $defaultCountryList ) );
179
180             $classAttribute->setAttribute( self::DEFAULT_LIST_FIELD, $defaultCountry );
181             $classAttribute->setAttribute( self::MULTIPLE_CHOICE_FIELD, $multipleChoice );
182         }
183         return false;
184     }
185
186     /*!
187      Sets the default value.
188     */
189     function initializeObjectAttribute( $contentObjectAttribute, $currentVersion, $originalContentObjectAttribute )
190     {
191         if ( $currentVersion != false )
192         {
193             $dataText = $originalContentObjectAttribute->content();
194             $contentObjectAttribute->setContent( $dataText );
195         }
196         else
197         {
198             $default = array( 'value' => array() );
199             $contentObjectAttribute->setContent( $default );
200         }
201     }
202
203     function validateObjectAttributeHTTPInput( $http, $base, $contentObjectAttribute )
204     {
205         if ( !$contentObjectAttribute->validateIsRequired() )
206             return eZInputValidator::STATE_ACCEPTED;
207
208         if ( $http->hasPostVariable( $base . '_country_' . $contentObjectAttribute->attribute( 'id' ) ) )
209         {
210             $data = $http->postVariable( $base . '_country_' . $contentObjectAttribute->attribute( 'id' ) );
211
212             if ( count( $data ) > 0 and $data[0] != '' )
213                 return eZInputValidator::STATE_ACCEPTED;
214         }
215
216         $contentObjectAttribute->setValidationError( ezpI18n::translate( 'kernel/classes/datatypes',
217                                                              'Input required.' ) );
218         return eZInputValidator::STATE_INVALID;
219     }
220
221     function validateCollectionAttributeHTTPInput( $http, $base, $contentObjectAttribute )
222     {
223         if ( !$contentObjectAttribute->validateIsRequired() )
224             return eZInputValidator::STATE_ACCEPTED;
225
226         if ( $http->hasPostVariable( $base . '_country_' . $contentObjectAttribute->attribute( 'id' ) ) )
227         {
228             $data = $http->postVariable( $base . '_country_' . $contentObjectAttribute->attribute( 'id' ) );
229
230             if ( count( $data ) > 0 and $data[0] != '' )
231                 return eZInputValidator::STATE_ACCEPTED;
232         }
233
234         $contentObjectAttribute->setValidationError( ezpI18n::translate( 'kernel/classes/datatypes',
235                                                              'Input required.' ) );
236         return eZInputValidator::STATE_INVALID;
237     }
238
239     /*!
240      Fetches the http post var and stores it in the data instance.
241     */
242     function fetchObjectAttributeHTTPInput( $http, $base, $contentObjectAttribute )
243     {
244         if ( $http->hasPostVariable( $base . '_country_' . $contentObjectAttribute->attribute( 'id' ) ) )
245         {
246             $data = $http->postVariable( $base . '_country_' . $contentObjectAttribute->attribute( 'id' ) );
247             $defaultList = array();
248             if ( is_array( $data ) )
249             {
250                 foreach ( $data as $alpha2 )
251                 {
252                     if ( trim( $alpha2 ) == '' )
253                         continue;
254
255                     $eZCountry = eZCountryType::fetchCountry( $alpha2, 'Alpha2' );
256                     if ( $eZCountry )
257                         $defaultList[$alpha2] = $eZCountry;
258                 }
259             }
260             else
261             {
262                 $countries = eZCountryType::fetchCountryList();
263                 foreach ( $countries as $country )
264                 {
265                     if ( $country['Name'] == $data )
266                     {
267                         $defaultList[$country['Alpha2']] = $country['Name'];
268                     }
269                 }
270             }
271             $content = array( 'value' => $defaultList );
272
273             $contentObjectAttribute->setContent( $content );
274         }
275         else
276         {
277             $content = array( 'value' => array() );
278             $contentObjectAttribute->setContent( $content );
279         }
280         return true;
281     }
282
283     /*!
284      Fetches the http post variables for collected information
285     */
286     function fetchCollectionAttributeHTTPInput( $collection, $collectionAttribute, $http, $base, $contentObjectAttribute )
287     {
288         if ( $http->hasPostVariable( $base . "_country_" . $contentObjectAttribute->attribute( "id" ) ) )
289         {
290             $dataText = $http->postVariable( $base . "_country_" . $contentObjectAttribute->attribute( "id" ) );
291
292             $value = implode( ',', $dataText );
293             $collectionAttribute->setAttribute( 'data_text', $value );
294             return true;
295         }
296         return false;
297     }
298
299     function storeObjectAttribute( $contentObjectAttribute )
300     {
301         $content = $contentObjectAttribute->content();
302
303         $valueArray = $content['value'];
304         $value = is_array( $valueArray ) ? implode( ',', array_keys( $valueArray ) ) : $valueArray;
305
306         $contentObjectAttribute->setAttribute( "data_text", $value );
307     }
308
309     /*!
310      Simple string insertion is supported.
311     */
312     function isSimpleStringInsertionSupported()
313     {
314         return true;
315     }
316
317     function insertSimpleString( $object, $objectVersion, $objectLanguage,
318                                  $objectAttribute, $string,
319                                  &$result )
320     {
321         $result = array( 'errors' => array(),
322                          'require_storage' => true );
323         $content = array( 'value' => $string );
324         $objectAttribute->setContent( $content );
325         return true;
326     }
327
328     /*!
329      Returns the content.
330     */
331     function objectAttributeContent( $contentObjectAttribute )
332     {
333         $value = $contentObjectAttribute->attribute( 'data_text' );
334
335         $countryList = explode( ',', $value );
336         $resultList = array();
337         foreach ( $countryList as $alpha2 )
338         {
339             $eZCountry = eZCountryType::fetchCountry( $alpha2, 'Alpha2' );
340             $resultList[$alpha2] = $eZCountry ? $eZCountry : '';
341         }
342         // Supporting of previous version format.
343         // For backwards compatibility.
344         if ( count( $resultList ) == 1 and $resultList[$value] == '' )
345             $resultList = $value;
346
347         $content = array( 'value' => $resultList );
348         return $content;
349     }
350
351     function classAttributeContent( $classAttribute )
352     {
353         $defaultCountry = $classAttribute->attribute( self::DEFAULT_LIST_FIELD );
354         $multipleChoice = $classAttribute->attribute( self::MULTIPLE_CHOICE_FIELD );
355         $defaultCountryList = explode( ',', $defaultCountry );
356         $resultList = array();
357         foreach ( $defaultCountryList as $alpha2 )
358         {
359             $eZCountry = eZCountryType::fetchCountry( $alpha2, 'Alpha2' );
360             if ( $eZCountry )
361                 $resultList[$alpha2] = $eZCountry;
362         }
363         $content = array( 'default_countries' => $resultList,
364                           'multiple_choice' => $multipleChoice );
365
366         return $content;
367     }
368
369     /*!
370      Returns the meta data used for storing search indeces.
371     */
372     function metaData( $contentObjectAttribute )
373     {
374         $content = $contentObjectAttribute->content();
375         if ( is_array( $content['value'] ) )
376         {
377             $imploded = '';
378             foreach ( $content['value'] as $country )
379             {
380                 $countryName = $country['Name'];
381                 if ( $imploded == '' )
382                     $imploded = $countryName;
383                 else
384                     $imploded .= ',' . $countryName;
385             }
386             $content['value'] = $imploded;
387         }
388         return $content['value'];
389     }
390
391     /*!
392      \return string representation of an contentobjectattribute data for simplified export
393     */
394     function toString( $contentObjectAttribute )
395     {
396         return $contentObjectAttribute->attribute( 'data_text' );
397     }
398
399     function fromString( $contentObjectAttribute, $string )
400     {
401         return $contentObjectAttribute->setAttribute( 'data_text', $string );
402     }
403
404     /*!
405      Returns the country for use as a title
406     */
407     function title( $contentObjectAttribute, $name = null )
408     {
409         $content = $contentObjectAttribute->content();
410         if ( is_array( $content['value'] ) )
411         {
412             $imploded = '';
413             foreach ( $content['value'] as $country )
414             {
415                 $countryName = $country['Name'];
416                 if ( $imploded == '' )
417                     $imploded = $countryName;
418                 else
419                     $imploded .= ',' . $countryName;
420             }
421             $content['value'] = $imploded;
422         }
423         return $content['value'];
424     }
425
426     function hasObjectAttributeContent( $contentObjectAttribute )
427     {
428         $content = $contentObjectAttribute->content();
429         $result = ( ( !is_array( $content['value'] ) and trim( $content['value'] ) != '' ) or ( is_array( $content['value'] ) and count( $content['value'] ) > 0 ) );
430         return $result;
431     }
432
433     function isIndexable()
434     {
435         return true;
436     }
437
438     function isInformationCollector()
439     {
440         return true;
441     }
442
443     function sortKey( $contentObjectAttribute )
444     {
445         $trans = eZCharTransform::instance();
446         $content = $contentObjectAttribute->content();
447         if ( is_array( $content['value'] ) )
448         {
449             $imploded = '';
450             foreach ( $content['value'] as $country )
451             {
452                 $countryName = $country['Name'];
453
454                 if ( $imploded == '' )
455                     $imploded = $countryName;
456                 else
457                     $imploded .= ',' . $countryName;
458             }
459             $content['value'] = $imploded;
460         }
461         return $trans->transformByGroup( $content['value'], 'lowercase' );
462     }
463
464     function sortKeyType()
465     {
466         return 'string';
467     }
468
469     function diff( $old, $new, $options = false )
470     {
471         return null;
472     }
473
474     function supportsBatchInitializeObjectAttribute()
475     {
476         return true;
477     }
478 }
479
480 eZDataType::register( eZCountryType::DATA_TYPE_STRING, 'ezcountrytype' );
481
482 ?>