function responsive_menu_page_bottom in Responsive and off-canvas menu 4.4.x
Same name and namespace in other branches
- 8.3 responsive_menu.module \responsive_menu_page_bottom()
- 8.2 responsive_menu.module \responsive_menu_page_bottom()
- 4.0.x responsive_menu.module \responsive_menu_page_bottom()
- 4.1.x responsive_menu.module \responsive_menu_page_bottom()
- 4.3.x responsive_menu.module \responsive_menu_page_bottom()
Implements hook_page_bottom().
Used to place the off-canvas menu and supporting libraries and configuration.
File
- ./
responsive_menu.module, line 118 - Contains procedural code.
Code
function responsive_menu_page_bottom(&$page) {
// Get the configuration.
$config = \Drupal::config('responsive_menu.settings');
// A developer may not want to output the off-canvas menu's HTML into the DOM
// and activate the mmenu library. We allow a variable to by altered by a
// custom hook. If the value is FALSE then rendering does not continue and no
// output is added to page bottom.
$off_canvas_output = TRUE;
\Drupal::ModuleHandler()
->alter('responsive_menu_off_canvas_output', $off_canvas_output);
if ($off_canvas_output === FALSE) {
return;
}
// A site builder can allow this module to work with the admin theme.
if ($config
->get('allow_admin') == FALSE && _current_theme_is_admin()) {
return;
}
$output = [
'#prefix' => '<div class="off-canvas-wrapper"><div id="off-canvas">',
'#suffix' => '</div></div>',
'#pre_render' => [
'\\Drupal\\responsive_menu\\OffCanvas::preRender',
],
];
// Determine whether the breakpoint code should be used.
if ($config
->get('use_breakpoint')) {
// Check whether the generated breakpoint css exists and if not create it.
if (!file_exists(_get_breakpoint_css_filepath() . RESPONSIVE_MENU_BREAKPOINT_FILENAME)) {
$breakpoint = $config
->get('horizontal_media_query');
responsive_menu_generate_breakpoint_css($breakpoint);
}
// Add the dynamically generated library with breakpoint styles.
$output['#attached']['library'][] = 'responsive_menu/responsive_menu.breakpoint';
}
// Add the mmenu library.
$output['#attached']['library'][] = 'responsive_menu/responsive_menu.mmenu';
// If the polyfills are requested and the file exists then add it too.
// Note that in the past the final build files have not included the
// polyfills file (see d.o issues #3143984, #3111949) so we need to
// check if its actually there to avoid a 404.
if ($config
->get('use_polyfills') && file_exists(DRUPAL_ROOT . '/libraries/mmenu/dist/mmenu.polyfills.js')) {
$output['#attached']['library'][] = 'responsive_menu/responsive_menu.polyfills';
}
// Add this module's configuration javascript.
$output['#attached']['library'][] = 'responsive_menu/responsive_menu.config';
// Add the module's css file if the user does not want to disable it.
if ($config
->get('include_css')) {
$output['#attached']['library'][] = 'responsive_menu/responsive_menu.styling';
}
// Add the bootstrap specific code if needed.
if ($config
->get('use_bootstrap')) {
$output['#attached']['library'][] = 'responsive_menu/responsive_menu.bootstrap';
}
// Add some of the config as javascript settings.
$output['#attached']['drupalSettings']['responsive_menu'] = [
'position' => $config
->get('off_canvas_position'),
'theme' => $config
->get('off_canvas_theme'),
'pagedim' => $config
->get('pagedim'),
'modifyViewport' => $config
->get('modify_viewport'),
'use_bootstrap' => $config
->get('use_bootstrap'),
'breakpoint' => $config
->get('horizontal_media_query'),
'drag' => $config
->get('drag'),
];
// Allow for the menu position to be based on the language direction.
// @see issue #3095162 for details.
if ($config
->get('off_canvas_position') === 'contextual') {
$language = \Drupal::languageManager()
->getCurrentLanguage()
->getDirection();
$output['#attached']['drupalSettings']['responsive_menu']['position'] = $language === 'rtl' ? 'right' : 'left';
}
else {
$output['#attached']['drupalSettings']['responsive_menu']['position'] = $config
->get('off_canvas_position');
}
$output['#cache']['keys'] = [
'responsive_menu',
'off_canvas',
];
// Get the menu names. These are used to build the
// cache keys so we can cache different variations of the menu.
$off_canvas_menus = \Drupal::config('responsive_menu.settings')
->get('off_canvas_menus');
// Other modules can modify the menu names so we need to take this into
// account when setting the cache keys.
\Drupal::ModuleHandler()
->alter('responsive_menu_off_canvas_menu_names', $off_canvas_menus);
$menus = explode(',', $off_canvas_menus);
$output['#cache']['keys'] += $menus;
foreach ($menus as $menu_name) {
// If any of the menus' config changes the render cache should
// be invalidated.
$output['#cache']['tags'][] = 'config:system.menu.' . $menu_name;
// The menu will also vary depending on the active trail of each merged menu
// so this will be added as a cache context.
$output['#cache']['context'][] = 'route.menu_active_trails:' . $menu_name;
}
$page['page_bottom']['off_canvas'] = $output;
}