As I start porting the modules I maintain to Drupal 8, I’m hitting a few places where things haven’t been intuitive to me. I’ll try to work on the drupal.org documentation when I get a chance, but in the meantime I figured it would be worth writing up a few notes.
A common task is creating a link, and adding classes and other attributes to it. The Responsive Share Buttons is basically just a block of links to social networks, so this was a key building block.
In Drupal 7 this was pretty simple - the link building function took three arguments - a title, a path, and an array of options:
$link = l(t('Link Title'), 'http://drupal.org', array( 'attributes' => array( 'class' => array( 'my-first-class', 'my-second-class', ), ), ));
In Drupal 8, the l function now takes a Url object with attributes, rather than a string, so it’s a little different. Here’s how to build a link to an external URL and add a class to it: First the Url class needs to be brought into scope:
And then you can build the Url object and call setOptions on it:
$url = Url::fromUri('http://drupal.org'); $link_options = array( 'attributes' => array( 'class' => array( 'my-first-class', 'my-second-class', ), ), ); $url->setOptions($link_options); $link = \Drupal::l(t('Link title'), $url);
Incidentally, the other gotcha here that had me scratching my head for a while was how to get the current page title, and how to get the current URL. Drupal 7 had easily accessible functions for these tasks, but the object-oriented approach
$title = drupal_get_title(); $current_url = url(current_path(), array('absolute' => TRUE));
$request = \Drupal::request(); $route_match = \Drupal::routeMatch(); $title = \Drupal::service('title_resolver')->getTitle($request, $route_match->getRouteObject()); $current_url = $request->getUri();
My own learning journey with Drupal 8 is very much in its early days, and a lot of the old Drupalisms are pretty familiar to me, but it does seem a little long-winded. Give it a while, and I’m sure I’ll get up to speed, and start seeing the benefits of the object-oriented approach in Drupal 8.