This article describes how to modify the administrator menu in Gambio2. The admin menu builds a 2-level hierarchy:

  1. The first level is called groups and each group has an icon.
  2. The second level is called menu items. Each item has a title that appears in the menu and an associated link.

Files

The following files and directories are relevant for this tutorial:

  • system/conf/AdminMenu/
    Any XML file in this folder starting with menu_ is parsed by the shop in order to build the admin menu. This allows plugins to add menu items to existing menus. The templates are parsed with Smarty.
  • system/data/AdminPermSource.inc.php
    The class AdminPermSource checks whether a user is permitted access to a certain site. Whenever you add a link to the menu, you have to allow your admin user to see it.

The full “traceback” of the admin menu generation process looks like this:

  • admin/start.php
    This is the entry page of the administrator panel. The table cell columLeft2  contains the administrator menu. Its content is loaded by a script called colum_left.php.
  • admin/includes/column_left.php
    This script creates an instance of AdminMenuContentView that renders the administrator view.
  • system/views/AdminMenuContentView
    This class fetches the menu structure from AdminMenuControl and renders it.
  • system/controls/AdminMenuControl.inc.php
    This class is responsible of composing the menu entries with respect to the current user. It queries the AdminPermSource for user permissions and AdminFavoritesSource for the current user’s favorites
  • system/data/AdminPermSource.inc.php
    This class does the permission management for the administrator views. It queries the database table admin_access.
  • system/data/AdminMenuSource.inc.php
    This class parses the XML files in system/conf/AdminMenu and builds the menu structure regardless of user permissions.
  • system/data/AdminFavoritesSource.inc.php
    This class reads favorite menus from the database table gm_admin_favorites.

Tutorial

In this section, I provide step-by-step instructions on how to add a menu item to the Layout/Design menu that simply show the output of phpinfo.

The dummy script

First, we create a tiny script called phpinfo.php in the admin folder of the shop and add the following content:

<html>
    <body>
        <?php
        phpinfo();
        ?>
    </body>
</html>

Adding a menu item

Afterwards, we create an XML file for our custom menu entry in conf/AdminMenu/menu_roland.xml:

<?xml version="1.0"?>
<admin_menu>
    <menugroup id="BOX_HEADING_GAMBIO">
        <menuitem sort="100" link="phpinfo.php" title="PHPinfo" />
    </menugroup>
</admin_menu>

This will add a new menu item to the Layout/Design menu. Other menus can be found in the file conf/AdminMenu/gambio_menu.xml. The sort attribute defines a relative ordering, the lower the number, the earlier the item appears within a group. The link target is appended to www.your-shop.com/admin/ when the menu item is clicked and the title is the text that appears as menu item.

Permitting access

This part is a little ugly: We will hard-code the access permissions into the shop system.

The regular way of granting access to a new menu item is done in the database: The table admin_access contains one column for a user or group id and for any menu entry/view there exists a column which has a 1 in a user’s row if the user may see the column and 0 otherwise.

In our scenario we would need to add a column called phpinfo (without the .php extension).

Another option is to hardcode the permission check. For this, we open the file system/data/AdminPermSource.inc.php and modify the method is_permitted as follows:

function is_permitted($p_customers_id, $p_admin_page) {
    if ($p_admin_page === "phpinfo.php") {
        return true;
    }
    // Rest as before    
}

This hack only shows the way how you can circumvent the database-based access control –  the code may be refined, of course.

Cleaning the cache

Before seeing the results of your work, you have to visit www.your-shop.com/admin/clear_cache.php and then clear the cache (both for generated pages and for module information).

Done

When you now reload the admin panel and take a look at the Design/Layout menu, you should find a menu item called PHPinfo there.