DrupalCon Amsterdam 2014
Dave Reid / @davereid
Senior Developer at Lullabot
Twitter: @davereid
IRC: davereid
Maintain amost 2% of contrib modules
Core subsystem maintainer
Father of two cats and one boy, and one on the way!
For your site builders
and architects to make
informed choices now
Ease pain of site users
when switching to Drupal 8
drupal.org/project/admin_views
drupal.org/project/views_bulk_operations
drupal.org/project/instantfilter
drupal.org/project/simplified_menu_admin
<img data-align="center" data-caption="Test caption" ... />
Use the Date (ISO format) field type. Not the Date or Date (Unix timestamp) field types.
sites/all/composer.json
{
"require": {
"fale/isbn": "1.x-dev"
}
}
Run composer install
// Make the sites/all/vendor libraries autoloadable.
require_once DRUPAL_ROOT . '/sites/all/vendor/autoload.php';
$result = \Isbn\Check::is10($isbn);
Plugin API in Drupal 8:
drupal.org/developing/api/8/plugins
Many ways to do the same thing in Drupal 7.
/**
* Implements hook_mymodule_hook_info().
*/
function example_mymodule_hook_info() {
$info['example'] = array(
'label' => t('Example implementation'),
'callback' => 'example_mymodule_callback',
'settings form' => 'example_mymodule_form',
);
return $info;
}
function example_ctools_plugin_directory($module, $plugin) {
if ($module == 'mymodule' && $plugin == 'hook') {
return "plugins/$module/$plugin";
}
}
// plugins/example/hook/example_implementation.inc
$plugin = array(
'title' => t('Example implementation'),
'class' => 'ExampleMyModuleHookImplementation',
);
// plugins/example/hook/ExampleImplementation.class.php
class ExampleMyModuleHookImplementation {
// Does stuff.
}
interface MyModuleHookPluginInterface {
public function getDefaultConfig();
public function doSomething();
}
lib/MyModuleHookPluginBase.phpabstract class MyModuleHookPluginBase implements MyModuleHookPluginInterface {
/** @var array */
public $config;
public function __construct(array $config = array()) {
$this->config = $config + $this->getDefaultConfig();
}
public function getDefaultConfig() {
return array();
}
abstract public function doSomething();
}
function example_mymodule_hook_info() {
$info['example'] =
'label' => t('Example implementation'),
'class' => 'ExampleMyModuleHookPlugin',
);
return $info;
}
example.infofiles[] = lib/ExampleMyModuleHookPlugin.php
lib/ExampleMyModuleHookPlugin.phpclass ExampleMyModuleHookPlugin extends MyModuleHookPluginBase {
public function doSomething() {
// Do stuff!
}
}
function mymodule_get_hook_instance($instance) {
$info = module_invoke_all('mymodule_hook_info');
drupal_alter('mymodule_hook_info', $info);
if (isset($info[$instance])) {
return new $class($config);
}
else {
throw new Exception(...);
}
}
$results = mymodule_get_hook_instance('example')->doSomething();
Please rate this session at amsterdam2014.drupal.org/session/future-proof-your-drupal-7-site