2010-12-10 37 views
9

Existe-t-il un fichier dans magento où tous les fichiers html seront sortis?Magento: Réduire la sortie HTML?

Je souhaite réduire la taille de toutes les sorties html.

+1

Bonne question, +1, mais comment voulez-vous rapetisser HTML ? –

Répondre

4

Vous pouvez toujours utiliser les fonctions ob pour obtenir la sortie dans index.php et ensuite faire avec le contenu dont vous avez besoin. mais je doute que cela va booster votre site autant que permettre gzip ou dégonfler

+0

Vous ne devez pas modifier 'index.php'. – Simon

+0

@Simon qui dit que vous devez éditer index.php pour cela, bien que vous pouvez faire ce que vous voulez tant que vous êtes le propriétaire du code et prendre la responsabilité des modifications faites –

+0

Err ... C'est exactement ce que votre réponse suggère. Et non, à mon humble avis, vous ne devriez jamais modifier le noyau. Plus jamais. – Simon

2

Peut-être que mod_pagespeed de Google? Cela le ferait de façon transparente pour vous. +1 pour gzip et dégonfler de toute façon.

+0

mod_pagespeed a été fait pour ce genre de situation. Cependant, il fonctionne toujours à chaque demande. – clockworkgeek

+0

C'est très vrai, et j'aime l'idée de tirer parti de la mise en cache de la page entière pour gagner du temps. Avez-vous une idée du temps que la déflation HTML prend sur mod_pagespeed? Je n'ai pas une idée de l'importance d'un problème. –

+0

Parce que c'est un code natif, il doit être plus rapide qu'une version scriptée. Il y a bien sûr d'autres options de mise en cache, mod_disk_cache et mod_mem_cache bien que je ne sois pas sûr qu'elles soient instanciées après mod_pagespeed, ou que vous puissiez utiliser un proxy inverse. Ces types d'options de mise en cache nécessitent généralement des en-têtes Expires et Vary que Magento ne définit pas, de sorte que leur utilité peut être limitée. Fondamentalement, je ne sais pas, seul un outil de profil de débogage pourrait vous le dire. – clockworkgeek

5

Idéalement, vous voulez effectuer une minification avant que la sortie soit mise en cache pour éviter de le faire trop souvent. Le meilleur endroit que je peux penser est en redéfinissant Mage_Page_Block_Html et en ajoutant la fonction suivante à votre nouvelle classe:

protected function _toHtml() 
{ 
    $html = parent::_toHtml(); 
    // MINIFY CONTENTS OF $html HERE 
    return $html; 
} 

De cette façon, il exécute l'action une fois pour toute la page, la valeur retournée peut alors être mises en cache par Magento dans C'est comme d'habitude. Il ne fonctionne pas sur chaque bloc individuellement, ce qui pourrait être moins efficace.

19

Magento utilise un objet de réponse pour envoyer toutes les sorties.

Toutes les sorties sont ajoutées à cet objet, puis sa méthode sendResponse est appelée.

Si vous souhaitez modifier la sortie, la configuration d'un écouteur pour l'événement http_response_send_before

<!-- in your module's config.xml --> 
<http_response_send_before> 
    <observers> 
     <unique_name> 
      <type>singleton</type> 
      <class>group/observer</class> 
      <method>alterOutput</method> 
     </unique_name> 
    </observers> 
</http_response_send_before> 

Et puis dans votre observateur, vous pouvez obtenir et définir le corps

class Packagename_Modulename_Model_Observer 
{ 
    public function alterOutput($observer) 
    { 
     $response = $observer->getResponse();  
     $html  = $response->getBody();   
     //modify html here   
     $response->setBody($html); 
    } 
} 

Si vous êtes intéressé , cet événement est appelé dans la méthode sendResponse de la classe suivante

app/code/core/Mage/Core/Controller/Response/Http.php 

et la sortie elle-même est envoyé dans les sendResponse et outputBody méthodes de

lib/Zend/Controller/Response/Abstract.php 
+0

excellente réponse comme d'habitude –

+0

J'ai utilisé le code ci-dessus, mais il semble ne pas fonctionner avec la mise en cache pleine page :( –