mercredi 6 janvier 2010

Corriger le bug zend form dojo editor sous IE

Voilà en développant un petit formulaire avec le framework de Zend, j'ai utiliser le Zend_Dojo_Form_Element_Editor histoire d'avoir un textarea dans lequel on pouvais faire un peu de mise en forme. Voici comment j'ai déclaré mon élément dans ma class :

class Default_Form_Demande extends Zend_Dojo_Form
{
//...

/**
*
* @see    http://framework.zend.com/manual/en/zend.form.html
* @return void
*/
public function init()
{
//...
$this->descriptif = new Zend_Dojo_Form_Element_Editor('descriptif');
$this->descriptif->setLabel('Descriptif de la demande')
->setRequired(true)
->setFilters(array('StringTrim'))
->setEditActionInterval(2)
->setHeight('250px');
$this->addElement($this->descriptif);
//...
}
//...
}  
Seulement voilà lorsque je suis passé aux tests, j'ai eu une drôle de surprise. En fonction du navigateur, le formulaire ne retourne pas la même structure de donnée. Sous IE6, Chrome, Safari j'ai eu :
Array (
[descriptif] => Array (
[Editor] => "bug test 2"
)
)
Sous Firefox j'ai eu :
Array (
[descriptif] =>  "bug test 2"
)
Ce qui n'est pas tout à fait la même chose. Google étant mon ami, j'ai chercher une solution. Après plusieurs essaies le seul truc qui tenais la route a été de modifier la class suivante : Zend/Dojo/View/Helper/Editor.php. Voici donc ce que j'ai fais:
  • j'ai renommé la méthode editor en editor_old (vers la ligne 66)
  • et je l'ai remplacé par celle-ci :
/**
* dijit.Editor
*
* @param  string $id
* @param  string $value
* @param  array $params
* @param  array $attribs
* @return string
*/
public function editor($id, $value = null, $params = array(), $attribs = array())
{
$hiddenName = $id;
if (array_key_exists('id', $attribs)) {
$hiddenId = $attribs['id'];
} else {
$hiddenId = $hiddenName;
}
$hiddenId = $this->_normalizeId($hiddenId);

$hiddenAttribs = array(
'id'    => $hiddenId,
'name'  => $hiddenName,
'value' => $value,
'type'  => 'hidden',
);

$editorAttribs = array(
'id'    => $hiddenId . '-Editor',
'name'  => $this->_normalizeEditorName($hiddenName)
);

$editorAttribs = $this->_prepareDijit($editorAttribs, $params, 'textarea');

$this->_createGetParentFormFunction();
$this->_createEditorOnSubmit($hiddenId, $hiddenId . '-Editor');

$html = '<input' . $this->_htmlAttribs($hiddenAttribs) . $this->getClosingBracket()
. '<div dojoType="' . $this->_module . '" ' . $this->_htmlAttribs($editorAttribs) .'>'.$value.'</div>';

return $html;
}
Alors je sais, c'est pas bien j'ai touché au code source du Zend Framework, donc attention lors des mises à jour de pas écraser cette modif (sauf si Zend à apporter une mise à jour concernant ce point).
Pour en revenir au sujet, pourquoi ce bug ? bah d'après les explications que j'ai réussit a traduire. Il semblerait que lorsque zend à implémenter l'éditeur de Dojo, celui-ci utilisait un textarea. Or depuis il a dû y avoir des mises à jour de Dojo, qui utilise maintenant un div pour faire le rendu. Voilà j'espère que ce post vous aura aidé.

lundi 4 janvier 2010

Pourquoi ajouter des header "expires" dans htaccess vos .htaccess ?

Tout simplement pour améliorer le chargement de votre site. A chaque visite sur votre site, plusieurs requêtes HTTP sont effectuées pour charger le contenu de votre page. Une requête par image, par fichier CSS et/ou Javascript inclus dans la page... Ajouter une entête "Expires" à ces ressources, va indiquer au navigateur, que cette ressource peut être mise en cache jusqu'à la date que vous spécifiez. Donc une fois les ressources images, javascript, ... mis en cache, le nombre de requête HTTP vers votre serveur devrait diminuer.
Pour ce faire il vous suffit d'ajouter ces petites lignes dans vos .htaccess :
ExpiresActive On
ExpiresDefault "access plus 1 month"
Ces instructions, vont mettre une date d'expiration de 1 mois sur les ressources. 1 mois en plus par rapport à la première date d'accès à la ressource. Bien entendu le mieux est de personnaliser cette date en fonction du type de ressources. Effectivement, on change pas la mécanique tout les jours lorsque ça fonctionne. Par contre la peinture (style, image) peux être amener à changer un plus souvent. On peux donc ajouter en plus des deux ligne ci dessus :
ExpiresByType text/html "access plus 2 hours"
ExpiresByType text/javascript "access plus 2 month"
ExpiresByType image/gif "access plus 5 hours 3 minutes"
Ici je définis la date d'expiration pour les ressources de type HTML à 2 heures, pour les ressources de type javascript à 2 mois et pour les ressources de type images gif à 5 heures et 3 minutes. Les autres type de ressources images jpeg, png auront la date d'expiration par défaut de 1 mois.
Voilà, j'espère que ce petit post vous seras utile.