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 :

$countries = Zend_Locale::getCountryTranslationList($locale);

Il faut la remplacer par :

$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 :

class App_Form_Element_SelectCountry extends Zend_Form_Element_Select
{
/* @var string */
protected $_column = 'country';

/* @var string */
protected $_table;

/* @var string */
protected $_where;

// Désactive le traducteur (les noms de pays sont déjà traduits)
protected $_translatorDisabled = true;

public function init()
{
/* @var $locale Zend_Locale */
$locale = new Zend_Locale('fr_FR');

if (!$locale) {
throw new Exception('No locale set in registry');
}

$countries = Zend_Locale::getTranslationList('territory',$locale, 2);

// Le code ZZ correspond à "région indéterminée", on le remplace par "(Non renseigné)"
unset($countries['ZZ']);

// Tri de la liste
$oldLocale = setlocale(LC_ALL, '0');
setlocale(LC_ALL, 'fr_FR.utf8');
asort($countries, SORT_LOCALE_STRING);
setlocale(LC_ALL, $oldLocale);

// Ajout d'une valeur nulle en tête de liste
$emptyLabel = '(Non renseigné)';
$translator = $this->getTranslator();
if ($translator) $emptyLabel = $translator->translate($emptyLabel);
$topItems = array('' => $emptyLabel);

// Déplace la région courante en tête de liste
$currentRegion = $locale->getRegion();
if ($currentRegion) {
$topItems['France'] = $countries[$currentRegion];
unset($countries[$currentRegion]);
}

$values = array_values($countries);
$countries = array();
foreach($values as $pays)
{
$countries[$pays] = $pays;
}

// Déplace les 5 pays les plus utilisés en tête de liste
if (isset($this->_table)) {
$table = new $this->_table;
$select = $table->select();
$select->from($table, array($this->_column))
->where("{$this->_column} != ''")
->where("{$this->_column} != ?", $currentRegion)
->group($this->_column)
->order('COUNT(*) DESC')
->limit(5);
if (isset($this->_where)) $select->where($this->_where);
$adapter = $table->getAdapter();
$mostFrequentlyUsed = $adapter->fetchCol($select);
foreach($mostFrequentlyUsed as $countryCode) {
$topItems[$countryCode] = $countries[$countryCode];
unset($countries[$countryCode]);
}
}

// Ajoute un séparateur non sélectionnable
$topItems['--'] = '--';
$this->setOptions(array('disable' => array('--')));

$countries = array_merge($topItems, $countries);

$this->setMultiOptions($countries);
}

public function setColumn($column)
{
$this->_column = $column;
}

/**
* Définit le nom de la classe dérivée de Zend_Db_Table qui sera
* utilisée pour déterminer quels sont les pays les plus fréquemment
* sélectionnés.
*
* @param string $table
*/

public function setTable($table)
{
$this->_table = $table;
}

public function setWhere($where)
{
$this->_where = $where;
}
}