18
2009
Sélection des pays
Je vais maintenant vous donner une correction pour un autre élément de formulare présent sur le site de Maxence Delannoy. Cet élément vous permet de créer un select contenant la liste de tous les pays présents dans Zend_Locale. Le problème c’est que l’une des méthodes utilisées dans cette classe, est devenue obsolète dans la version 1.9 du framework.
En cherchant un peu j’ai trouvé la correction à donner. Voici tout d’abord la ligne qui n’est plus à jour :
| PHP | | copy code | | ? |
| 1 | $countries = Zend_Locale::getCountryTranslationList($locale); |
Il faut la remplacer par :
| PHP | | copy code | | ? |
| 1 | $countries = Zend_Locale::getTranslationList('territory',$locale, 2); |
Je vais vous expliquer ce qu’il faut passer à cette ligne. Le premier paramètre correspond au type de donnée à récupérer, ici c’est les pays qui nous intéressent donc on demande les territory en anglais. Le second est la langue dans laquelle on veut que nous soit retournés les pays dans l’application. Le dernier quand à lui, je ne sais plus à quoi il correspond (penser à commenter un jour). Mais il est optionnel.
Ensuite, j’ai aussi modifié la classe pour que le option du select et l’affichage soient pareil afin d’enregistrer en base de donnée le pays et non les initiales du pays. Voici donc la classe corrigée :
| PHP | | copy code | | ? |
| 001 | class App_Form_Element_SelectCountry extends Zend_Form_Element_Select |
| 002 | { |
| 003 | /* @var string */ |
| 004 | protected $_column = 'country'; |
| 005 | |
| 006 | /* @var string */ |
| 007 | protected $_table; |
| 008 | |
| 009 | /* @var string */ |
| 010 | protected $_where; |
| 011 | |
| 012 | // Désactive le traducteur (les noms de pays sont déjà traduits) |
| 013 | protected $_translatorDisabled = true; |
| 014 | |
| 015 | public function init() |
| 016 | { |
| 017 | /* @var $locale Zend_Locale */ |
| 018 | $locale = new Zend_Locale('fr_FR'); |
| 019 | |
| 020 | if (!$locale) { |
| 021 | throw new Exception('No locale set in registry'); |
| 022 | } |
| 023 | |
| 024 | $countries = Zend_Locale::getTranslationList('territory',$locale, 2); |
| 025 | |
| 026 | // Le code ZZ correspond à "région indéterminée", on le remplace par "(Non renseigné)" |
| 027 | unset($countries['ZZ']); |
| 028 | |
| 029 | // Tri de la liste |
| 030 | $oldLocale = setlocale(LC_ALL, '0'); |
| 031 | setlocale(LC_ALL, 'fr_FR.utf8'); |
| 032 | asort($countries, SORT_LOCALE_STRING); |
| 033 | setlocale(LC_ALL, $oldLocale); |
| 034 | |
| 035 | |
| 036 | // Ajout d'une valeur nulle en tête de liste |
| 037 | $emptyLabel = '(Non renseigné)'; |
| 038 | $translator = $this->getTranslator(); |
| 039 | if ($translator) $emptyLabel = $translator->translate($emptyLabel); |
| 040 | $topItems = array('' => $emptyLabel); |
| 041 | |
| 042 | // Déplace la région courante en tête de liste |
| 043 | $currentRegion = $locale->getRegion(); |
| 044 | if ($currentRegion) { |
| 045 | $topItems['France'] = $countries[$currentRegion]; |
| 046 | unset($countries[$currentRegion]); |
| 047 | } |
| 048 | |
| 049 | $values = array_values($countries); |
| 050 | $countries = array(); |
| 051 | foreach($values as $pays) |
| 052 | { |
| 053 | $countries[$pays] = $pays; |
| 054 | } |
| 055 | |
| 056 | // Déplace les 5 pays les plus utilisés en tête de liste |
| 057 | if (isset($this->_table)) { |
| 058 | $table = new $this->_table; |
| 059 | $select = $table->select(); |
| 060 | $select->from($table, array($this->_column)) |
| 061 | ->where("{$this->_column} != ''") |
| 062 | ->where("{$this->_column} != ?", $currentRegion) |
| 063 | ->group($this->_column) |
| 064 | ->order('COUNT(*) DESC') |
| 065 | ->limit(5); |
| 066 | if (isset($this->_where)) $select->where($this->_where); |
| 067 | $adapter = $table->getAdapter(); |
| 068 | $mostFrequentlyUsed = $adapter->fetchCol($select); |
| 069 | foreach($mostFrequentlyUsed as $countryCode) { |
| 070 | $topItems[$countryCode] = $countries[$countryCode]; |
| 071 | unset($countries[$countryCode]); |
| 072 | } |
| 073 | } |
| 074 | |
| 075 | // Ajoute un séparateur non sélectionnable |
| 076 | $topItems['--'] = '--'; |
| 077 | $this->setOptions(array('disable' => array('--'))); |
| 078 | |
| 079 | $countries = array_merge($topItems, $countries); |
| 080 | |
| 081 | $this->setMultiOptions($countries); |
| 082 | } |
| 083 | |
| 084 | public function setColumn($column) |
| 085 | { |
| 086 | $this->_column = $column; |
| 087 | } |
| 088 | |
| 089 | /** |
| 090 | * Définit le nom de la classe dérivée de Zend_Db_Table qui sera |
| 091 | * utilisée pour déterminer quels sont les pays les plus fréquemment |
| 092 | * sélectionnés. |
| 093 | * |
| 094 | * @param string $table |
| 095 | */ |
| 096 | |
| 097 | public function setTable($table) |
| 098 | { |
| 099 | $this->_table = $table; |
| 100 | } |
| 101 | |
| 102 | public function setWhere($where) |
| 103 | { |
| 104 | $this->_where = $where; |
| 105 | } |
| 106 | } |
Articles Connexes
Laisser un commentaire
Catégories
- Actualités (11)
- Android (5)
- Bases de Données (4)
- Développement (1)
- PasteQR (2)
- PHP (8)
- Systèmes et Réseau (5)
- Technologies Web (5)
- Tests (2)
- Zend Framework (30)
Commentaires récents
- (@Fritte7) (@Fritte7) dans PasteQR passe en 1.1.0
- roux dans ZendX Jquery Dialog
- Fritte7 dans Gérer des évènements dans une listview.
- Fierfeu dans Introduction à Zend Framework 2.0
- Christophe B. dans Gérer des évènements dans une listview.
Mots-Clefs
Active Directory AJAX Android Apache2 APC Bootstrap Chrome Configuration CSS Eclipse Firefox Google html HTTP Installation Internet Internet Exporer Java Javascript JQuery JQuery UI Linux Mémoire Mac MySQL Navigateur Opera PDO Pear Phing PHP Safari SGBD SMTP SQL Ubuntu View Helper Windows Server XML Zend Cache Zend DB Zend Form Zend Framework ZendX ZF 2.0
WP Cumulus Flash tag cloud by Roy Tanck requires Flash Player 9 or better.

Publié par Throrïn




