Fork me on GitHub

By utilizing two blocks and a region zone, we can build a slide out "menu" (aka a jQuery Mobile Panel Widget).

Panel Closed

Panel Open

We say "menu" here because this isn't a traditional DrupalGap menu, instead it's a block imitating a menu which allows us to more easily build dynamic "menus".

1. Build 2 Blocks

We create two custom blocks to build this slide menu. One block for the panel itself, the other to display a button to open the panel. Note, the button to open a panel doesn't necessarily have to be in a separate block, you may move it wherever you choose. We just use this example to demonstrate a common use case:

/**
 * Implements hook_block_info().
 */
function my_module_block_info() {
  try {
    var blocks = {};
    blocks['my_panel_block'] = {
      delta: 'my_panel_block',
      module: 'my_module'
    };
    blocks['my_panel_block_button'] = {
      delta: 'my_panel_block_button',
      module: 'my_module'
    };
    return blocks;
  }
  catch (error) { console.log('my_module_block_info - ' + error); }
}

/**
 * Implements hook_block_view().
 */
function my_module_block_view(delta, region) {
  try {
    var content = '';
    switch (delta) {

      // The slide menu (aka panel).
      case 'my_panel_block':

        var attrs = {
          id: drupalgap_panel_id(delta),
          'data-role': 'panel',
          'data-position': 'left', // left or right
          'data-display': 'overlay' // overlay, reveal or push
        };
        var items = [
          bl('Hello', 'hello', {
              attributes: {
                'data-icon': 'home'
              }
          }),
          bl('World', 'world', {
              attributes: {
                'data-icon': 'cloud'
              }
          }),
        ];
        content += '<div ' + drupalgap_attributes(attrs) + '>' +
          '<!-- panel content goes here -->' +
          theme('jqm_item_list', { items: items }) +
        '</div><!-- /panel -->';

        break;

      // The button to open the menu.
      case 'my_panel_block_button':

        content = bl('Open panel', '#' + drupalgap_panel_id('my_panel_block'), {
            attributes: {
              'data-icon': 'bars',
              'data-iconpos': 'notext',
              'class': 'ui-btn-left'
            }
        });

        break;

    }
    return content;
  }
  catch (error) { console.log('my_module_block_view - ' + error); }
}

2. Add blocks to the settings.js file

In the settings.js file, add the panel block to the header region's _prefix zone, and then add the panel button block to the header region:

drupalgap.settings.blocks.my_theme = {

  header: {

    _prefix: {
      my_panel_block: { }
    },

    /* ... other blocks ... */

    my_panel_block_button: { },

    /* ... other blocks ... */

  },

  /* ... other regions ... */

};