Again on the never ending quest to DRY up my code, next in the targets are the head sections MetaTags!

Following on from my last post which used Zend_Config_Xml, we shall do the same for each pages title, description, and keywords.

In your application/configs directory, create a file named meta.xml :

<?xml version="1.0" encoding="UTF-8"?>
<config>
 <meta>
  <uris>
   <uri>
     <page>/</page>
     <title>My Home Page</title>
     <description>This is my websites home page</description>
     </uri>
     <uri>
       <page>/buying</page>
       <description>BUYING A HOUSE</description>
       <title>Buying a property</title>
     </uri>
     <uri>
       <page>/selling</page>
       <description>SELLING A HOUSE</description>
       <title>Selling a property</title>
     </uri>
   </uris>
 </meta>
</config>

Create a Controller Plugin in your library. For me, it’s /library/TTB/Plugin/Meta.php :

class TTB_Plugin_Meta extends Zend_Controller_Plugin_Abstract
{
 public function preDispatch(Zend_Controller_Request_Abstract $request) 
 { 
   try 
   {
     $config = new Zend_Config_Xml(APPLICATION_PATH.'/configs/meta.xml','meta');
     $uri = $request->getPathInfo();
     $defaults = true;
     $view = Zend_Controller_Front::getInstance()
             ->getParam('bootstrap')
             ->getResource('view');
     foreach ($config->uris->uri as $meta) 
     {
       if($meta->page == $uri) 
       {
         $view->headMeta()->appendName('title', $meta->title);
         $view->headMeta()->appendName('description', $meta->description);
         $defaults = false;
       }
     }
     if($defaults == true)
     {
       $view->headTitle('My Awesome Website');
       $view->headMeta()->setName('description','This is the default');
       $view->headMeta()->setName('keywords','zend framework, php, delboy1978uk');
     }
   }
   catch(Exception $e)
   {
     throw new Exception('Unable to set Meta Tags');
   }
 } 
}

We need to register the plugin in our application.ini :

autoloaderNamespaces[] = "TTB_"
resources.frontController.plugins.Meta = "TTB_Plugin_Meta"

Finally we initialise the Plugin in our bootstrap :

protected function _initMeta()
{
    $meta = new TTB_Plugin_Meta();
}

You should already have this in your layout file, but if not you want this in the <head> section of your layout.phtml :

echo $this->headTitle();
echo $this->headMeta();

There we have it! Meta Tags – sorted!
Again Brownie Points will be awarded to he/she who replies with code to populate the XML from DB data!

If you need to override the defaults from within a controller, (eg. if you were populating the title with db data), you can use this sort of thing:

$this->view->headTitle('Dynamic Page Title', 'SET');
 $this->view->headMeta()->setName('description','Dynamic Description');
 $this->view->headMeta()->setName('keywords','dynamic keywords');

Cheers amigos! 😀

Advertisements