Actions

Adding access keys

From Joomla! Documentation

Revision as of 10:57, 17 July 2008 by Erdsiger (Talk | contribs)

Heres a quick way to add access keys to joomla 1.5. Note, This involves hacking the core code.

Firstly edit the component.xml parameter definiton file in \administrator\components\com_menus\models\metadata and add to it an accesskey parameter:

<param name="accesskey" type="text" size="1" default="" label="Accessibility Access Key"
description="Accessibility Access Key for the page which this Menu item points to" />

Your file should now look something like:

    <?xml version="1.0" encoding="utf-8"?>
    <metadata>
       <state>
          <name>Component</name>
          <description>Component Parameters</description>
          <params>
             <param name="page_title" type="text" size="30" default="" label="Page Title"
               description="PARAMPAGETITLE" />
             <param name="show_page_title" type="radio" default="1" label="Show Page Title"
               description="SHOW/HIDE THE PAGES TITLE">
                <option value="0">No</option>
                <option value="1">Yes</option>
             </param>
             <param name="pageclass_sfx" type="text" size="20" default="" label="Page Class Suffix"
               description="PARAMPAGECLASSSFX" />
             <param name="@spacer" type="spacer" default="" label="" description="" />
             <param name="menu_image" type="imagelist" directory="/images/stories" hide_default="1"
               default="" label="Menu Image" description="PARAMMENUIMAGE" />
             <param name="@spacer" type="spacer" default="" label="" description="" />
             <param name="secure" type="radio" default="0" label="SSL Enabled" description="PARAMSECURE">
                <option value="-1">Off</option>
                <option value="0">Ignore</option>
                <option value="1">On</option>
             </param>
             <param name="@spacer" type="spacer" default="" label="" description="" />
             <param name="accesskey" type="text" size="1" default="" label="Accessibility Access Key"
description="Accessibility Access Key for the page which this Menu item points to" />
          </params>
          <advanced />
       </state>
    </metadata>

Now edit the frontend file \modules\mod_mainmenu\helper.php:

    // ACCESS KEY HACK - Part 1
    $accessKey = $iParams->get('accesskey');

and

    // ACCESS KEY HACK - Part 2
    if ($tmp->accessKey)
    $data = '<a href="'.$tmp->url.'" accesskey="'.$tmp->accessKey.'">'.$image.$tmp->name.'</a>';
    else
    $data = '<a href="'.$tmp->url.'" >'.$image.$tmp->name.'</a>';
    $tmp->accessKey = $accessKey;

into the _getItemData($item) function so that it looks like this

    function _getItemData($item)
       {
          $data = null;
 
          // Menu Link is a special type that is a link to another item
          if ($item->type == 'menulink')
          {
             $menu = &JSite::getMenu();
             if ($tmp = clone($menu->getItem($item->query['Itemid']))) {
                $tmp->name    = '<span><![CDATA['.$item->name.']]></span>';
                $tmp->mid    = $item->id;
                $tmp->parent = $item->parent;
             } else {
                return false;
             }
          } else {
             $tmp = clone($item);
             $tmp->name = '<span><![CDATA['.$item->name.']]></span>';
          }
 
          $iParams = new JParameter($tmp->params);
          if ($iParams->get('menu_image') && $iParams->get('menu_image') != -1) {
             $image = '<img src="'.JURI::base(true).'/images/stories/'.$iParams->get('menu_image').'" alt="" />';
          } else {
             $image = null;
          }
 
 
          // ACCESS KEY HACK - Part 1
          $accessKey = $iParams->get('accesskey');
          $tmp->accessKey = $accessKey;
 
          switch ($tmp->type)
          {
             case 'separator' :
                return '<span class="separator">'.$image.$tmp->name.'</span>';
                break;
 
             case 'url' :
                if ((strpos($tmp->link, 'index.php?') !== false) && (strpos($tmp->link, 'Itemid=') === false)) {
                   $tmp->url = $tmp->link.'&amp;Itemid='.$tmp->id;
                } else {
                   $tmp->url = $tmp->link;
                }
                break;
 
             default :
                $router = JSite::getRouter();
                $tmp->url = $router->getMode() == JROUTER_MODE_SEF ?
                  'index.php?Itemid='.$tmp->id : $tmp->link.'&Itemid='.$tmp->id;
                break;
          }
 
          // Print a link if it exists
          if ($tmp->url != null)
          {
             // Handle SSL links
             $iSecure = $iParams->def('secure', 0);
             if ($tmp->home == 1) {
                $tmp->url = JURI::base();
             } elseif (strcasecmp(substr($tmp->url, 0, 4), 'http') && (strpos($tmp->link, 'index.php?') !== false)) {
                $tmp->url = JRoute::_($tmp->url, true, $iSecure);
             } else {
                $tmp->url = str_replace('&', '&amp;', $tmp->url);
             }
 
             switch ($tmp->browserNav)
             {
                default:
                case 0:
                   // _top
                   // ACCESS KEY HACK - Part 2          ###############################
                   if ($tmp->accessKey)
                      $data = '<a href="'.$tmp->url.'" accesskey="'.$tmp->accessKey.'">'.$image.$tmp->name.'</a>';
                   else
                      $data = '<a href="'.$tmp->url.'" >'.$image.$tmp->name.'</a>';
                   break;
                case 1:
                   // _blank
                   $data = '<a href="'.$tmp->url.'" target="_blank">'.$image.$tmp->name.'</a>';
                   break;
                case 2:
                   // window.open
                   $attribs = 'toolbar=no,location=no,status=no,menubar=no,
                     scrollbars=yes,resizable=yes,'.$this->_params->get('window_open');
 
                   // hrm...this is a bit dickey
                   $link = str_replace('index.php', 'index2.php', $tmp->url);
                   $data = '<a href="'.$link.'" onclick="window.open(this.href,\'targetWindow\',\''.$attribs.'\');
                     return false;">'.$image.$tmp->name.'</a>';
                   break;
             }
          } else {
             $data = '<a>'.$image.$tmp->name.'</a>';
          }
 
          return $data;
 
       }

Login to your admin site and edit a menu item. Now open the "Parameters - System" accordion item on the right and you will see your accesskey parameter. Set a value, save the menu item and voila.