Category: Drupal

Drupal 7: Watch for hyphens in CTools and Panels plugin names

I recently ran into an interesting problem with the way CTools plugin methods are discovered (namely, CTools content types, used by the Panels ecosystem) in Drupal 7.

The project I was working on had various content types named things like piwik-tracking-code (not the exact name, but good enough to illustrate the issue).

Panels looks for various methods, such as settings and render methods, by taking the machine name of the plugin (typically the filename) and adding suffixes to it—a lot like hooks, in fact.

You might be able to see where I’m going with this if you’re familiar with PHP. That’s right: piwik-tracking-code_render() is not a valid function name! Therefore, it fails.

There are a couple ways around this. With some of the plugin functions, you can specify the function names in the definition or in one of the functions. If you must hyphenate, you have to do this.

The other way, of course, is to simply use underscores. This is what I did and what I would recommend.

It’s a wrap! Patreon pledges have been doubled and donated to the Drupal Association #DrupalCares (and FillPDF works with Drupal 9)

The total came out to $123.08 after Patreon fees. I doubled that to $246.16 and “topped it off” for a total of $623.08! That could become up to $1,869.24 matched.

Thanks, Patreon supporters!

  • Damien McKenna
  • Andreas Tasch
  • Michael Flipp
  • Jessica Cobb

I also ported FillPDF to Drupal 9 yesterday. I released 5.0.0-alpha1. There are many things to fix, and not all dependencies are ready yet, but it is a good start.

DONATION MADE. THANKS! Patreon pledge = 2x-6x donation to Drupal Association until April 29 #DrupalCares


As you might have seen me tweet, I’ve recently started Patreon and Ko-Fi pages. The goal of these is to let me spend more time working on open source (primarily, but not only, the FillPDF Drupal module and FillPDF LocalServer).

Not long after, Vanessa and Dries Buytaert, the founder of Drupal, announced his matching pledge, in which he would match up to $100,000 of individual memberships and donations.

Then Jeff Geerling pledged to donate $1 per like of his #DrupalCares video.

As if that wasn’t enough, a coalition of Drupal businesses also pledged to match the first $100,000 donated.


So, I’m joining the crowd:

If you become a member of my Patreon page (click here to go there), I will donate two times your April pledge to the Drupal Association. (For example, if you pledge $5, I will donate $10.)


If the #DrupalCares Match Challenge total is still under $100,000, Vanessa and Dries Buytaert and a coalition of Drupal businesses will each, in turn, match that, making it six times your pledge.


I will do this for the first $500 of supporters, for a total donation of $1,000 ($3,000 if fully matched).


I will also post and share a blog giving credit to all of the supporters.


There’s no obligation to remain a Patreon supporter, but if you use the FillPDF module or anything else I’ve contributed code to on Drupal.orgGitHub, or elsewhere, it will help me do more. I’m hoping some new supporters will remain supporters.



  • I’ll be making the donation on April 29.
  • My business, FillPDF Service, uses the FillPDF module, but it is not the only way to use the module, so the open source community still benefits from me working on it. It also makes use of open source itself. For example, I published the Commerce Recurring Metered Billing module as part of an upgrade I’m working on.

PhpStorm how-to: Run PHP Code Beautifier on File Save (read the Twitter thread)

Hello from Drupal Mountain Camp 2019! I’m just pasting in a tweet here. Click to read the thread.

Fixing duplicate field collection item references in Drupal due to Content Translation bug

I just left a comment in the Field Collection issue queue and thought it’d be good to spread it more widely; maybe people need this fix.

For anyone still getting burned by this bug (or for that matter getting burned by using Node Clone on nodes with field collections), first apply my previous patch (or bderubinat’s, but I haven’t tested that one). That will stop further damage.

To repair your previous entries and ensure that, for example, removing a field collection entry doesn’t remove it from other nodes from which you didn’t want it removed, you can implement this script I’ve detailed in a gist:

It will give new item_ids to field collection items that it detects as appearing more than once. All my testing has indicated this is safe, but if not, please leave a comment on the gist. I hope this helps someone.

Thanks to Project Ricochet for sponsoring my time on this.

Introducing Internationalization 404 for Drupal

I released a new module for Drupal a couple days ago called Internationalization 404. This module helps you automatically use Content Translation-translated localized language versions of your 404, 403, and home pages.

Normally, you have to install Internationalization Variables (i18n_variable) and separately configure the options for these pages per-language. This module saves you time and automatically sends visitors to the correct page. Should you decide to use specific language versions with i18n_variable, this module will respect that configuration and not interfere.

All you have to do is enable the module for it to start working. No configuration required. Disable it to turn off the functionality.

Install it from the project page.

Thanks to Project Ricochet for sponsoring this work.

DrupalCamp alert: DrupalCamp Gothenburg 2013!

If you haven’t been following any of the calendars listing DrupalCamps, you may have missed the arrangement that’s coming up in Gothenburg, Sweden in a couple weeks. This wouldn’t be surprising, since it’s being marketed in Swedish. People of all languages are welcome, however, so I thought I’d somewhat rehash the post I made in Norwegian.

The camp’s pitch is: “A one-day conference focused on the Drupal CMS. Come along and learn more about Drupal and the web, and have a great day in Gothenburg in late Spring.”

Sessions are here:

As with most DrupalCamp sites, volunteer work lies behind the site you see. A lot of people contributed really great work. Fantastic designs and solid development resulted in the site you see today. I was also involved, mostly behind the scenes. I helped with server administration, Git coordination, transferring the site to another server, and mostly with coordinating the web team’s efforts. It was the first time I had spent as much time helping organize a DrupalCamp (and I’ve been to quite a few; I’ve even volunteered at a couple).

If you’re in Europe or in the area, I encourage you to check it out. You can follow them on Twitter at @DrupalGBG.

Google Translate is getting better and better 🙂

My mobile office is now in the Toolbox

If you follow me on Twitter, you probably already know all this. If not, however, allow me to explain.

When I’m away from home, whether at a cafe or a Drupal event, there are a few things I take with me to ensure a pleasant working experience. You may have encountered me with them at a Drupal event. I’ve had the setup since SANDcamp 2012 and also had it with me at DrupalCamp NJ, DrupalCamp Twin Cities, and DrupalCamp Sacramento.

These tools definitely increase my productivity (hint: one is a USB-powered monitor that you can carry around!).

So, without further delay, check out my mobile office!

I’m a mentor at the free DrupalCamp Sacramento training on June 8!

I haven’t been blogging enough recently, but I will try to keep you posted with short updates at least. It’s been a busy first quarter of the year!

But I wanted to post to announce that I’m mentoring this training, which as I write is tomorrow. It’s full, so this is sure to be an interesting experience on my part.’s site is here (affiliate link).

DrupalCamp Sacramento: link (Fill PDF Service is a Bronze Sponsor).

Hope to see you there!