D8 Routes, Menus, Tasks, Links and URL's - pierregermain/MyDrupal GitHub Wiki

URL y Link y Redirects

  • La clase Link genera el HTML ()
  • La clase Url tiene la info de una ruta. Sirve para que Link genere el enlace

Redirects

https://www.drupal.org/node/2023537
https://www.hashbangcode.com/article/drupal-9-correct-way-redirect-page

Redirect simple en un Controller

// DO NOT CACHE THE REDIRECT
\Drupal::service('page_cache_kill_switch')->trigger();
// DO THE REDIRECT
return $this->redirect('entity.node.canonical', ['node' => $nid]);

Redirect desde un nodo al otro desde código secuencial

  // 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();
  }

Enlaces Internos

$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>

Si necesitas convertir Link a string

$link1_string = $link1->toString();

Enlace al home

$url3 = Url::fromRoute('<front>');
$link3 = Link::fromTextAndUrl(t('Go to Front page'), $url3);

Enlaces a Entidades

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'.

Enlace a una URL externa

$url6 = Url::fromUri('https://www.example.com');
$link6 = Link::fromTextAndUrl(t('Link to www.example.com'), $url6);

Enlace a una URL interna no registrada

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);

Añadir atributos al enlace

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);

Route, RouteMatch y CurrentRouteMatch

  • 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;
  }
}

Enlace de Menú

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.

Añadir un icono al elemento de menú

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';
}

Enlace de Menu con argumentos

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

Pestañas

Crear un grupo de pestañas

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

Crear subpestañas

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

Agregar pestaña a un grupo de pestañas existentes

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

Enlaces de acción (Action links)

  • 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

Control de acceso

Definición de permisos

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

Control de acceso a una ruta

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'

Control de accesso por rol

my_module.calculator:
  path: '/my_module/pages/calculator'
  defaults:
    _controller: '\Drupal\my_module\Controller\my_moduleController::calculator'
  requirements:
    _role: 'gestor'

Ruta pública

Para que una ruta siempre sea accesible usaremos

requirements:
  _access: 'TRUE'

Tablas en DB

  • menu_tree: guarda los menus creados
  • router: guarda las rutas definidas
  • url_alias
⚠️ **GitHub.com Fallback** ⚠️