Apr 08 2018
Apr 08

Well, I've finally done it! I migrated this blog from Drupal 6 to Drupal 8. I did a test run yesterday with a personal blog of mine and found the process was relatively easy. Both sites are relatively simple.

There are other blog posts about the process as well as documentation on Drupal.org so I won't repeat lots of details.

I'm running Drupal 8.5.1 as of this blog post. I chose to use all of the various migration modules that come with Drupal 8 core, including the two marked as experimental. Once I had them enabled I clicked the link to get to the upgrade form in the UI. One of the sites did have file uploads and all of them were pulled in seamlessly. I had created a backup of the sites/[site-name] directory and placed it in my new Drupal 8 sites directory.

Here are issues I encountered:

  • Administration Menu is (apparently) not properly ported to Drupal 8 and it blew things up on the site yesterday. I had to manually clean things up in the database so that module was not enabled in my Drupal 8 site and clear cache.
  • The taxonomy term reference to the Tags vocabulary needed the field setting updated so that it selected the Tags vocabulary.
  • When I click the user in the Toolbar it does not switch the tray so that it shows View profile, Edit profile and Log out. (That's still an issue as I write this. I haven't investigated it enough to figure out what's going wrong, nor have I filed an issue.)
  • The feed that taxonomy provides for terms has changed slightly. I filed an issue to get Planet Drupal to use the new feed.
  • No views were imported.
  • The pathauto patterns weren't imported.
  • Disqus doesn't handle the migration.

Other than those things, I can't say I ran into much of anything else. And, aside from the site blowing up from Administration Menu, there wasn't much that presented a real challenge.

If you are reading this post on Planet Drupal, then you know I'm back up and running!

I'll still need to theme this site again. And I'll need to replace some functionality that was previously provided by Advanced Blog. I haven't yet installed and tested out the Drupal 8 port of Tagadelic.

One more note: I decided to just delete the comments that I had for the Drupal 6 version of this site since I don't want to use the Comment module, preferring to use Disqus instead.

Apr 12 2017
Apr 12

Yes, this is another one of "those posts."

No, this is not another one of "those posts."

How is this another one of "those posts?" I've finally been spurred into action on account of recent events in the community. But, probably not in the way you are thinking. I recently attended a regional Drupal camp that had an informal session on (if I remember the title correctly) "The Intersection of Diversity and Intolerance." I participated in that session, or perhaps did not participate in that session. It was this participation / un-participation that has actually spurred me into action.

How is this not another one of "those posts?" As I wrote in my follow-up communication with some of the organizers of the camp (and that session in particular), "You happened to have given me the opportunity to finally speak up about something I've been repressing for quite some time. For me, this isn't actually about what happened with the activity or with Larry. It's about me deciding I'm ready to see if I can find a way to contribute to the community in a more personal and opinionated way."

This blog post is one way I am beginning to contribute to the community in a more personal and opinionated way.

I am on the verge of celebrating my 8th Drupalversary (https://www.drupal.org/u/vegantriathlete). But, that's marking the time from when I first created my d.o. account. I'm really closer to celebrating my 7th Drupalversary. I formally started participating in the Drupal community by presenting at DrupalCamp Colorado in June of 2010. And that's where this story starts, because having my presentation accepted was both the beginning of feeling included in the community and the beginning of feeling excluded from the community.

By my account, and based on comments people made directly to me, my presentation was pretty well received. And yet, there were those in the audience who made it quite clear (during the presentation) that they did not entirely approve of my presentation. Furthermore, it would be a good number of years until another one of my session proposals was accepted at the camp.

There were other ways in which I expressed my willingness to take part in my local community and from which I felt generally ignored, if not outright excluded.

However, it's not my intent to run through a litany of grievances. Let me return to the aforementioned recent activity in which I participated / didn't participate. Another comment I made in my communications was "It's clear all of you have put a tremendous amount of thought into the conference and have acted intentionally with sensitivity and inclusiveness in mind."

Rather, it is my intent to highlight how there is more than one side to a story. In fact, there are more than two sides; there are as many sides as there are participants / witnesses. We are all human and we all bring our own experiences and perspectives to every situation.

Perhaps there has been a certain amount of willful elitism that has made me feel like an intruder. Perhaps there have been ways in which I conducted myself that caused others to feel like they were being assaulted. Perhaps it was just simple lack of chemistry or just a fluke of a given set of circumstances. Perhaps it's something else entirely different that I'm totally missing. It's extremely hard to know the truth, if there even is such a thing as a single "truth" to be known, without a willingness for all parties to be open about their experiences and perspectives and to hold a sincere conversation.

I'm open to holding that sincere conversation.

  • Do you feel like you've been excluded or unheard?
  • Do you have a desire to contribute but feel like you've been underutilized or thwarted?
  • Do you just want to talk to somebody who is willing to listen?

Here I am! I am I. I am a member of this community who has decided to scratch my own itch. Talk to me. I'll talk to you. We'll talk together. We'll talk with others. Oh yeah, and we'll listen, too!

I am embarking on being the change I want to see in this community. I am willing to put in the hard work to figure out how to get the best each of us has to offer and to approach things with the assumption that we are acting with a sincere desire to be a constructive force for positive change.

  • "What counts as constructive?", you ask.
  • "What constitutes positive?", you ask.
  • "What is sincere?", you ask.
  • "How do we balance good intention with the actions taken?", you ask.

"Those are good questions!", I respond.

I'd love to hear your thoughts on them.

As I'm out and about in the Drupal community I will be writing "Talk to me!" on my name tag and / or putting that on a placard when I'm sitting at a table.

Until we have the opportunity to meet in person, you may get in touch to share your thoughts through channels such as my d.o. contact form, the contact form on this site and the comments on this post.

In community,


Mar 27 2016
Mar 27

On more than one occasion I've heard a person (such as Angie Byron) say that Drupal is a meritocracy. I've also heard Drupal described as a "do-it-ocracy." What do these things mean? Are they true?

Join me live this Monday at 1PM (GMT -0600) to share your questions and thoughts. As always, it's totally free to attend. You can participate by signing in with your twitter account or you can watch anonymously without signing in at all.


Mar 10 2016
Mar 10

Have you used the Examples module? What is your favorite example?

Let's talk next Monday at 1PM (GMT -0700)


It's free to attend. You may participate by signing in with your twitter account or you may watch anonymously without signing in at all.

Feb 25 2016
Feb 25

Yesterday was officially End Of Life for Drupal 6. There was one last update released. So, what now? Does everybody need to get off Drupal 6 immediately?

Join me live this Monday (1PM GMT-0700) as I hold a discussion panel to talk about considerations on moving forward for those people who have sites built with Drupal 6. As always, it's totally free to attend. You may participate by signing in with your twitter account or you may watch anonymously without signing in at all.

I hope to see you there!

Feb 12 2016
Feb 12

One of the great things about Drupal is its extensive contributed module base. It's almost always the case that "there's a module for that." The trick is deciding which module to use. Even though Drupal emphasizes collaboration, one will still frequently find that there is more than one way to solve a particular problem by using contrib.

Join me live as I talk about how one can choose which contributed module(s) to use when building your site's desired functionality. I use Blab's platform, which is totally free. You may participate by signing in with your twitter account or you may watch anonymously without signing in at all. I'll have seats open for anybody who wants to share an opinion or ask questions. Just make sure to use Chrome, as Blab seems to work best with it.

I hope to see you there!

Feb 05 2016
Feb 05

There is a joke about the Drupal learning curve that relates it to the Drupal learning cliff. And while the graph generally gets things confused (by placing time on the x-axis instead of the y-axis), the sentiment is understood. Until a person is able to get her/his head around how Drupal does things, it's quite possible to spend a great deal of time to accomplish very little. Even worse, it's possible to spend a great deal of time developing really bad habits.

Join me live to ask your questions and share your thoughts on the Drupal Learning Curve. I'll share my experiences as well.

I hope to see you there!

As always, it's totally free to attend. You may participate by signing in with your twitter account or you may watch anonymously without signing in at all.

Jan 30 2016
Jan 30

Drupal 8 was released just over two months ago. Is it time yet for you to start using it on your production sites?

You'll need to consider the state of the modules you typically use to build your sites, the state of the themes you typically use to build your sites, the nature of the site, the budget for the site and your own skill set.

There are, without a doubt, sites that are being launched on Drupal 8 already. And, at the same time there is this:


So, there is obviously still work to be done.

Whether you hold John Locke's view or a different view, I'd love for you to join me live as I share my thoughts on that matter. It's totally free to join. You can sign in with your twitter account or watch anonymously without signing in at all. I'll have seats open so that you can ask your questions and share your thoughts.

I hope to see you there!

Jan 05 2016
Jan 05
Call for Guests, Panelists and Questions Marc Tue, 01/05/2016 - 4:22pm

I'd like to start a weekly 30 minute DrupalChat on https://blab.im/tydrupal. For more information, please get in touch with me. I promise not to add you to any list.

Dec 14 2015
Dec 14

In the post on making output themeable I discussed the example of overriding a template file for a flag. The template file I overrode was a generic definition of the markup for all the flags on a site. I can create a template file that overrides a specific flag.

To begin, I create a new flag. Let's say that the machine name is theme_this_flag. Then I attach that flag to my desired content type(s). I create a piece of content using (one of) the content type(s). If I look at that piece of content using the default Bartik theme I see that it has no special styling on the flag. Once I change my theme to my custom Bartik subtheme I see that the flag has a colored background as well as a dotted line below it.

If I look at a different piece of content that uses different flags, I see that the flags do not have the dotted line. This is because the flags on that piece of content are using the generic template file to generate the markup.

The flag on my new content type's piece of content uses the more specific template that applies to that flag.

Look at the names of the two template files inside of my custom subtheme. flag--theme_this_flag.tpl.php is responsible for this more specific markup. In addition to using a wrapping div with the theme-me class, I have added the i-am-special class. I am using CSS to target that class and add the dotted line to the presentation of the flag.

The machine name of my new flag, theme_this_flag, is the "key" that I used to create a more specific template file for just this flag. The special flag is attached only my desired content type(s).

This is just one example of how Drupal uses specificity, but it gives the general idea of how it works in all the other cases as well.

If you want to learn more about Drupal, you can take my "Drupal for Beginners" class for just $5.

Dec 11 2015
Dec 11

In Drupal an alter is intended to provide a way to modify an object during a point in the execution of a certain event or process. Alters are defined within individual modules. Those modules then give the opportunity for other modules to "alter" an object by calling drupal_alter at the appropriate time.

For example, the core field module calls drupal_alter on 'field_attach_view' inside of the field_view_field function. The core rdf module implements that alter by creating a function that is named rdf_field_attach_view_alter. The purpose of this function is to "Append term mappings on displayed taxonomy links." The function looks for a taxonomy term reference element that is being displayed as a link and then adds some RDF data to that element's attributes.

This has probably gotten a bit too technical and abstract to make complete sense. To tie the information back into what I stated the purpose of an alter is, the "object" that is being modified is a field that is going to be displayed. The modification that is happening is to provide a bit of metadata about the field so that things like search engines or aggregators can make better sense of that field.

This process was accomplished through the use of an alter function. Since the field module defined the alter function it was possible for the rdf module to add its metadata to the field without having to hack into the field module.

If you would like to learn more about Drupal you can take my "Drupal for Beginners" class for just $5.

Dec 10 2015
Dec 10

The whole point of creating a custom theme is to get a website to look the way you want it to. So, it's important for the output that modules generate to be themeable.

I will give a simple example of modifying the markup that is used to display some links. The Flag module provides a mechanism to do things such as "liking" a post or reporting a post as spam. A post may have a link for each flag that is associated with it.

The default Bartik theme displays all the flags on the same row. I have created a custom subtheme that displays the flags on separate rows with a colored background. I accomplished this by overriding the flag.tpl.php file inside of my custom theme. I copied the file from the Flag module's directory to my custom theme's directory. Then, I simply added a wrapping div element with a particular class to the original markup. Since a div is a block element, each flag appears on a separate line. Since I have attached a special class to the div element I can use CSS to target that element and place a background on it.

If you don't understand HTML, block elements and CSS the only thing for you to recognize is that I'm displaying flags differently in my custom theme than I am in the default theme and I'm doing it by overriding how the markup is specified.

As a side note, and further illustration of hooks, the Flag module uses hook_theme to tell Drupal to use the flag.tpl.php file to generate the markup for a flag. But, Drupal knows to look at the theme to see if it has overridden the file. Themers typically prefer that output is themed via the use of these types of files. However, it's also possible to use a function to theme the output. It's not important to look at a specific example, though, because the concept of overriding the function is analagous to overriding the template file.

If you would like to learn more about Drupal you can take my "Drupal for Beginners" class for just $5.

Dec 09 2015
Dec 09

In Drupal a hook is intended to provide a way for actions to be triggered during a point in the execution of a certain event or process. Hooks are defined within individual modules. Those modules then give the opportunity for other modules to "hook into" their processing by calling the hook at the appropriate time.

For example, the Link module makes use of hook_field_info to allow it to appear as an option for a type of field that can be added to a content type. If you look at the fields available to add to a content type when the Link module is disabled, you see that it does not appear in the list. When you enable the link module and then return to the field types that are available to add to a content type you will see that Link appears.

There are other hooks that the Link module must also enable to provide the functionality of that new field type. For instance, hook_field_formatter_info provides the different display types for a link. hook_field_formatter_view contains the actual logic that properly builds a link for display based on which display type was chosen.

The module that defined the hook_field_info hook is, not surprisingly, the Field module. One place that the hook is called is in _field_info_collate_types. Since I think I'm already getting a bit more technical than I really ought to be getting in this post, I won't go into more detail. Suffice it to say that this is where that list of possible fields gets defined for each content type.

Modules use module_implements, module_invoke and module_invoke_all to trigger their hook.

Well, that may have been a bit too much information! To recap, all that you should take away from this post is that prior to enabling the Link module, the Link field type did not appear in the list of available field types. After enabling the Link module it does appear. The method used to make this happen is called a Hook.

If you would like to learn more about Drupal you can take my "Drupal for Beginners" class for just $5.

Dec 08 2015
Dec 08

Collaboration is an important part of the Drupal community. The principle of collaboration applies equally to how people in the community engage with each other and to how modules are written.

I mentioned the Libraries API in a spearate post when I discussed creating a slideshow. The specific example was that you would use the Libraries API and you would also use the jQuery cycle plugin as part of creating a slideshow.

Instead of having a monolithic slideshow plugin that includes the jQuery cycle plugin, the Views Slideshow module knows how to use the Libraries API so that it can find the jQuery cycle plugin.

Approaching things in this collaborative fashion means that the jQuery cycle plugin is also available on the site for another module to use. This results in a smaller codebase on account of eliminating duplication of code across distinct monolithic plugins.

Additionally, the collaborative approach helps to eliminate the situation that I encountered when searching for slideshow on the WordPress official site. That search yielded over 500 results! Does a person really need over 500 different choices to create a slideshow? How is one supposed to choose?

Drupal's philosophy is that module developers should work together to create modules that are both small enough and extensible enough so that the situation of 500 slideshow plugins never arises.

If you would like to learn more about Drupal, you can take my "Drupal for Beginners" class for just $5.

Dec 07 2015
Dec 07

When creating a module for Drupal it is important to write the module so that it is extensible by other modules. I will talk about ways that it is possible to do this in other posts.

I mentioned a couple of examples of extensibility in the Modularity post. In my example of adding a slideshow to a Drupal site I said that you would likely use Views, Views Slideshow, custom content types and custom fields.

The Views module is written in a way that allows other modules to add new display formats. The Views Slideshow module defines the slideshow format.

The ability to add custom fields to a content type is another example of extensibility. Drupal provides the core functionality to create content types and then allows other modules to define new field types that can be added to content types.

The power behind modularity and extensibility is that it allows for the possibility to mix and match things in different ways. Once you learn how to use various modules you can combine them in different ways to add different functionality on your site.

So, for example, once you've figured out how to use Views to add a slideshow to your site, you have gained a good understanding of how you can use Views to do other things on your site. You have also learned about how to use custom content types and custom fields as a method to architect things on your site.

Another Drupal principle that works along with modularity and extensibility is collaboration.

I will cover that in another post.

If you want to learn more about Drupal you can take my "Drupal for Beginners" class for just $5.

Dec 04 2015
Dec 04

I mentioned in a previous post that Drupal is a modular framework. The idea is that modules should be designed to do one (small) thing well. This is in contrast to the monolithic approach that plugins employ in other content management systems.

For example, if you want to add a slideshow to a WordPress website you can download a single plugin from the WordPress official site. When I visited the WordPress site and searched on slideshow I got over 500 results!

If you want to create a slideshow in Drupal, you will download a number of contributed modules. At a minimum you will use Views, Views Slideshow and the Libraries API. You will also need to download the jQuery Cycle plugin and place it in the appropriate place in the directory structure (sites/all/libraries/jquery.cycle). There is a good chance that you will create a custom content type and add fields to it. This may seem like a lot of work when you are first getting started with Drupal. There are a number of advantages to using this type of modular approach, though.

One advantage of creating a small module is that it is much easier to debug a problem on the site. As long as a module is not a dependency of another module, you can disable that module to see if the problem goes away. If the problems remains, then you know the disabled module is not the culprit. If you had a single large module, disabling it would likely mean that you couldn't even test the functionality any more because disabling the module also removed all of the functionality.

Another advantage is that you can see performance gains on a production site by disabling the administrative modules. For example, the Views suite of modules breaks things up into administrative interface types of modules and key logic types of modules. As you are building a site, you will enable the administrative interfaces and when you launch the site you disable them.

Finally, doing things this way provides a lot of power and leverage. I'll talk about this more in other post.

If you want to learn more about Drupal you can take my course "Drupal for Beginners" for just $5.

Dec 03 2015
Dec 03

In order to retain the changes you make to a theme like the Bartik theme you need to create a custom subtheme. Use the Bartik theme as a base theme.

It's beyond the scope of this post to go into detail about Drupal's theme layer and how to create custom subthemes and themes. So, I won't explain everything you have to do. You can find more information on Drupal.org.

The key point to keep in mind is that a subtheme provides a way to override (or overload if you prefer) what the base theme is doing. Drupal uses this methodology of overriding / overloading in other context as well to allow you to make changes without having to hack core.

For your convenience I have created a repository of my custom subtheme.

Place my custom subtheme inside of your sites/all/themes subdirectory. If you are using Drupal 8 you can also place it directly in the themes subdirectory. Once you have placed the subtheme in the appropriate directory enable it and set it as the default theme.

My subtheme has a page.tpl.php file inside of the templates directory that appends a literal string to the Site Title. The CSS makes the font size larger. It also targets some other things based on the example I created on my demonstration site.

If you want to learn more you can take my course "Drupal for Beginners" for just $5. You can also just watch the free preview lectures if you want to see the example of my custom subtheme in action.

Dec 03 2015
Dec 03

The first thing to understand about Drupal is that it is based on a modular approach to providing functionality. I will elaborate on this further in another post.

The point I want to focus on in this post is that every module on a Drupal site is a first-class citizen. There are no "special" modules that can so something that other modules cannot do.

Three basic types of modules are:

  1. core
  2. contrib
  3. custom

Core modules are what is included with Drupal when you download the archive file from Drupal.org.

Contrib modules are those that have been contributed by members of the community and that can optionally be downloaded and used. You can find contrib modules at Download & Extend.

When you choose a particular contributed module to download one of the first things you should notice is that the namespace for that module is structured in the same way as the namespace for Drupal core. That is to say, the module will be located at https://www.drupal.org/project/[project-shortname]

Custom modules are any modules that are installed on a Drupal site that are not included on Drupal's official site.

When you need to add new functionality to a Drupal site, you may enable another core module, download and enable a contrib module or write a custom module on your own.

What you should never do is hack core or contrib.

This is the first rule of Drupal: Don't Hack Core!

Some people may think that this rule is on account of the "elite" being persnickety about other people touching their code. The reality is that the rule is in place for your own benefit.

I'll give you an example right now of why you don't want to hack core. Let's say that you wanted to tweak the way the Bartik theme appears. You decided to modify the page.tpl.php file located inside of themes/bartik/templates. Once you did it, everything looked great to you. But, wait until you update Drupal. If you use a tool like drush, then all your changes will be lost. If you update manually, you'll have to remember to re-implement your hacks.

The second rule of Drupal is: Modules and themes should be placed in the appropriate place in the directory structure.

For Drupal 7 and below, that means placing them somewhere inside of the sites directory. This was a point of confusion for many people who are new to Drupal. The modules and themes directories seemed like a logical place to put things. However, those directories hold the core code. Starting with Drupal 8, this confusion has been addressed. There is a core directory under which all core code resides. It's okay to place modules and themes inside of the modules and themes directories in Drupal 8. It's also still possible to place them somewhere within the sites directory.

So, you may be wondering how you should have customized the Bartik theme on your site. I'll explain that in another post!

If you'd like to learn more about Drupal, you can take my course "Drupal for Beginners" for just $5.

Oct 05 2015
Oct 05

No matter what tool you use to create a website, you still need to put time into planning before you actually start designing and building the site. If you rush to start with the design and build process you run the risk of having a project that takes more time and money than desired and generates less of a return on investment. There are key questions you need to answer to ensure that you create a clear and comprehensive website definition document.

  • Why do you need a website?
  • What is your vision for the website?
  • What is your mission for the website?
  • Who is the ideal customer for the website?
  • What is your personal style you will embody on the website?
  • What are the key things your ideal visitor to the website needs to know?
  • How will your ideal customer be accessing your website?

If you are interested in learning about how to answer these questions (and more) and how to utilize them to create your website definition document, join me for a free live webinar on Wednesday, October 14 at 10:30 AM Mountain (USA).

You can learn more by visiting:

I look forward to providing you a lot of education and inspiration!

Jul 01 2015
Jul 01

As professionals in the web tech sector, we know that there is no one set answer to that question. And yet, we really don't want to be spending our time having to explain over and over to prospects why we can't just answer the question.

We could provide an analogy and respond by saying, "That's like asking a random custom home builder how much it's going to cost to build a house." We could continue by explaining that the builder will need to know the location of the house, the square footage of the house, the desired finishes on the house, etc.

Even then, we might still meet with resistance about why it's so expensive to have a website built. It's so much easier for a prospect to understand the expense if s/he understands just how much work it really takes to build a good website.

Well, I've got great news for you lucky readers of this post. I've created a Udemy course called Start Smart! Clearly Define Your Website. The course walks students step-by-step through the process of answering all the necessary questions and culminates with the student creating a website definition document that allows you to give an accurate estimate. By completing the course the student will get first hand knowledge of just how much work s/he has had to put into even creating the document. S/he will see how much time and care s/he has invested. Your job of closing the sale will become tremendously easier.

Here's a coupon to access the course for just $10.

Do you think this will be a useful tool for you in your sales cycle?

What strategies have you been using to this point?

How have those strategies worked?

May 17 2015
May 17

I headed to the Saturday sprint after completing my workout, showering, eating breakfast and packing my bags. Eventually, there were probably at least 30 people at the sprint. I worked a bit more on a patch I submitted to the Flag module and eventually started working on testing the changes I pushed to OG Forum D7. Unfortunately, they changes appeared to be doing absolutely nothing. I didn't figure out what I was overlooking before I had to leave.

Around 3pm I started to make my way to the airport. I decided to catch my first Uber ride; I met somebody at the conference who uses it all the time and who sent me an invitation.

I was a little confused about how to set up the ride, but I did figure it out successfully and got to the airport without incident. The fare would have been $22.53, but I chose the "pooled" ride and got a discount of $7.53. The remaining $15 was covered by my free first ride.

Do you have any "pro" tips for using Uber? Have you not yet used Uber? If you'd like to give it a shot, sign up with my referral code and we'll both get a free ride (up to $20). You need to take the ride within 3 months of signing up and once you take your ride I'll be credited with a free ride.

And speaking of free, you can still sign up for free for my first Udemy course through May 24. Check it out and let me know what you think. I appreciate any feedback you can provide to help me make my course absolutely delightful!

May 16 2015
May 16

From my vantage point the sprint day was extremely well attended. I spent my day working on a patch I had submitted to the Flag module and working on OG Forum and OG Forum D7.

We had the traditional live commit in the afternoon.

There wasn't any announcement if any more critical bugs were squashed for core.

How many of you participated in the sprints? When did you head home? Are you participating on Saturday?

The free access to my first Udemy course still runs through May 24. Now that the 'Con is over, how about checking it out and giving me some feedback? Your feedback can help me make my courses absolutely delightful!

May 15 2015
May 15

There was a shortened day of sessions, finishing with the closing ceremony. In the morning I attended a discussion about documentation on D.O. I attended this session because the point of focus the group chose at my BOF was to do something to improve the documentation. The session was quite well attended, which apparently demonstrates that there's a good bit of interest in improving the documentation. So, I guess I'll be putting more of my time, energy and resources to getting involved.

By now I'm sure everybody has heard that the next DrupalCon NA is going to be in the Big Easy. One really nice touch was that the closing session ended with a live New Orlean's style band marching through the hall.

I want to give a shout out to Aten Design, Four Kitchens and Kalamuna for putting on the best DrupalCon party I have attended. I had an amazing time at Lucky Strike bowling: Super convenient location, beautiful venue, great food and lots of fun bowling. For those who didn't want to bowl, it was totally possible to have conversations without having to shout over music or the din of a too large crowd. Thanks all y'all!

I feel like I had a pretty good "hit rate" for my selections at this year's 'Con and I'm looking forward to sprinting today and tomorrow.

How did the 'Con go for you this year? Did you attend Trivia Night last night? What was the highlight of the conference for you?

The free access to my first Udemy course is still active. Please check it out and provide me with your feedback. I want my courses to be absolutely delightful and could really use your input!

May 14 2015
May 14

After the keynote I took advantage of the opportunity to meet face to face with a new contact. Then, after lunch I headed into a couple of BOFs that were way out of my league and made my brain hurt. I finished up the day with a session that was more in my comfort zone.

I think it's good to stretch my mind and get out of my comfort zone even though it, quite honestly, left me feeling really stupid. I also felt really tired by the end of the day. So, I decided to take a pass on any social events for the evening and just relax in my hotel room.

By the way, I have not yet mentioned the fact that I've been staying true to my workout schedule and getting up early in the morning to "get 'er done" before the conference. (Today's workout was one hour on a stationary bike.) The point of mentioning this fact is to highlight that I've been maintaining a nice balance throughout the conference.

How have you been mixing it up this conference? Have you stretched yourself? Have you hit the exhaustion point, yet? Have you already partied yourself out? Leave your comments below. I'd love to hear what you've been up to!

The free access to my first Udemy course is still available! Check it out and let me know how I'm doing.

May 13 2015
May 13

I followed my own advice from my DrupalCon for n00bs post, and took part in some great sessions, checked out a BOF, ran a BOF of my own and hung out a bit in the Exhibition Hall. I loved finding out about Symfony and Drupal 8 and am super excited about what the combination has to offer. I was pleasantly surprised by the attendance in my BOF. And, I picked up some great swag in the Exhibition Hall and had some nice conversations.

Let's just hope that they get the lunch situation sorted out better today!

How has your 'Con been going so far?

Don't forget about taking advantage of free access for all 'Con attendees (live or virtual) to my first Udemy class. I'd really like to get feedback from all you wannabee and expert Drupalistas!

May 08 2015
May 08

DrupalCon LA is right around the corner! Woo hoo! I'll be there. Will you?

If this will be your first DrupalCon, I'd like to provide you with some ideas of how you can approach things. You have different options available to put together your Con:

  • Sessions
  • BOFS
  • Sprints
  • Exhibitor Hall
  • Social Events


When I attended my first Con (DrupalCon Denver) I packed my scheduled with sessions. I was determined to get in as much training as I could and I looked for sessions that covered things I wanted to learn more about. Before you go this same route, I would recommend that you consider a couple of points.

  1. The sessions are taped and you can watch them at any point.
  2. Part of the reason to attend a Con is to interact with the community.

So, sure, go ahead and pick out some sessions that interest you. But, make sure to check out some of the other options as well.


Birds of a Feather (BOFs) give you the opportunity to have some real interaction with other people. They are meant to be a true conversation and not a presentation. The BOFs are not taped. So, you've got to be there to get it. Have a look through the scheduled BOFs and see if there is one that is run by one of your favorite core or contrib maintainers, centers around one of your favorite modules or that is just an opportunity to have some good old fashion fun. By the way, I'll be running a BOF on crowd funding online Drupal training.


There are sprints going on all week long, continuing right into Friday and Saturday. Even more so than a BOF, a Sprint gives you a way to get some real hands on interaction. You can even participate in some sprints without having to write a single line of code. I'd definitely recommend that you find one Sprint you can attend. At some point during the Con, I'll be sprinting on the OG Forum functionality.

Exhibitor Hall

When I attended DrupalCon Portland I ended up spending an entire day just walking around the exhibitor hall talking to different people, both in the booths and outside of them. I don't know if I'd recommend spending an entire day, but I would suggest that you spend a bit of time here and there exploring the hall.

Social Events

As I have already mentioned, part of the reason to attend a Con is to interact with the community. You don't have to wear yourself out trying to get to every event and staying up all hours of the day. Make sure you don't give yourself the "Drupal Flu", but do make an appearance at one or two of the after hours gatherings.

I hope you have a blast at your (first) DrupalCon! If you see me there, please do come on up and introduce yourself. My Drupal "nick" is vegantriathlete.

Free Stuff!

One last thing: I'm offering all DrupalCon attendees, whether "live" or "virtual" free access to my first Udemy course. I'd love for you to sign up and tell me what you think! I'll be building out a full Drupal training curriculum over time.

May 07 2015
May 07

I'm speechless. And in awe. And maybe a little bit scared.

Through a bit of an odd synchronicity I have just come to learn about a new technology that is getting ready to make its debut. And, while the term "disruptive" gets totally overused these days, I do think that this particular technology may have the power to disrupt my livelihood.

I don't know whether to celebrate this technology, appreciate this technology, or update my resume. At any rate, I just signed up for TheGrid. It's kind of mind blowing.

Will it really be possible for an AI website builder to replace me as a web developer? Can it replace my skillset of building custom web applications? What types of websites will it be able to build?

Looking at their information, they say that the tool can automatically create an eCommerce site. I haven't seen anything about it being able to create a membership site. So, maybe I shouldn't get too panicked about this. I'm definitely going to want to keep an eye on it though.

Why don't you take a look for yourself and see what you think? Then leave your comments below. I'm anxious to hear what you have to say!


Mar 13 2015
Mar 13

I am pleased to welcome to the Drupal community:

They are students in my Udemy pilot course Start Successfully; Install Drupal Easily & Quickly. Why not stop on by their pages and send them a warm welcome through their contact forms?

View the discussion thread.
Mar 03 2015
Mar 03

I have settled on using Udemy as my exclusive platform for delivering Drupal education. I'm so excited to start taking advantage of all the great tools the platform offers and I am laying the groundwork for engaging extensively with my students. I've got four challenges I'll be issuing to my students during the month of March, with a prize for each one as well as a Grand Prize at the end. It would be great to have you play along!

Join for free!

Jan 26 2015
Jan 26

The Kickstarter campaign was not funded, but that does not mean that it was not successful! We are still moving ahead. I've just published my first course on Udemy and would like to get pilot members to provide feedback so that I can make sure the course ends up being world class.

Here is a coupon code to access the course for free: https://www.udemy.com/getting-started-with-drupal-for-total-beginners/?c...

The course introduction provides more details about the planned direction for the training. So, I won't repeat it all here. Suffice it to say that I am still planning to follow the Ridiculously Open Online Self Training Site philosophy.

Udemy requires that all coupons have a quantity specified. I have set the code to allow 250 redemptions. I'll update this post if the coupons "sell out."

Dec 02 2014
Dec 02

Today is Giving Tuesday, "a global day dedicated to giving back."

Drupal's tagline is "Come for the software, stay for the community." I'd like to ask you to consider supporting the Teach Yourself Drupal Kickstarter campaign to create a free totally open source online Drupal training product. By backing this project, you will be giving a gift that keeps on giving back to the Drupal community.

Nov 24 2014
Nov 24

There was a session at BADCamp this year asking how Men can be better allies for Women in tech. The panelists had experiences with males that ranged from helpful, to innocently bungled, to outright demeaning. There was a small amount of suggestions about what men can do to be better allies.

I'd like to take a brief look at how R.O.O.S.T.S. can play a part in helping Women in tech.

The choice in the R.O.O.S.T.S. acronym is meant to evoke images of a nest. In other words, a safe nurturing place where young birds are nourished until they are ready to fly off into the world on their own. R.O.O.S.T. sites are warm, welcoming, safe and nurturing. They are also "ridiculously open." The creators of R.O.O.S.T.S. are willing to be vulnerable, make and admit mistakes, and share everything they have learned in the process of creating the site. Additionally, the sites are designed to be collaborative in nature.

Don't all of the aforementioned qualities seem to be helpful and supportive to not only female site members, but to all site members?

How many R.O.O.S.T. sites currently exist? Are you willing to help with the creation of one? If so, then checkout out my Kickstarter campaign to build a R.O.O.S.T. site to teach people how to teach themselves Drupal. Let's see what we can do to address this longstanding problem in the technology sector!

Nov 20 2014
Nov 20

There are many paid and free Drupal training sites on the internet. To the best of my knowledge, none of them is open source. And I'm quite certain none of them is "ridiculously open."

Inspired by Khan Academy, I decided that I wanted to build a Ridiculously Open Online Self Training Site that teaches people how to teach themselves Drupal. So, I have launched a Kickstarter campaign to get the idea off the ground.

I've contacted many people in the Drupal community already and have gotten some feedback about concerns with the idea. So, I'd like to address a few of them here.

Q: Why are you teaching Drupal 7 instead of Drupal 8?

A: I'm using Drupal 7 because it's available right now. This campaign is meant to fund a proof-of-concept and prototype for an ongoing product. It's not a one-off project. I fully intend to teach Drupal 8 in the future.

Q: How can you pull this off on your own? Aren't you being too ambitious?

A: I do not intend that this will remain a one person show. I have contacted people in the community with whom I'd love to collaborate on the product if I can get adequate funding.

Q: How do you plan to fund it ongoing? Why do you think you will be able to get sponsors?

A: The long term vision is that it will be funded by sponsors. I am confident that with a large enough user base I can make the value proposition to a significant number of organizations who would benefit from the increased supply of skilled Drupal service providers as well as organizations who would benefit from the increased adoption of Drupal.

Q: What kind of prior screencast and Drupal training experience do you have?

A: To date, the most I really have to show is this blog. But, I am planning to create 60 minutes' worth of rough-cut screencasts to serve as examples of what I will do. I did build a website to present how to theme Drupal 6. Also, if you like you can check out some impromptu Google Hangouts I did as a Tech Lead for one of my clients.

Q: What will make your site ridiculously open?

A: You can get some information on the Teach Yourself Drupal website.

Q: What exactly is a Ridiculously Open Online Self Training Site?

A: Please check out the R.O.O.S.T.S. website I've built to answer that question.

Finally, I'm serious about being ridiculously open. You may get involved with the project and the product on Github.

Jul 25 2014
Jul 25

I needed to do some custom validation of fields on a form. So, I decided to use #element_validate. One of the fields I was validating appeared a bit strange to me, though. When I displayed its $form_state['values']['field_face_palm'] information I saw that it looked like:

$field_face_palm['und'] = 'you_knucklehead'

instead of like:

$field_face_palm['und'][0]['value'] = 'you_knucklehead'

Well, I figured that's just the way it was. I couldn't imagine why Drupal would be formatting the information differently, but I couldn't change it. So, I wrote and tested my code on my local development environment and pushed it up to the public test environment.

The validation did not work properly on the public test environment. To start debugging, I once again displayed the field information. This time it did correspond to the usual pattern.

I was completely stumped as to what was different between the two environments and figured that the error must be on my local environment. So, I was going to need to do more experimentation in my local environment.

In the process of testing different things, I used a $form['#validate'] and noticed that in that validation function the field was also formatted as I would have expected. So, the field was getting formatted properly at some point.

I guess I need to come clean at this point. Even though I was using element validation, I was comparing one element to others in some of the validation functions, as opposed to looking only at the element that was being validated. My issue was that the element in question had not yet been fully formatted when I was inside a different element validator function.

I still don't have an answer of why the element was fully formatted in the public test environment but not in my local development environment. I was using Features, which should guarantee that the content types were defined in exactly the same way. Nonetheless, it makes sense that one shouldn't make any assumptions about the state of any other fields when inside the validation function for a particular field. The proper approach for the situation in which one field needs to be compared to another is to use a form validation function.

May 30 2014
May 30

I was having trouble getting a feature to enable correctly. It wasn't creating all the fields for the content type it defined. It built some of the fields but not others. I was pretty certain that it was working fine on other sites. But, I couldn't imagine what was different about the environment in which I was having trouble. I finally found the culprit when I took a closer look at my directory structure.

Since I was grabbing code from a different environment that should have had a more recent version of the features I needed (and I didn't have version control in use in my test environment), I decided to rename the directory that held all my features before I pulled in the new version of the directory. For example, let's assume that I was working with code in sites/all/modules/custom/my_features_directory. Instead of doing a rm -r my_features_directory I did a mv my_features_directory my_features_directory_backup. Then I did a cp -r some/other/path/my_features_directory .. Can you see where my problem arose?

The issue is that even though I changed the name of the directory, all the modules (features) that were inside of the renamed directory still had the same name. I now had my_features_directory_backup/somesubmodule/somesubmodule.module as well as my_features_directory/somesubmodule/somesubmodule.module. So, when Drupal scanned for the modules (features) it found the older version(s) inside of the backup directory.

Remember: Drupal doesn't really care what you name your directories. It scans through them all looking for your .info and .module files. You aren't really "hiding" anything by renaming a directory. You aren't any safer if you move the directory somewhere else within the sites/all structure, either. Drupal follows this same directory scanning approach for a number of other things as well. So, the same lesson applies: You need to move things entirely out of your Drupal root structure.

As far as whether I should have been using version control, that's a topic for a different post.

May 01 2014
May 01

I was writing custom forms that needed a validate handler and a submit handler. So, I followed the standard approach of

  function my_module_menu(){
    $items = array();
    $items['my/module/custom-form'] = array(
      'title' => 'I am a doofus',
      'page callback' => 'drupal_get_form',
      'page arguments' => array('my_module_custom_form'),
      'access callback' => TRUE,
      'type' => MENU_CALLBACK,
    return $items;

Note: My access callback is just to simplify this example.

  function my_module_custom_form($form, &$form_state) {
    $form = array();
    $form['stuff'] = array(
      '#type' => 'item',
      '#markup' => t('I am a doofus'),
    $form['actions'] = array(
      '#type' => 'actions',
    $form['actions']['submit'] = array(
      '#type' => 'button',
      '#value' => t('Just shoot me!'),
    return $form;

Note: This is using Drupal 7 conventions, but the issue is the same in Drupal 6. I have written the code with the error in it. Can you see the error?

  function my_module_custom_form_validate($form, &$form_state) {
    // some validation here

Note: I had placed the drupal_set_message to help me figure out what was being called and what wasn't. The _validate function was being called.

  function my_module_custom_form_submit($form, &$form_state) {

Note: I was not seeing the drupal_set_message for the _submit nor was the drupal_goto happening.

As noted above, I was seeing the drupal_set_message for the _validate function when I clicked the submit "button." So why wasn't my _submit handler being called? It's not like this is the first time I have ever used the FAPI. Nor is it the first time I had written _validate and _submit handlers.

Have you figured out what my mistake was, yet?

My problem was that I had used '#type' => 'button' instead of '#type' => 'submit' for my submit "button!"

Dec 23 2013
Dec 23

What's that feature: the #attributes key.

Perhaps you have written your own javascript code to determine that an empty textfield does not have focus, and in such a situation place some placeholder text in the field. If you are using the FAPI there is an easier way. You can do this:

$form['my_textfield'] = array(
  '#type' => 'textfield',
  '#attributes' => array(
    'placeholder' => t('My placeholder text'),

Take note that this is telling Drupal to use the placeholder="My placeholder text" attribute for the textfield. The placeholder attribute is an HTML5 attribute. Keep this in mind when considering what browsers will be accessing your site and whether it's important for all visitors to see the placeholder text.

You can tell Drupal to use any (valid) HTML attributes with this technique.

This really-easy-to-use feature was one that I had forgotten about. So, I figured others may have forgotten about it as well. I hope you enjoy it!

Nov 22 2013
Nov 22

What's that File (layout)?

There are many different ways to figure out what information the node table contains.

  1. You could use dsm($node); in an appropriate place in your code, assuming you have the Devel module installed.
  2. You could also use a poor man's version of dsm, a la drupal_set_message('
    ' . print_r($node, 1) . '
  3. You might think to take a look at the Node template file.
  4. On the other hand, you might ssh into a server and do something like mysql -u someuser --database=somedatabase -p followed by DESC node. Some of you might even have done drush sqlc instead of entering the mysql sequence.

But, most of those options would require you to leave your browser. And maybe the node.tpl.php doesn't quite make things clear for you. How about looking at the code that defines the table?

Some of you may be saying, "But then I'd still have to go out to a terminal and do a drush dl drupal." Alas, there is another way to approach looking at code, that I use quite regularly. I'll walk you through the steps for this particular example.

  1. Navigate to the project page.
  2. Look in the right sidebar and click on the View commits link.
  3. Click on any of the commit ids
  4. Strip out part of the path to take you to the project git repo. Of course, if you remember the pattern [I never do], you can just go directly to the repo without all those extra clicks.
  5. Scroll down the page to the section that says "heads."
  6. Choose one of the heads and click on the tree link.
  7. Next click on the modules link.
  8. Select node.
  9. Open up node.install and look at function node_schema().

While this post focused strictly on finding out the schema for the node table, the technique could be used to find out anything about what a project is doing, without having to leave your browser. In addition, it makes mention of a lot of other handy tools.

You may be wondering:

  • "What is this devel module and what is dsm?"
  • "What is drupal_set_message and what if I can't interrupt the program flow to print a message to the screen at that time?"
  • "What is the Node template file and when would I use it?"
  • "What is this drush sqlc and drush dl?"

All of those questions make for more blog posts!

If you'd like to read a post on one of those topics, or on some other topic, register an account (sorry commenting is still disabled for anonymous visitors) and leave a comment or shoot me a message through my contact form.

Thanks to Chris Miller for suggesting that I write this post.

Nov 15 2013
Nov 15

What's that Feature?

When your code executes a variable_get what actually happens is that Drupal inspects the $conf global array variable to see if it contains an index with the variable name. It does NOT actually query the variable table.

The global variable is built from cached data. So, if you were having problems with $conf not containing the value that you verified was in the variable table, you could reasonably assume that you could fix the issue by making sure that you cleared caches to force it to be rebuilt. But, what if it STILL did not contain the value that's in the variable table?

Well, there is (at least) one other place where the $conf variable can be set: settings.php. Setting the variable in settings.php takes precedence over whatever is in the database.

So, the next time you can't seem to get the $conf variable to contain the value that you think it should contain, have a look through settings.php and see if it's being explicitly set there.

Thanks to Adrian Rollett for helping me out with this vexing problem when I simply could NOT figure out what was going on.

Edit: The Installation Guide contains a page that lists variables that can be set using the $conf array.

Apr 04 2013
Apr 04

I was writing an extremely simple custom module (for a D6 site) to make use of hook_block. Every time I enabled the module the blocks no longer displayed on the pages. Since it had been a long time since I had done any work in D6, I figured there must be something I was overlooking in how I wrote the function. If I disabled the module (or even just commented out the hook_block) function then the blocks reappeared. So, I spent a fair amount of time looking over how I had written the hook. But, I couldn't see anything wrong with it.

Next, I tried the usual fix-all of clearing cache. In fact, I cleared it two times in a row just to be sure. I also looked for any entries in error logs, including the watchdog file and the server error logs, and didn't find anything.

In the process of testing, I re-enabled the module and uncommented the function and things seemed to just start working again. I thought to myself, "Must be gremlins in the server." (Actually, I typed it out in the IRC channel.) But, the site was apparently working again, so I went on my way. Naturally, the problem cropped up again.

Since it seemed to be a sporadic error, I thought that it must be related to something with the server setup. So, I tested whether increasing the memory_limit or max_execution_time had any effect to no avail. Out of desperation I thought about just changing the name of the custom module, and a light finally went on! I realized that I had named the custom module the same thing as the custom theme. So, the situation was that I had /sites/mysite/themes/mycustomname/mycustomname.info as well as /sites/all/modules/custom/mycustomname/mycustomname.info and /sites/all/modules/custom/mycustomname/mycustomname.module. This lead to the function being named function mycustomname_block($op = 'list', $delta = 0, $edit = array()).

Once I renamed the module everything worked just as expected. I haven't investigated where in the process things broke between the module and the theme layer. The theme is a sub-theme of Omega and there is an empty preprocess-block.inc file in the /sites/all/themes/omega/preprocess directory. But, there is no implementation of hook_preprocess_block in the template.php for the custom theme or the base theme.

So, the moral of the story is: Whenever you are working on a site make sure that your theme names and your module names are distinct.

About Drupal Sun

Drupal Sun is an Evolving Web project. It allows you to:

  • Do full-text search on all the articles in Drupal Planet (thanks to Apache Solr)
  • Facet based on tags, author, or feed
  • Flip through articles quickly (with j/k or arrow keys) to find what you're interested in
  • View the entire article text inline, or in the context of the site where it was created

See the blog post at Evolving Web

Evolving Web