$route) { // Check if module is installed or not. if (\Drupal::moduleHandler()->moduleExists($module)) { // Get the module info (title, description) from Drupal. $info = \Drupal::service('extension.list.module')->getExtensionInfo($module); // If there's no info, the example isn't enabled, so don't display it. if (!empty($info)) { $links[$module] = [ 'title' => Html::escape($info['name']), 'url' => Url::fromRoute($route), 'attributes' => [ 'class' => [Html::getClass($module)], 'title' => Html::escape($info['description']), ], ]; } } } // Add a link to enable all examples. $links['enable_examples'] = [ 'title' => t('Enable Examples'), 'url' => Url::fromRoute('system.modules_list'), 'options' => [ 'title' => t('Enable more examples in on the Extend page.'), ], 'fragment' => 'edit-modules-example-modules', ]; // Create the examples toolbar render array. $items['examples'] = [ '#type' => 'toolbar_item', 'tab' => [ '#type' => 'link', '#title' => t('Examples'), '#url' => Url::fromRoute(''), '#attributes' => [ 'title' => t('Developer Examples'), 'class' => ['toolbar-icon', 'toolbar-icon-examples'], ], ], 'tray' => [ '#heading' => t('Developer Examples'), 'shortcuts' => [ '#theme' => 'links__toolbar_example', '#links' => $links, '#attributes' => [ 'class' => ['toolbar-menu'], ], ], ], '#weight' => 99, '#attached' => [ 'library' => [ 'examples/examples.icons', ], ], ]; return $items; } /** * Get a list of toolbar links for testing toolbar routes. * * This function returns a keyed array of toolbar routes with keys as the * module name which supplies the route. For internal use only. * * @return string[] * Keyed array of toolbar routes. * * @see toolbar_menu() */ function _examples_toolbar_routes() { return [ 'ajax_example' => 'ajax_example.description', 'batch_example' => 'batch_example.form', 'block_example' => 'block_example.description', 'cache_example' => 'cache_example.description', 'config_entity_example' => 'entity.robot.list', 'content_entity_example' => 'entity.content_entity_example_contact.collection', 'cron_example' => 'cron_example.description', 'dbtng_example' => 'dbtng_example.generate_entry_list', 'email_example' => 'email_example.description', 'events_example' => 'events_example.description', 'field_example' => 'field_example.description', 'field_permission_example' => 'field_permission_example.description', 'file_example' => 'file_example.fileapi', 'form_api_example' => 'form_api_example.description', 'hooks_example' => 'hooks_example.description', 'js_example' => 'js_example.info', 'menu_example' => 'examples.menu_example', 'node_type_example' => 'config_node_type_example.description', 'page_example' => 'page_example.description', 'pager_example' => 'pager_example.page', 'phpunit_example' => 'phpunit_example.description', 'plugin_type_example' => 'plugin_type_example.description', 'queue_example' => 'queue_example.form', 'render_example' => 'render_example.description', 'session_example' => 'session_example.form', 'stream_wrapper_example' => 'stream_wrapper_example.description', 'tabledrag_example' => 'tabledrag_example.description', 'tablesort_example' => 'tablesort_example.description', 'testing_example' => 'testing_example.description', 'tour_example' => 'tour_example.description', ]; } /** * @} End of 'defgroup examples'. */