Monthly Archives

4 Articles
Google Chrome Frame

Google Chrome Frame

Bonjours,

Aujourd’hui je vais vous parler d’une extension d’Internet Explorer 6, 7 et 8 qui fait grand bruit sur la toile. Il s’agit de Google Chrome Frame ou encore, de comment intégrer le rendu de Google Chrome dans Internet Explorer.

Si certains ont pu le voir, je viens de le mettre en place sur mon site pour que les utilisateurs d’Internet Explorer puissent profiter des nouveautés de CSS3 ainsi que la suppression des bugs d’affichages des différentes versions.

En continuant là-dessus, on a la possibilité d’automatiser l’installation du composant pour les utilisateurs lambda. On a le choix entre une fenêtre sur notre page, ou d’un pop-up.

Personnellement, après avoir essayé la frame, j’ai eu quelques bugs de mise en page donc je me suis tourné vers le pop-up mais, là encore, la dernière version d’Internet Explorer les bloque. Espérons que l’équipe de Google pensera à un autre système par la suite.

Ensuite, pour l’utilisateur, la mise en marche de Google Chrome Frame est transparente. Il faut juste que le développeur rajoute une simple balise Meta sur son site et le tour est joué:

Pour tous renseignements supplémentaires, je vous invite à aller voir la page de Google traitant de cette extension (en anglais par contre).

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 :

$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;
}
}

Correction Element Captcha

Pour ce début de week-end, je vais vous faire partager une correction de Zend_FormElement_Captcha pour la mise en forme avec un tableau (via les décorateurs).

Je redéfinis juste la fonction render() de Zend_Form_Element_Captcha. Voici donc la correction apportée:

 

/**
* Classe d'extension de Zend_Form_Element_Captcha
*
* Corrige un bug par rapport au décorateur du captcha.
*
*/
class App_Form_Element_Captcha extends Zend_Form_Element_Captcha {

public function render(Zend_View_Interface $view = null)
{
$captcha = $this->getCaptcha();
$captcha->setName($this->getFullyQualifiedName());

$decorators = $this->getDecorators();

$decorator = $captcha->getDecorator();
if (!empty($decorator)) {
array_unshift($decorators, $decorator);
}

$decorator = array('Captcha', array('captcha' => $captcha));
array_unshift($decorators, $decorator);

$this->setDecorators($decorators);

$this->setValue($this->getCaptcha()->generate());

return ''.parent::render($view).'';
}
}

Et son utilisation pour modifier le décorateur:
$captcha->setDecorators(array(
array('decorator' => array('td' => 'HtmlTag'), 'options' => array('tag' => 'td')),
array('Label', array('tag' => 'td'))
));

Filtre Suppression d’accents

Bonjours tout le monde,

je sais sa fait longtemps que je n’ai plus rien posté et je m’en excuse. C’est pour cela que je vais vous distribuer un filtre des plus utiles.

Qui n’a pas été embêté avec la suppression des accents avec php?? Entre l’ISO et l’UTF-8 de nombreux problèmes se posent et il suffit que l’un des fichiers, la base de donnée ou le navigateur soient d’un encodage différent pour que les ennuis commencent.

Je vous propose donc ce filtre qui permet de supprimer les accents, les caractères spéciaux et, si vous le voulez, les espaces.
class App_Filter_DellSpecialChars implements Zend_Filter_Interface {
/**
* @see Zend_Filter_Interface::filter()
*
* @param mixed $value
* @return mixed
*/
public function filter($value) {
$value = str_replace("'", "", $value);
$value = htmlentities($value, ENT_NOQUOTES, 'utf-8');
$value = preg_replace('#\&([A-za-z])(?:acute|cedil|circ|grave|ring|tilde|uml)\;#', '\1', $value);
$value = preg_replace('#\&([A-za-z]{2})(?:lig)\;#', '\1', $value); // pour les ligatures e.g. 'œ'
$value = preg_replace('#\&[^;]+\;#', '', $value); // supprime les autres caractères
$value = preg_replace('/\s/', '', $value); //supprime les espaces

return $value;
}

}
J’espère que ce filtre vous sera très utile.