sept
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

A propos de l'Auteur: Benjamin Besse

Je suis Analyste Développeur chez Goomeo et je suis passioné par tout ce qui touche aux technologies du Web. J'ai commencé par apprendre l'utilisation du Framework Zend et j'ai continué naturellement via Android. Le tout seulement avec les bases acquises en DUT et Licence professionnelle Informatique.

Laisser un commentaire

Mots-Clefs