Drupal developers have spent years writing Drupal 7 modules for their clients, and with Drupal 8 looming on the horizon, many of these will need to be upgraded so that clients can be upgraded. We'll go through step-by-step upgrading of a real-life module from Drupal.org from Drupal 7 to 8, and we will also introduce the new things developers will need to know.
2. Who Am I
• PHP
Programmer
for
over
10
years
• Drupal
Developer
for
5
Years
• Symfony
2,
Silex,
and
ZF2
Programmer
• Maintainer
of
Social
Media
Bar
• hJps://github.com/dragonmantank
php[world]
2015
2
16. Big Changes
• PSR4
Autoloading
(yay!)
• YAML
config
files
instead
of
INI
config
files
• Real
objects
for
nearly
everything
• Much
cleaner
separa`on
of
concerns
for
code
php[world]
2015
16
17. Good News
Much
of
your
business
logic
will
probably
be
copy-‐paste
work
php[world]
2015
17
18. Bad News
Much
of
the
documenta`on
is
s`ll
out
of
date
php[world]
2015
18
21. Move your module?
• Core
modules
live
in
core/modules
now
• modules/
isn’t
off
limits
anymore!
• Can
s`ll
live
in
sites/*/modules/
• Naming
conven`ons
s`ll
apply
php[world]
2015
21
24. YAML Format
• Human
and
machine
readable
markup
language
• Indenta`on-‐based
markup
• Supports
most
basic
types
of
data
• Drupal
uses
it
for
module,
theme,
and
configura`on
informa`on
php[world]
2015
24
25. Update Your .info File
• We
are
switching
from
.ini
format
to
.yml
format
• Modules
must
add
type: module
to
actually
show
up
as
a
module
php[world]
2015
25
26. socialmediabar.info
name = Social Media Bar
description = Adds a social media bar to different content types
core = 7.x
package = "Social Media"
php = 5.3
stylesheets[all][] = css/socialmediabar.css
scripts[] = js/socialmediabar.js
dependencies[] = libraries
configure = admin/config/services/socialmediabar
php[world]
2015
26
27. socialmediabar.info.yml
name: Social Media Bar
description: Adds a social media bar to different content types
core: 8.x
type: module
package: "Social Media"
php[world]
2015
27
30. hook_menu() is dead, long live Routing!
• This
is
all
moved
to
YAML
files
• hook_menu()
is
now
split
into
routing.yml
and
links.*.yml
• routing.yml
handles
defining
URIs
and
route
config
• links.*.yml
handles
how
links
appear
in
the
system
php[world]
2015
30
31. socialmediabar_menu()
php[world]
2015
31
function socialmediabar_menu() {
return array(
'admin/config/services/socialmediabar' => array(
'title' => 'Social Media Bar Admin',
'description' => 'Set up configuration options for the Social Media Bar',
'page callback' => 'drupal_get_form',
'page arguments' => array('socialmediabar_admin_form'),
'access arguments' => array('administer socialmediabar settings'),
),
'socialmediabar/countproxy' => array(
'title' => 'Social Media Bar Admin',
'page callback' => 'socialmediabar_countproxy',
'type' => MENU_CALLBACK,
'access arguments' => array('access content'),
),
'socialmediabar/shareproxy' => array(
'page callback' => 'socialmediabar_shareproxy',
'type' => MENU_CALLBACK,
'access arguments' => array('access content'),
),
);
}
33. socialmediabar.links.menu.yml
php[world]
2015
33
socialmediabar.admin:
title: 'Social Media Bar Admin'
parent: system.admin_config_services
description: 'Configure the Social Media Bar sharing bar'
route_name: socialmediabar.admin
35. What is PSR-4
• Defines
a
folder
structure
so
that
classes
can
be
loaded
on
demand,
instead
of
all
at
once
• Unlike
PSR-‐0,
allows
shallow
and
split
folders
for
loading
• Much
more
efficient
than
the
the
old
files[]
key
in
.info
• No
more
require
at
the
top
of
your
files
• All
of
your
code
will
now
live
in
src/
• All
of
your
code
will
now
properly
namespaced
php[world]
2015
35
36. Drupal 8 is turtles objects all the way down
php[world]
2015
36
hJps://upload.wikimedia.org/wikipedia/commons/4/47/River_terrapin.jpg
37. What is Namespacing?
• In
PHP,
a
way
to
separate
named
classes
and
‘bundle’
them
together
• Allows
for
renaming
of
classes
to
avoid
class
name
duplica`on
namespace DrupalSocialMediaBarController;
use DrupalCoreFormConfigFormBase;
use DrupalCoreControllerControllerBase as Base;
php[world]
2015
37
43. Form API Changes
• The
overall
syntax
is
s`ll
the
same
• Form
State
is
now
an
objects
instead
of
an
array
• Routes
now
call
forms
using
the
_form
key
instead
of
drupal_get_form()
• Forms
are
now
Objects,
extending
DrupalCoreFormFormBase
• System
forms
now
extend DrupalCoreFormConfigFormBase
php[world]
2015
43
44. System/Config Forms
php[world]
2015
44
namespace DrupalSocialMediaBarForm;
use DrupalCoreFormConfigFormBase;
use DrupalCoreFormFormStateInterface;
class AdminForm extends ConfigFormBase {
public function getEditableConfigNames()
public function getFormId()
public function buildForm(array $form, FormStateInterface $form_state)
public function submitForm(array &$form, FormStateInterface $form_state)
}
46. Configuration is now Object-Based
• Injected
into
Controllers
and
forms
• Can
be
accessed
by
Drupal::config()
if
needed
• Handled
by
namespaced
areas
of
configura`on
• socialmediabar.config
• Get
individual
keys
from
the
config,
set
them
to
change
values,
and
save
them
to
commit
the
changes
php[world]
2015
46
52. No More Callback Functions, Use Objects
• MENU_CALLBACK
func`ons
are
now
object::method
signatures
• Controllers
extend
DrupalCoreControllerControllerBase
• View
output
is
now
handled
by
Response
Objects
php[world]
2015
52
53. php[world]
2015
53
namespace DrupalSocialMediaBarController;
use DrupalCoreControllerControllerBase;
use DrupalSocialMediaBarNetworkNetworkFactory;
use SymfonyComponentHttpFoundationJsonResponse;
class CountProxyController extends ControllerBase {
public function index() {
$url = Drupal::request()->get('url');
$provider = Drupal::request()->get('provider');
$errors = [];
// ...
if (count($errors)) {
return new JsonResponse(['errors' => $errors], 400);
}
try {
$network = NetworkFactory::getNetwork($provider);
$count = $network->getCount($url);
return new JsonResponse([$provider => ['outbound' => $count]]);
} catch (Exception $e) {
return new JsonResponse(['errors' => [$e->getMessage()]], 500);
}
}
}
56. hook_theme(), booooooooooooo!
• Has
to
live
in
[modulename].module
• Automa`cally
looks
in
the
templates/ folder
for
Twig
files
php[world]
2015
56
function SocialMediaBar_theme() {
return array(
'socialmediabar' => array(
'template' => 'socialmediabar',
'variables' => array('api_key' => NULL, 'networks' => NULL),
),
);
}
57. Things are attached via #attached
• No
longer
have
drupal_add_css() or
drupal_add_js()
• Can
easily
bundle
up
CSS
and
JS
into
‘libraries’
• [modulename].libraries.yml
• #attached
can
be
used
with
a
render
array,
or
form
descrip`ons
• hJps://www.drupal.org/developing/api/8/assets
php[world]
2015
57
58. JavaScript settings changes
• Now
called
drupalSettings
instead
of
Drupal.settings
• Passed
via
a
drupalSettings
key
on
#attached
php[world]
2015
58