D8 Routes, Menus, Tasks, Links and URL's - pierregermain/MyDrupal GitHub Wiki
- URL y Link y Redirects
- Route, RouteMatch y CurrentRouteMatch
- Enlace de Menú
- Pestañas
- Enlaces de acción (Action links)
- Control de acceso
- Tablas en DB
- La clase Link genera el HTML ()
- La clase Url tiene la info de una ruta. Sirve para que Link genere el enlace
https://www.drupal.org/node/2023537
https://www.hashbangcode.com/article/drupal-9-correct-way-redirect-page
// DO NOT CACHE THE REDIRECT
\Drupal::service('page_cache_kill_switch')->trigger();
// DO THE REDIRECT
return $this->redirect('entity.node.canonical', ['node' => $nid]);
// Set redirect from node 321 to node 123 if logged in
$current_path = \Drupal::service('path.current')->getPath();
if ($variables['logged_in'] && $current_path === '/node/321' ) {
// Create url object
$options = ['absolute' => TRUE];
$url = \Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => 123], $options);
// Create response
$response = new RedirectResponse($url->toString());
$request = \Drupal::request();
// Save the session so things like messages get saved.
$request->getSession()->save();
$response->prepare($request);
// Make sure to trigger kernel events.
\Drupal::service('kernel')->terminate($request, $response);
$response->send();
}
$url1 = Url::fromRoute('block.admin_display');
$link1 = Link::fromTextAndUrl(t('Go to internal link'), $url1); // Genera el Link que guarda la estructura HTML <a href>
$link1_string = $link1->toString();
$url3 = Url::fromRoute('<front>');
$link3 = Link::fromTextAndUrl(t('Go to Front page'), $url3);
Ejemplo para /node/1
$url4 = Url::fromRoute('entity.node.canonical', ['node' => 1]);
$link4 = Link::fromTextAndUrl(t('Link to node/1'), $url4);
Si queremos enlazar a la edición o borrado de dicho nodo podemos usar: 'entity.node.edit_form' y 'entity.node.delete_form'.
$url6 = Url::fromUri('https://www.example.com');
$link6 = Link::fromTextAndUrl(t('Link to www.example.com'), $url6);
Usamos el método de URL externa
$url7 = Url::fromUri('internal:/core/themes/bartik/css/layout.css');
$link7 = Link::fromTextAndUrl(t('Link to layout.css'), $url7);
Se hace sobre el objeto URL. Link los tomará
$url8 = Url::fromUri('https://www.drupal.org');
$link_options = array(
'attributes' => array(
'class' => array(
'external-link',
'list',
),
'target' => '_blank',
'title' => 'Go to drupal.org',
),
);
$url8->setOptions($link_options);
$link8 = Link::fromTextAndUrl(t('Link to drupal.org'), $url8);
-
El objeto Route contiene la información especificada en el archivo de routing YML para una ruta determinada. No es un objeto que se utilice habitualmente por sí solo. Se utiliza, por ejemplo, como objeto contenido dentro de un objeto RouteMatch.
-
El objeto RouteMatch contiene el nombre de la ruta, el objeto Route y los parámetros utilizados para generar una ruta en particular.
-
El objeto CurrentRouteMatch es un RouteMatch pero que contiene información de la ruta actual.
Ejemplo: hook_help($route_name, \Drupal\Core\Routing\RouteMatchInterface $route_match)
/**
* Implements hook_help().
*/
function my_module_help($route_name, RouteMatchInterface $route_match) {
switch ($route_name) {
case 'entity.node.edit_form':
$node = $route_match->getParameter('node');
$output = '';
$output .= '<p>' . t('Text A. node edit form. Type:%type,id:%id',
['%type' => $node->getType(), '%id' => $node->id()]) . '</p>';
if ($node->getType() == 'page') {
$output .= '<p>' . t('Text B. This is Basic page. ') . '</p>';
}
return $output;
}
}
Primero creamos o necesitamos una ruta a donde va a apuntar el menú, lo hacemos desde el routing
my_module.my_route:
path: '/admin/my_module'
defaults:
_controller: '\Drupal\system\Controller\SystemController::systemAdminMenuBlockPage'
_title: 'My Module'
requirements:
_access: 'TRUE'
Y a continuación, creamos el menú desde el fichero de menus, diciendole donde queremos meter el menú asignandolo a un padre.
my_module.my_menu:
title: 'My Menu'
parent: system.admin
route_name: my_module.my_menu
description: 'Links to pages created during this course'
weight: -11
Para añadir un link hijo a dicho menu creamos una nueva entrada con parent:my_module.my_menu
y además necesitamos crear un nuevo route para dicha entrada.
Primero definimos nuestra librería
my_module.css:
version: 1.x
css:
theme:
css/my_module.css: {}
Luego añadimos la librería desde el hook toolbar_alter.
/**
* Implements hook_toolbar_alter().
*/
function my_module_toolbar_alter(&$items) {
$items['administration']['#attached']['library'][] =
'my_module/my_module.css';
}
my_module.user:
title: 'User page'
description: 'User page'
route_name: my_module.user
route_parameters:
user: 1
parent: my_module.my_menu
weight: 4
Para crear un grupo de dos pestañas necesitamos tener dos páginas con sus routes ya creados. A continuación podemos crear el fichero my_module.links.task.yml que incluya el siguiente código
my_module.tab1:
route_name: my_module.tab1
title: Tab 1
base_route: my_module.tab1
weight: 10
my_module.tab2:
route_name: my_module.tab2
title: Tab 2
base_route: my_module.tab1
weight: 20
my_module.tab3:
route_name: my_module.tab3
title: Tab 3
base_route: my_module.tab1
weight: 30
Igual que en el ejemplo anterior, necesitamos que dichas pestañas tengan su routing creado. Una vez creado podemos crear las pestañas cómo se hizo en el ejemplo anterior
my_module.tab2a:
route_name: my_module.tab2a
title: Tab 3b
parent_id: my_module.tab2
weight: 20
Por ejemplo para agregar una pestaña a /admin/content (usa el grupo de pestañas system.admin_content definido en system.links.task.yml) hacemos lo siguiente
my_module.extratab:
route_name: my_module.extratab
title: Extra tab
base_route: system.admin_content
weight: 10
- Son los típicos botones que hay en la UI de Drupal (Por ejemplo Add content en /admin/content).
- Con el appears_on le decimos a Drupal en que página queremos añadir el botón
my_module.link_action:
route_name: my_module.action1
title: 'Add Something link 1'
appears_on:
- my_module.links
Para añadir un permiso a /admin/people/permissions lo hacemos desde el fichero my_module.permissions.yml
'access calculator':
title: Access Calculator page
description: Allow users to access Calculator page
Desde el routing usamos el nombre del permiso
my_module.calculator:
path: '/my_module/pages/calculator'
defaults:
_controller: '\Drupal\my_module\Controller\my_moduleController::calculator'
requirements:
_permission: 'access calculator'
my_module.calculator:
path: '/my_module/pages/calculator'
defaults:
_controller: '\Drupal\my_module\Controller\my_moduleController::calculator'
requirements:
_role: 'gestor'
Para que una ruta siempre sea accesible usaremos
requirements:
_access: 'TRUE'
- menu_tree: guarda los menus creados
- router: guarda las rutas definidas
- url_alias