SlideShare ist ein Scribd-Unternehmen logo
1 von 52
Downloaden Sie, um offline zu lesen
Routing in Drupal 8
July 31, 2014
Nice to Meet You!
SECTION TITLE
Kalpana Goel
Developer
William Hurley
Manager, Technical
Development
Routes basically are the mappings between URL
paths and their corresponding page and access
callbacks.
What is a route?
What’s Changed
hook_menu defines the
routing in Drupal 7
SECTION TITLE
1:1 mapping of path to route
hook_menu is dead in 8.0.x
SECTION TITLE
There is no hook_menu in Drupal 8!
MODULENAME.routing.yml
One path may map to multiple routes
Why the Change?
D7 hook_menu
SECTION TITLE
● Routing (page and access callbacks)
● Menu links
● Local actions
● Local tasks
● Breadcrumbs
● Contextual links
● Title
● Weight
*.links.actin.ml *.links.contexual.yml
Basic Example
D7: hook_menu()
function user_menu() {
$items['user/logout'] = array(
'title' => 'Log out',
'access callback' => 'user_is_logged_in',
'page callback' => 'user_logout',
'weight' => 10,
'menu_name' => 'user-menu',
'file' => 'user.pages.inc',
);
return $items;
}
D8: Routing
user.routing.yml
user.logout:
path: '/user/logout'
defaults:
_controller: 'DrupaluserControllerUserController::logout'
requirements:
_user_is_logged_in: 'TRUE'
D7: page callback
/**
* Menu callback; logs the current user out, and redirects to the home page.
*/
function user_logout() {
global $user;
watchdog('user', 'Session closed for %name.', array('%name' => $user->name));
module_invoke_all('user_logout', $user);
// Destroy the current session, and reset $user to the anonymous user.
session_destroy();
drupal_goto();
}
D8: Controller
namespace DrupaluserController;
class UserController extends ControllerBase {
public function logout() {
user_logout();
return $this->redirect('<front>');
}
Path Variables
D8: Path (required)
For dynamic properties, you can include them in curly braces.
For example -
‘/admin/structure/views/{js}/display/{view}/{display_id}/{type}'
The {display_id} element in the URL is called a slug and is
available as $display_id in the controller method.
D8: dynamic path example
views_ui.form_display:
path: '/admin/structure/views/{js}/display/{view}/{display_id}/{type}'
defaults:
_content: 'Drupalviews_uiFormAjaxDisplay::getForm'
class Display extends ViewsFormBase {
public function getForm(ViewStorageInterface $view, $display_id, $js, $type =
NULL) {
$this->setType($type);
return parent::getForm($view, $display_id, $js);
}
D8: Optional Attributes
user.cancel_confirm:
path: '/user/{user}/cancel/confirm/{timestamp}/{hashed_pass}'
defaults:
_title: 'Confirm account cancellation'
_content: 'DrupaluserControllerUserController::confirmCancel'
timestamp: 0
hashed_pass: ''
D8: Page Title
user.view:
path: '/user/{user}'
defaults:
_entity_view: 'user.full'
_title_callback: 'DrupaluserControllerUserController::userTitle'
requirements:
_entity_access: 'user.view'
D8: Page Types
_content : -display content on a page
_form : - display form on a page.
_controller : - use to generate raw data like json output
_entity_view : - for example - node.teaser
_entity_form : - display a form for a entity
_entity_list : - display list of entity like node
Access Restrictions
D8: Available Checks
_permission - A permission string (e.g. - _permission: ‘access
content’)
_role : A specific user role (e.g.- administrator)
_entity_access: In case where an entity is part of route, can check
a certain access level before granting access (e.g. node.view)
_custom_access: You can also do custom access checking on
route.
Same as title callback (define as method on class)Read more -
https://www.drupal.org/node/2122195
D8: Access check
user.role_add:
path: '/admin/people/roles/add'
defaults:
_entity_form: user_role.default
_title: 'Add role'
requirements:
_permission: 'administer permissions'
Some permissions based on roles , permissions
_permission: ‘administer nodes’
_role: ‘administrator’
Based upon access to Entities
_entity_access: $entity_type.$operation
check to see if everyone has access
_access: TRUE
D8: Access check
Multiple access check -
node.add_page:
path: '/node/add'
defaults:
_title: 'Add content'
_content:
'DrupalnodeControllerNodeController::addPage'
options:
_access_mode: 'ANY'
_node_operation_route: TRUE
requirements:
_permission: 'administer content types'
_node_add_access: 'node'
Forms
D7: Form Router
$items['user/password'] = array(
'title' => 'Request new password',
'page callback' => 'drupal_get_form',
'page arguments' => array('user_pass'),
'access callback' => TRUE,
'type' => MENU_LOCAL_TASK,
'file' => 'user.pages.inc',
);
D8: Form Router
Forms are classes
There is no method in forms as forms are presented as one class
Use _form instead of _content or _controller
user.pass:
path: '/user/password'
defaults:
_form: 'DrupaluserFormUserPasswordForm'
_title: 'Request new password'
requirements:
_access: 'TRUE'
options:
_maintenance_access: TRUE
D7: User Password Form
function user_pass() {
$form['name'] = array(
'#type' => 'textfield',
'#title' => t('Username or e-mail address'),
'#size' => 60,
'#maxlength' => max(USERNAME_MAX_LENGTH,
EMAIL_MAX_LENGTH),
'#required' => TRUE,
'#default_value' => isset($_GET['name']) ? $_GET['name'] : '',
);
[...]
}
function user_pass_validate($form, &$form_state)
function user_pass_submit($form, &$form_state)
D8: Form Interface
namespace DrupalCoreForm;
* Provides an interface for a Form.
interface FormInterface {
* Returns a unique string identifying the form
public function getFormId();
*Form constructor.
public function buildForm(array $form, array &$form_state);
* Form validation handler.
public function validateForm(array &$form, array &$form_state);
* Form submission handler.
public function submitForm(array &$form, array &$form_state);
}
D8: User Password Form
class UserPasswordForm extends FormBase {
public function getFormId() { return ‘user_pass’; }
public function buildForm(array $form, array &$form_state) {
$form['name'] = array(
'#type' => 'textfield',
'#title' => $this->t('Username or email address'),
'#size' => 60,
'#maxlength' => max(USERNAME_MAX_LENGTH,
EMAIL_MAX_LENGTH),
'#required' => TRUE,
);
public function submitForm(array &$form, array &$form_state) {....}
public function validateForm(array &$form, array &$form_state) {...}
D7: Form Validation
function user_pass_validate($form, &$form_state) {
[...]
form_set_error('name', t('Sorry, %name is not recognized as a user
name or an e-mail address.', array('%name' => $name)));
}
D8: Form Validation
public function validateForm(array &$form, array &$form_state) {
[...]
$this->setFormError('name', $form_state, $this->t('Sorry, %name is not
recognized as a username or an email address.', array('%name' =>
$name)));
}
D8: Form Base
class* * Base class for implementing system configuration forms.
DrupalcoreformConfigFormBase
for example -
class MenuSettingsForm extends ConfigFormBase
** generic base class - thisincludes string translation, link generator
DrupalCoreFormFormBase
for example -
class UserLoginForm extends FormBase
** base class for a confirmation form.
DrupalCoreFormConfirmFormBase
for example -
class LoggingForm extends ConfigFormBase
Other functionality
from hook_menu
local task
local task
local task
D7: menu local tasks
$items['user/password'] = array(
'title' => 'Request new password',
'page callback' => 'drupal_get_form',
'page arguments' => array('user_pass'),
'access callback' => TRUE,
'type' => MENU_LOCAL_TASK,
'file' => 'user.pages.inc',
);
D8: menu local tasks
user.links.task.yml
user.page:
route_name: user.page
base_route: user.page
title: 'Log in'
weight: -10
user.pass:
route_name: user.pass
base_route: user.page
title: 'Request new password'
local action
D7: Local action
$items['admin/structure/types/add'] = array(
'title' => 'Add content type',
'page callback' => 'drupal_get_form',
'page arguments' => array('node_type_form'),
'access arguments' => array('administer content types'),
'type' => MENU_LOCAL_ACTION,
'file' => 'content_types.inc',
);
D8: Local action
node.links.action.yml
node.add_page:
route_name: node.add_page
title: 'Add content'
appears_on:
- system.admin_content
D8: Local action on multiple pages
block_content.links.action.yml
block_content_add_action:
route_name: block_content.add_page
title: 'Add custom block'
appears_on:
- block.admin_display
- block.admin_display_theme
- block_content.list
D8: Contextual
links
D7: Contextual
links$items['admin/structure/block/manage/%/%/configure'] = array(
'title' => 'Configure block',
'type' => MENU_DEFAULT_LOCAL_TASK,
'context' => MENU_CONTEXT_INLINE,
);
D8: Contextual
links
block.links.contextual.yml
block_configure:
title: 'Configure block'
route_name: 'block.admin_edit'
group: 'block'
D8: breadcrumb
breadcrumb is path based in Drupal 8
https://www.drupal.org/node/2098323
Useful Tips
Options
Useful Tips
_admin_route -- whether to use the admin theme for this route
_maintenance_access -- whether route is publicly available when the site
is in maintenance mode
_access_mode -- whether requirements are ANY or ALL
Useful links
SECTION TITLE
https://www.drupal.org/node/1800686 - change record
https://www.drupal.org/node/2118147 - D7 to D8 upgrade tutorial
https://www.drupal.org/developing/api/8/routing - Routing system in D8
THANK YOU!
Kalpana Goel
William Hurley

Weitere ähnliche Inhalte

Was ist angesagt?

First Steps in Drupal Code Driven Development
First Steps in Drupal Code Driven DevelopmentFirst Steps in Drupal Code Driven Development
First Steps in Drupal Code Driven DevelopmentNuvole
 
Ajax nested form and ajax upload in rails
Ajax nested form and ajax upload in railsAjax nested form and ajax upload in rails
Ajax nested form and ajax upload in railsTse-Ching Ho
 
Drupal is Stupid (But I Love It Anyway)
Drupal is Stupid (But I Love It Anyway)Drupal is Stupid (But I Love It Anyway)
Drupal is Stupid (But I Love It Anyway)brockboland
 
Анатолий Поляков - Drupal.ajax framework from a to z
Анатолий Поляков - Drupal.ajax framework from a to zАнатолий Поляков - Drupal.ajax framework from a to z
Анатолий Поляков - Drupal.ajax framework from a to zLEDC 2016
 
Doctrine For Beginners
Doctrine For BeginnersDoctrine For Beginners
Doctrine For BeginnersJonathan Wage
 
Be RESTful (Symfony Camp 2008)
Be RESTful (Symfony Camp 2008)Be RESTful (Symfony Camp 2008)
Be RESTful (Symfony Camp 2008)Fabien Potencier
 
Drupal 7 Theming - Behind the scenes
Drupal 7 Theming - Behind the scenes Drupal 7 Theming - Behind the scenes
Drupal 7 Theming - Behind the scenes ramakesavan
 
Bag Of Tricks From Iusethis
Bag Of Tricks From IusethisBag Of Tricks From Iusethis
Bag Of Tricks From IusethisMarcus Ramberg
 
Drupal 8: Forms
Drupal 8: FormsDrupal 8: Forms
Drupal 8: Formsdrubb
 
Introduction to ZendX jQuery
Introduction to ZendX jQueryIntroduction to ZendX jQuery
Introduction to ZendX jQuerydennisdc
 
Dependency injection-zendcon-2010
Dependency injection-zendcon-2010Dependency injection-zendcon-2010
Dependency injection-zendcon-2010Fabien Potencier
 
Rails Routing and URL design
Rails Routing and URL designRails Routing and URL design
Rails Routing and URL designhiq5
 
Django Class-based views (Slovenian)
Django Class-based views (Slovenian)Django Class-based views (Slovenian)
Django Class-based views (Slovenian)Luka Zakrajšek
 
Twitter bootstrap
Twitter bootstrapTwitter bootstrap
Twitter bootstrapdennisdc
 
Writing Drupal 5 Module
Writing Drupal 5 ModuleWriting Drupal 5 Module
Writing Drupal 5 ModuleSammy Fung
 

Was ist angesagt? (20)

First Steps in Drupal Code Driven Development
First Steps in Drupal Code Driven DevelopmentFirst Steps in Drupal Code Driven Development
First Steps in Drupal Code Driven Development
 
Amp Up Your Admin
Amp Up Your AdminAmp Up Your Admin
Amp Up Your Admin
 
Ajax nested form and ajax upload in rails
Ajax nested form and ajax upload in railsAjax nested form and ajax upload in rails
Ajax nested form and ajax upload in rails
 
Drupal is Stupid (But I Love It Anyway)
Drupal is Stupid (But I Love It Anyway)Drupal is Stupid (But I Love It Anyway)
Drupal is Stupid (But I Love It Anyway)
 
BEAR DI
BEAR DIBEAR DI
BEAR DI
 
Анатолий Поляков - Drupal.ajax framework from a to z
Анатолий Поляков - Drupal.ajax framework from a to zАнатолий Поляков - Drupal.ajax framework from a to z
Анатолий Поляков - Drupal.ajax framework from a to z
 
Doctrine For Beginners
Doctrine For BeginnersDoctrine For Beginners
Doctrine For Beginners
 
Be RESTful (Symfony Camp 2008)
Be RESTful (Symfony Camp 2008)Be RESTful (Symfony Camp 2008)
Be RESTful (Symfony Camp 2008)
 
Codigo taller-plugins
Codigo taller-pluginsCodigo taller-plugins
Codigo taller-plugins
 
Drupal 7 Theming - Behind the scenes
Drupal 7 Theming - Behind the scenes Drupal 7 Theming - Behind the scenes
Drupal 7 Theming - Behind the scenes
 
Alfredo-PUMEX
Alfredo-PUMEXAlfredo-PUMEX
Alfredo-PUMEX
 
Bag Of Tricks From Iusethis
Bag Of Tricks From IusethisBag Of Tricks From Iusethis
Bag Of Tricks From Iusethis
 
Drupal 8: Forms
Drupal 8: FormsDrupal 8: Forms
Drupal 8: Forms
 
Introduction to ZendX jQuery
Introduction to ZendX jQueryIntroduction to ZendX jQuery
Introduction to ZendX jQuery
 
Dependency injection-zendcon-2010
Dependency injection-zendcon-2010Dependency injection-zendcon-2010
Dependency injection-zendcon-2010
 
Rails Routing and URL design
Rails Routing and URL designRails Routing and URL design
Rails Routing and URL design
 
Your Entity, Your Code
Your Entity, Your CodeYour Entity, Your Code
Your Entity, Your Code
 
Django Class-based views (Slovenian)
Django Class-based views (Slovenian)Django Class-based views (Slovenian)
Django Class-based views (Slovenian)
 
Twitter bootstrap
Twitter bootstrapTwitter bootstrap
Twitter bootstrap
 
Writing Drupal 5 Module
Writing Drupal 5 ModuleWriting Drupal 5 Module
Writing Drupal 5 Module
 

Ähnlich wie Routing in Drupal 8

jQuery UI Widgets, Drag and Drop, Drupal 7 Javascript
jQuery UI Widgets, Drag and Drop, Drupal 7 JavascriptjQuery UI Widgets, Drag and Drop, Drupal 7 Javascript
jQuery UI Widgets, Drag and Drop, Drupal 7 JavascriptDarren Mothersele
 
PHPConf-TW 2012 # Twig
PHPConf-TW 2012 # TwigPHPConf-TW 2012 # Twig
PHPConf-TW 2012 # TwigWake Liu
 
Debugging in drupal 8
Debugging in drupal 8Debugging in drupal 8
Debugging in drupal 8Allie Jones
 
Binary Studio Academy 2016: Laravel Controllers
Binary Studio Academy 2016: Laravel ControllersBinary Studio Academy 2016: Laravel Controllers
Binary Studio Academy 2016: Laravel ControllersBinary Studio
 
Learning the basics of the Drupal API
Learning the basics of the Drupal APILearning the basics of the Drupal API
Learning the basics of the Drupal APIAlexandru Badiu
 
Building Large jQuery Applications
Building Large jQuery ApplicationsBuilding Large jQuery Applications
Building Large jQuery ApplicationsRebecca Murphey
 
Your Entity, Your Code
Your Entity, Your CodeYour Entity, Your Code
Your Entity, Your CodeDrupalDay
 
Drupal csu-open atriumname
Drupal csu-open atriumnameDrupal csu-open atriumname
Drupal csu-open atriumnameEmanuele Quinto
 
More to RoC weibo
More to RoC weiboMore to RoC weibo
More to RoC weiboshaokun
 
Laravel 5 In Depth
Laravel 5 In DepthLaravel 5 In Depth
Laravel 5 In DepthKirk Bushell
 
Drupal Module Development - OSI Days 2010
Drupal Module Development - OSI Days 2010Drupal Module Development - OSI Days 2010
Drupal Module Development - OSI Days 2010Siva Epari
 
Drupal Module Development
Drupal Module DevelopmentDrupal Module Development
Drupal Module Developmentipsitamishra
 
Using and reusing CakePHP plugins
Using and reusing CakePHP pluginsUsing and reusing CakePHP plugins
Using and reusing CakePHP pluginsPierre MARTIN
 
Opencast Admin UI - Introduction to developing using AngularJS
Opencast Admin UI - Introduction to developing using AngularJSOpencast Admin UI - Introduction to developing using AngularJS
Opencast Admin UI - Introduction to developing using AngularJSbuttyx
 

Ähnlich wie Routing in Drupal 8 (20)

jQuery UI Widgets, Drag and Drop, Drupal 7 Javascript
jQuery UI Widgets, Drag and Drop, Drupal 7 JavascriptjQuery UI Widgets, Drag and Drop, Drupal 7 Javascript
jQuery UI Widgets, Drag and Drop, Drupal 7 Javascript
 
PHPConf-TW 2012 # Twig
PHPConf-TW 2012 # TwigPHPConf-TW 2012 # Twig
PHPConf-TW 2012 # Twig
 
Drupal 8 Hooks
Drupal 8 HooksDrupal 8 Hooks
Drupal 8 Hooks
 
Debugging in drupal 8
Debugging in drupal 8Debugging in drupal 8
Debugging in drupal 8
 
Drupal 8 migrate!
Drupal 8 migrate!Drupal 8 migrate!
Drupal 8 migrate!
 
Binary Studio Academy 2016: Laravel Controllers
Binary Studio Academy 2016: Laravel ControllersBinary Studio Academy 2016: Laravel Controllers
Binary Studio Academy 2016: Laravel Controllers
 
Learning the basics of the Drupal API
Learning the basics of the Drupal APILearning the basics of the Drupal API
Learning the basics of the Drupal API
 
Drupal 8 Services
Drupal 8 ServicesDrupal 8 Services
Drupal 8 Services
 
Building Large jQuery Applications
Building Large jQuery ApplicationsBuilding Large jQuery Applications
Building Large jQuery Applications
 
Your Entity, Your Code
Your Entity, Your CodeYour Entity, Your Code
Your Entity, Your Code
 
Drupal csu-open atriumname
Drupal csu-open atriumnameDrupal csu-open atriumname
Drupal csu-open atriumname
 
More to RoC weibo
More to RoC weiboMore to RoC weibo
More to RoC weibo
 
Laravel 5 In Depth
Laravel 5 In DepthLaravel 5 In Depth
Laravel 5 In Depth
 
Drupal Module Development - OSI Days 2010
Drupal Module Development - OSI Days 2010Drupal Module Development - OSI Days 2010
Drupal Module Development - OSI Days 2010
 
Drupal Module Development
Drupal Module DevelopmentDrupal Module Development
Drupal Module Development
 
Using and reusing CakePHP plugins
Using and reusing CakePHP pluginsUsing and reusing CakePHP plugins
Using and reusing CakePHP plugins
 
Laravel
LaravelLaravel
Laravel
 
Drupal Workshop: Introducción al Backend de Drupal
Drupal  Workshop: Introducción al Backend de DrupalDrupal  Workshop: Introducción al Backend de Drupal
Drupal Workshop: Introducción al Backend de Drupal
 
RESTful web services
RESTful web servicesRESTful web services
RESTful web services
 
Opencast Admin UI - Introduction to developing using AngularJS
Opencast Admin UI - Introduction to developing using AngularJSOpencast Admin UI - Introduction to developing using AngularJS
Opencast Admin UI - Introduction to developing using AngularJS
 

Kürzlich hochgeladen

Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...Nikki Chapple
 
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security ObservabilityGlenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security Observabilityitnewsafrica
 
2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch TuesdayIvanti
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPathCommunity
 
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Alkin Tezuysal
 
Landscape Catalogue 2024 Australia-1.pdf
Landscape Catalogue 2024 Australia-1.pdfLandscape Catalogue 2024 Australia-1.pdf
Landscape Catalogue 2024 Australia-1.pdfAarwolf Industries LLC
 
QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesBernd Ruecker
 
Accelerating Enterprise Software Engineering with Platformless
Accelerating Enterprise Software Engineering with PlatformlessAccelerating Enterprise Software Engineering with Platformless
Accelerating Enterprise Software Engineering with PlatformlessWSO2
 
WomenInAutomation2024: AI and Automation for eveyone
WomenInAutomation2024: AI and Automation for eveyoneWomenInAutomation2024: AI and Automation for eveyone
WomenInAutomation2024: AI and Automation for eveyoneUiPathCommunity
 
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...panagenda
 
React Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App FrameworkReact Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App FrameworkPixlogix Infotech
 
JET Technology Labs White Paper for Virtualized Security and Encryption Techn...
JET Technology Labs White Paper for Virtualized Security and Encryption Techn...JET Technology Labs White Paper for Virtualized Security and Encryption Techn...
JET Technology Labs White Paper for Virtualized Security and Encryption Techn...amber724300
 
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical InfrastructureVarsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructureitnewsafrica
 
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...Nikki Chapple
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Hiroshi SHIBATA
 
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS:  6 Ways to Automate Your Data IntegrationBridging Between CAD & GIS:  6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integrationmarketing932765
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Farhan Tariq
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfpanagenda
 
A Glance At The Java Performance Toolbox
A Glance At The Java Performance ToolboxA Glance At The Java Performance Toolbox
A Glance At The Java Performance ToolboxAna-Maria Mihalceanu
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality AssuranceInflectra
 

Kürzlich hochgeladen (20)

Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
 
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security ObservabilityGlenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
 
2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch Tuesday
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to Hero
 
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
 
Landscape Catalogue 2024 Australia-1.pdf
Landscape Catalogue 2024 Australia-1.pdfLandscape Catalogue 2024 Australia-1.pdf
Landscape Catalogue 2024 Australia-1.pdf
 
QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architectures
 
Accelerating Enterprise Software Engineering with Platformless
Accelerating Enterprise Software Engineering with PlatformlessAccelerating Enterprise Software Engineering with Platformless
Accelerating Enterprise Software Engineering with Platformless
 
WomenInAutomation2024: AI and Automation for eveyone
WomenInAutomation2024: AI and Automation for eveyoneWomenInAutomation2024: AI and Automation for eveyone
WomenInAutomation2024: AI and Automation for eveyone
 
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
 
React Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App FrameworkReact Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App Framework
 
JET Technology Labs White Paper for Virtualized Security and Encryption Techn...
JET Technology Labs White Paper for Virtualized Security and Encryption Techn...JET Technology Labs White Paper for Virtualized Security and Encryption Techn...
JET Technology Labs White Paper for Virtualized Security and Encryption Techn...
 
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical InfrastructureVarsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
 
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024
 
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS:  6 Ways to Automate Your Data IntegrationBridging Between CAD & GIS:  6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
 
A Glance At The Java Performance Toolbox
A Glance At The Java Performance ToolboxA Glance At The Java Performance Toolbox
A Glance At The Java Performance Toolbox
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
 

Routing in Drupal 8

  • 1. Routing in Drupal 8 July 31, 2014
  • 2. Nice to Meet You! SECTION TITLE Kalpana Goel Developer William Hurley Manager, Technical Development
  • 3. Routes basically are the mappings between URL paths and their corresponding page and access callbacks. What is a route?
  • 5. hook_menu defines the routing in Drupal 7 SECTION TITLE 1:1 mapping of path to route
  • 6. hook_menu is dead in 8.0.x SECTION TITLE There is no hook_menu in Drupal 8! MODULENAME.routing.yml One path may map to multiple routes
  • 7.
  • 9. D7 hook_menu SECTION TITLE ● Routing (page and access callbacks) ● Menu links ● Local actions ● Local tasks ● Breadcrumbs ● Contextual links ● Title ● Weight
  • 12. D7: hook_menu() function user_menu() { $items['user/logout'] = array( 'title' => 'Log out', 'access callback' => 'user_is_logged_in', 'page callback' => 'user_logout', 'weight' => 10, 'menu_name' => 'user-menu', 'file' => 'user.pages.inc', ); return $items; }
  • 13. D8: Routing user.routing.yml user.logout: path: '/user/logout' defaults: _controller: 'DrupaluserControllerUserController::logout' requirements: _user_is_logged_in: 'TRUE'
  • 14. D7: page callback /** * Menu callback; logs the current user out, and redirects to the home page. */ function user_logout() { global $user; watchdog('user', 'Session closed for %name.', array('%name' => $user->name)); module_invoke_all('user_logout', $user); // Destroy the current session, and reset $user to the anonymous user. session_destroy(); drupal_goto(); }
  • 15. D8: Controller namespace DrupaluserController; class UserController extends ControllerBase { public function logout() { user_logout(); return $this->redirect('<front>'); }
  • 17. D8: Path (required) For dynamic properties, you can include them in curly braces. For example - ‘/admin/structure/views/{js}/display/{view}/{display_id}/{type}' The {display_id} element in the URL is called a slug and is available as $display_id in the controller method.
  • 18. D8: dynamic path example views_ui.form_display: path: '/admin/structure/views/{js}/display/{view}/{display_id}/{type}' defaults: _content: 'Drupalviews_uiFormAjaxDisplay::getForm' class Display extends ViewsFormBase { public function getForm(ViewStorageInterface $view, $display_id, $js, $type = NULL) { $this->setType($type); return parent::getForm($view, $display_id, $js); }
  • 19. D8: Optional Attributes user.cancel_confirm: path: '/user/{user}/cancel/confirm/{timestamp}/{hashed_pass}' defaults: _title: 'Confirm account cancellation' _content: 'DrupaluserControllerUserController::confirmCancel' timestamp: 0 hashed_pass: ''
  • 20. D8: Page Title user.view: path: '/user/{user}' defaults: _entity_view: 'user.full' _title_callback: 'DrupaluserControllerUserController::userTitle' requirements: _entity_access: 'user.view'
  • 21. D8: Page Types _content : -display content on a page _form : - display form on a page. _controller : - use to generate raw data like json output _entity_view : - for example - node.teaser _entity_form : - display a form for a entity _entity_list : - display list of entity like node
  • 23. D8: Available Checks _permission - A permission string (e.g. - _permission: ‘access content’) _role : A specific user role (e.g.- administrator) _entity_access: In case where an entity is part of route, can check a certain access level before granting access (e.g. node.view) _custom_access: You can also do custom access checking on route. Same as title callback (define as method on class)Read more - https://www.drupal.org/node/2122195
  • 24. D8: Access check user.role_add: path: '/admin/people/roles/add' defaults: _entity_form: user_role.default _title: 'Add role' requirements: _permission: 'administer permissions' Some permissions based on roles , permissions _permission: ‘administer nodes’ _role: ‘administrator’ Based upon access to Entities _entity_access: $entity_type.$operation check to see if everyone has access _access: TRUE
  • 25. D8: Access check Multiple access check - node.add_page: path: '/node/add' defaults: _title: 'Add content' _content: 'DrupalnodeControllerNodeController::addPage' options: _access_mode: 'ANY' _node_operation_route: TRUE requirements: _permission: 'administer content types' _node_add_access: 'node'
  • 26. Forms
  • 27. D7: Form Router $items['user/password'] = array( 'title' => 'Request new password', 'page callback' => 'drupal_get_form', 'page arguments' => array('user_pass'), 'access callback' => TRUE, 'type' => MENU_LOCAL_TASK, 'file' => 'user.pages.inc', );
  • 28. D8: Form Router Forms are classes There is no method in forms as forms are presented as one class Use _form instead of _content or _controller user.pass: path: '/user/password' defaults: _form: 'DrupaluserFormUserPasswordForm' _title: 'Request new password' requirements: _access: 'TRUE' options: _maintenance_access: TRUE
  • 29. D7: User Password Form function user_pass() { $form['name'] = array( '#type' => 'textfield', '#title' => t('Username or e-mail address'), '#size' => 60, '#maxlength' => max(USERNAME_MAX_LENGTH, EMAIL_MAX_LENGTH), '#required' => TRUE, '#default_value' => isset($_GET['name']) ? $_GET['name'] : '', ); [...] } function user_pass_validate($form, &$form_state) function user_pass_submit($form, &$form_state)
  • 30. D8: Form Interface namespace DrupalCoreForm; * Provides an interface for a Form. interface FormInterface { * Returns a unique string identifying the form public function getFormId(); *Form constructor. public function buildForm(array $form, array &$form_state); * Form validation handler. public function validateForm(array &$form, array &$form_state); * Form submission handler. public function submitForm(array &$form, array &$form_state); }
  • 31. D8: User Password Form class UserPasswordForm extends FormBase { public function getFormId() { return ‘user_pass’; } public function buildForm(array $form, array &$form_state) { $form['name'] = array( '#type' => 'textfield', '#title' => $this->t('Username or email address'), '#size' => 60, '#maxlength' => max(USERNAME_MAX_LENGTH, EMAIL_MAX_LENGTH), '#required' => TRUE, ); public function submitForm(array &$form, array &$form_state) {....} public function validateForm(array &$form, array &$form_state) {...}
  • 32. D7: Form Validation function user_pass_validate($form, &$form_state) { [...] form_set_error('name', t('Sorry, %name is not recognized as a user name or an e-mail address.', array('%name' => $name))); }
  • 33. D8: Form Validation public function validateForm(array &$form, array &$form_state) { [...] $this->setFormError('name', $form_state, $this->t('Sorry, %name is not recognized as a username or an email address.', array('%name' => $name))); }
  • 34. D8: Form Base class* * Base class for implementing system configuration forms. DrupalcoreformConfigFormBase for example - class MenuSettingsForm extends ConfigFormBase ** generic base class - thisincludes string translation, link generator DrupalCoreFormFormBase for example - class UserLoginForm extends FormBase ** base class for a confirmation form. DrupalCoreFormConfirmFormBase for example - class LoggingForm extends ConfigFormBase
  • 39. D7: menu local tasks $items['user/password'] = array( 'title' => 'Request new password', 'page callback' => 'drupal_get_form', 'page arguments' => array('user_pass'), 'access callback' => TRUE, 'type' => MENU_LOCAL_TASK, 'file' => 'user.pages.inc', );
  • 40. D8: menu local tasks user.links.task.yml user.page: route_name: user.page base_route: user.page title: 'Log in' weight: -10 user.pass: route_name: user.pass base_route: user.page title: 'Request new password'
  • 42. D7: Local action $items['admin/structure/types/add'] = array( 'title' => 'Add content type', 'page callback' => 'drupal_get_form', 'page arguments' => array('node_type_form'), 'access arguments' => array('administer content types'), 'type' => MENU_LOCAL_ACTION, 'file' => 'content_types.inc', );
  • 43. D8: Local action node.links.action.yml node.add_page: route_name: node.add_page title: 'Add content' appears_on: - system.admin_content
  • 44. D8: Local action on multiple pages block_content.links.action.yml block_content_add_action: route_name: block_content.add_page title: 'Add custom block' appears_on: - block.admin_display - block.admin_display_theme - block_content.list
  • 46. D7: Contextual links$items['admin/structure/block/manage/%/%/configure'] = array( 'title' => 'Configure block', 'type' => MENU_DEFAULT_LOCAL_TASK, 'context' => MENU_CONTEXT_INLINE, );
  • 47. D8: Contextual links block.links.contextual.yml block_configure: title: 'Configure block' route_name: 'block.admin_edit' group: 'block'
  • 48. D8: breadcrumb breadcrumb is path based in Drupal 8 https://www.drupal.org/node/2098323
  • 50. Options Useful Tips _admin_route -- whether to use the admin theme for this route _maintenance_access -- whether route is publicly available when the site is in maintenance mode _access_mode -- whether requirements are ANY or ALL
  • 51. Useful links SECTION TITLE https://www.drupal.org/node/1800686 - change record https://www.drupal.org/node/2118147 - D7 to D8 upgrade tutorial https://www.drupal.org/developing/api/8/routing - Routing system in D8

Hinweis der Redaktion

  1. This is a general overview of how routing works. So request comes in via your mobile devices or browser and you get a response in the format of JSON or HTML, an image, a redirect or a 404 return. Drupal routing works with Symfony HTTP Kernel, but you don’t need to know the details how it works. In Symfony there is an object which converts request into response which is called HTTP kernel. router matches the incoming URl to a specific route and returns information about the route including controller that should be executed. Symfony kernel executes the controller, which returns a response object.
  2. hook_menu did too much in Drupal 7 and it was very complicated to understand what it was doing or it was very difficult to do any advanced task with it.
  3. This example is from user module from Drupal 7. As you can see it has path - user/logout, title as change log out, access callback, page callback, weight, menu-name, and this callback happens to be in separate file - user.pages.inc
  4. So this part takes over the routing aspect from drupal 7. This is routing yml for Drupal 8. modulename.routing.yml There is a machine name - user.logout of the route(modulname.something), path is - user/logout, it is same as what used to be in the key array items. There is two other section - defaults and requirements. The new thing is the controller part here which is following PSR-4 standard here but I am not covering here but this is the controller we are using here = DrupaluserControllerUserController instead of old page callback. Controller has a class name - DrupaluserControllerUserController and logout is method name. For the requirement, it is same as access callback in hook_menu in Drupal 7, here we have if user is logged in as requirement instead of access argument.
  5. This is a page callback in Drupal 7. All it does is logs out the user, closes the session and takes user to the homepage.
  6. This is Drupal 8 version, In d8 everything is in objects and classes. so here we have a namespace. In Drupal 8, we are using psr -4 (to know where files are). we have a method here which is for logout. All it does is logs out the current user and redirect user to homepage. So the general concept is that instead of having a function in a one file you have it in in method in a class.
  7. Path is required in Drupal 8.
  8. If you are using node IDs in the URL, the ID can be automatically be converted to a node object by ParamConvertor system so it loads an entity from an existing entity ID. In this example above, its using id as one of the parameter, you can see order doesn’t matter here. so we have a entity type view here and in the method, it loads the complete views object.
  9. In some cases, you can provide default value under defaults. By default drupal passes some parameter. if you go to user/somenumber/cancel/confirm page then something will be displayed and if you dont provide default value for timestamp and hashed_pass then it will return 404 page.
  10. So we do have title_callback here, if you go to user/specific user page then you want to display user name as the title so we are using title_callback here. same syntax as controller.
  11. 5 available defaults in Drupal 8. it is required in drupal 8 Controller is for non-HTML, JSON or only for partial HTML but no theming or block will be output. entity_view - value is entity_type.view_mode. for example node.teaser will return render array of the node in teaser mode. entity_form - for example _entity_form: node.default will display the default node form. entity_list : - for example view_mode returns the list of view modes.
  12. requirements - determines what conditions must be met in order to grant access to the route. role - since this can be different for sites so its recommended to use permission based on access restriction. _format:json - so it only matches requests when the accept header is json _module
  13. In Drupal 8, routing is very powerful. So now you need to check access on the page like does the user has certain role or permission so symfony provides requirements. So here is _permission and also there is role so you can specify if user has permission to access the content based on role and permission. There is also _entity_access permission. So if user go to node.edit so if user has permission to edit the node
  14. In Drupal 8, you can also have multiple access checks. In the above route, there are two access check. options “any” means if either of the requirements is true then user will be able to access the page. If there is _access_mode: All then both requirements need to meet in order to access the page. This is very powerful than Drupal 7. Default is “ALL” A very interesting thing here - _node_operation_route:TRUE - You can configure in node module that all node related routes show the admin theme so this is a flag which flags the route here.
  15. In Drupal 8, we are using form api such as user login page. In the previous example we saw _controller, _content and so on. in Drupal 8 forms are classes. use _form . there is no method so one form is presented as one class. here in this example, we have a user login form
  16. In Drupal 8, we are using form api such as user login page. In the previous example we saw _controller, _content and so on. in Drupal 8 forms are classes. use _form . there is no method so one form is presented as one class. here in this example, we have a user login form
  17. In Drupal 8, here is user login form, it has a getFormId function, buildform function, and submit function, validateAuthentication, validateName and validateFiinal function. build form lets you build the form structure. submit method is executed when form is submitted. validateName function is for -- Sets an error if supplied username has been blocked. validateAuthentication function is for checking supplied username/password against local users table. validateFinal function is for checking if user was not authenticated, or if too many logins were attempted, Code was too long to paste here so just wanted to show you an example of form in Drupal 8.
  18. In Drupal 8, here is user login form, it has a getFormId function, buildform function, and submit function, validateAuthentication, validateName and validateFiinal function. build form lets you build the form structure. submit method is executed when form is submitted. validateName function is for -- Sets an error if supplied username has been blocked. validateAuthentication function is for checking supplied username/password against local users table. validateFinal function is for checking if user was not authenticated, or if too many logins were attempted, Code was too long to paste here so just wanted to show you an example of form in Drupal 8.
  19. In Drupal 8, here is user login form, it has a getFormId function, buildform function, and submit function, validateFinal function is for checking if user was not authenticated, or if too many logins were attempted,
  20. Just want to show you submitForm method in detail here for user login form. so after user submits login form then you want to redirect user to somewhere and in this case user is directed to user.view route so you are redirecting user to user/123 page so you are not using path here anymore but you are giving routename here,
  21. Just want to show you submitForm method in detail here for user login form. so after user submits login form then you want to redirect user to somewhere and in this case user is directed to user.view route so you are redirecting user to user/123 page so you are not using path here anymore but you are giving routename here,
  22. There are some helper classes for form . ConfigFormBase - Provides an generic base class for a confirmation form. FormBase - generic base class - includes string translation, link generator, ConfirmFormBase -
  23. in Drupal 8 you have menu local tasks in its own file so here we have user.links.task.yml file.
  24. in Drupal 8 you have menu local tasks in its own file so here we have user.links.task.yml file.
  25. in Drupal 8 you have menu local tasks in its own file so here we have user.links.task.yml file.
  26. in Drupal 8 you have menu local tasks in its own file so here we have user.links.task.yml file. here we don’t path anymore but we have route_name, base_route, title, and weight. base_route so tabs appear on same page.
  27. in Drupal 8 you have menu local tasks in its own file so here we have user.links.task.yml file. here we don’t path anymore but we have route_name, base_route, title, and weight. base_route so tabs appear on same page.
  28. in Drupal 8 we have local action which is add content here in this image. so you can easily create some content.
  29. in Drupal 8, you can define local action in node.links.action.yml. you have machine name, route name, title. important thing to notice is “appears on” where this local action should appear.
  30. in Drupal 8, you can define local action in node.links.action.yml. you have machine name, route name, title. important thing to notice is “appears on” where this local action should appear.
  31. in Drupal 8, if you hover over any block then you get this “configure block” icon so in drupal 8 you can configure block where should it appear and you can do that in contextual yml file.
  32. in Drupal 8, you can configure block where should it appear and you can do that in contextual yml file for example - block.links.contextual.yml. again machine name, title, group, and route name. everything which is related to block contextual link should appear under block group
  33. in Drupal 8, you can configure block where should it appear and you can do that in contextual yml file for example - block.links.contextual.yml. again machine name, title, group, and route name. everything which is related to block contextual link should appear under block group Check BlockViewBuilder - group block is defined there in the render array
  34. in Drupal 8, you can configure block where should it appear and you can do that in contextual yml file for example - user.links.contextual.yml. again machine name, title, group, weight, and route name so its like i want to display delete role on user.role_delete route.
  35. hook_menu did too much in Drupal 7 and it was very complicated to understand what it was doing or to do anything very advanced tasks.
  36. hook_menu did too much in Drupal 7 and it was very complicated to understand what it was doing or to do anything very advanced tasks.