SlideShare uses cookies to improve functionality and performance, and to provide you with relevant advertising. If you continue browsing the site, you agree to the use of cookies on this website. See our User Agreement and Privacy Policy.
SlideShare uses cookies to improve functionality and performance, and to provide you with relevant advertising. If you continue browsing the site, you agree to the use of cookies on this website. See our Privacy Policy and User Agreement for details.
Successfully reported this slideshow.
Activate your 14 day free trial to unlock unlimited reading.
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.
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
38.
Your Module’s Namespace
Drupal[modulename]
Lives
in
modules/[modulename]/src
sites/all/modules/[modulename]/src
sites/default/modules/[modulename]/src
php[world]
2015
38
39.
Why is it under the Drupal namespace?
php[world]
2015
39
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