Heard about DrupalEasy Academy Career Training? Learn more about our 10-week quickstart Drupal Career Starter Program.
Interested in learning more about Drupal, but can't find the training you're looking for? Help us help you by letting us know what workshops interest you. Take this short survey to let us know!
Check out DrupalEasy around the web:
DrupalEasy is the collective expertise of Ryan Price and Michael Anello, who joined forces to provide training and consulting services worldwide. Read all about them and what they can do.
Drupal is a free, super-powerful content management system for sites that require information posting and collection, including blogs, forums, videos, photos, and databases of information. We think it is the best platform available. Here's why...
More and more savvy organizations are going with Drupal for content management, and its no mystery why. It’s free, flexible, and easy to maintain for small or large volume sites. Learn more...
Larry Garfield (Crell), leader of the Drupal 8 Web Services and Context Core Initiative (WSCCI), joins Andrew Riley, Ryan Price, and Mike Anello as they desperatly tried to stay out of the weeds during their discussion about routing, hypermedia, controllers, and REST (and somewhat fail). Along the way, we learn what Drupal developers of all disciplines and skill levels can expect from WSCCI, and why it's going to make the (Drupal) world a better place. In addition, we discuss importance of Hackathons and not over-reacting.
Larry works for Palantir.net and blogs at GarfieldTech.com. He mentioned Symfony, the status of WSCCI, the new WSCCI Conversion guide (still in progress; need to cover forms), and currently open conversion issues.
Each podcast we ask our guests the same five questions. Here are Larry’s answers:
1. Mac at work (by force), PC at home, NetBeans everywhere.
2. Kat Bailey (katbailey).
3. Anywhere that everyone is in the same hotel.
4. Jeff Eaton (eaton)
5. He would answer SCOTCH if we let him, so we dragged Twig out of him instead.
Want to know what the five questions are? Listen to the podcast!
Just two stories this week...
1. What Hackatons Really Are blog post by Alan Polozzolo (zzolo)
2. How “dongle” jokes got two people fired—and led to DDoS attacks, Editorial from Ken Fisher, editor of Ars Technia: “Donglegate” is classic overreaction - and everyone pays. Or, how not to deal with difficult social issues. Related links suggested by Larry: THIS JUST IN: @WebandPHP Embrace Women in an attempt to Enhance PHPness and Boost Subscriptions, Adria Richards, PyCon, and How We All Lost, Storms and Teacups.
Subscribe to our podcast on iTunes or Miro. Listen to our podcast on Stitcher.
If you'd like to leave us a voicemail, call 321-396-2340. Please keep in mind that we might play your voicemail during one of our future podcasts. Feel free to call in with suggestions, rants, questions, or microphone setup tips for Ryan. If you'd rather just send us an email, please use our contact page.
Greg Dunlap (heyrocker), leader of the Drupal 8 Configuration Management Initiative (CMI), joins Andrew Riley, Ted Bowman, and Mike Anello to kick off the 2nd hundred episodes of the podcast. Greg provides an excellent rundown of not only the features of CMI, but also his fund-raising efforts that allowed him to work full-time on it for seven months! In addition, we used Greg as our test subject for a new podcast feature that we call “five questions”, discussed PHP versions, how much money an average Drupal developer makes, and the DrupalCon location selection process. All this, plus our picks of the week (hint: someone’s involved pinball)!
Greg was named the Drupal 8 Configuration Management initiative lead in March, 2011 by Dries, Funding CMI, Where is the CMI today?.
Each podcast we ask our guests the same five questions. Here are Greg’s answers:
1. 11” MacBook Air (no external monitor!), TextMate, NetBeans, Chrome.
2. Nick Schuch (nick_schuch), Lee Rolands (larowlan), Jeremy Thorson (jthorson), Wim Leers (Wim Leers), Devin Carlson (Devin Carlson), Alex Bronstein (effulgentsia), Tim Plunkett (tim.plunkett), Jesse Beach (jessebeach), Cameron Eagans (cweagans), Alex Pott (alexpott). Clearly, we need to better enforce the pick one rule.
3. Chicago, Las Vegas.
4. Jeff Eaton - eatoncon keynote.
5. Replace FormAPI with Symphony’s form system.
Want to know what the five questions are? Listen to the podcast!
Subscribe to our podcast on iTunes or Miro. Listen to our podcast on Stitcher.
If you'd like to leave us a voicemail, call 321-396-2340. Please keep in mind that we might play your voicemail during one of our future podcasts. Feel free to call in with suggestions, rants, questions, or time-management tips for Andrew. If you'd rather just send us an email, please use our contact page.
I've been on the road a lot lately, touting the opportunities that Drupal offers to workforce and economic development efforts of regions and states. Thing is, before we can get to all the advantages for regions to develop a Drupal-talented workforce, we have to educate a lot of government leaders, commissions and committees on what Drupal is and does. In short, they need to "get it." This means understanding not just what Drupal is used for, but why it is growing as quickly as it is. Decision makers in many of our forums do not know what a content management system is, nor what open source means. That's a lot of ground to cover before we can even get to the whole training component!
So, in our usual DrupalEasy approach to making things more efficient, we created an under-three minute video that seems to meet our needs. No audio as yet, but we are open to suggestions as to a voice over, or some open source diddy that might make it a bit more engaging. Give it a look, and let us know what you think, what we can do to improve it, and how you might be able to use it. Also, if you need to explain Drupal to anyone, feel free to pass it along. DrupalEasy proudly presents... V1 of: What is Drupal?
The fifth annual Florida DrupalCamp is now open for registration! DrupalEasy is proud to be a sponsor for this year’s FLDC as well as being involved in the planning and execution of the camp through not only myself, but also through our network of contractors and graduates from our two local DrupalEasy Career Starter Program sessions. A full day of sessions on Saturday, April 20 as well as Coding for a Cause and a code sprint on Sunday, April 21 will provide ample learning, sharing, networking, and socializing opportunities for technologists interested in expanding their Drupal knowledge and network.
Over the past five years we’ve grown from a small (less than 100 people) event held in a sponsor’s office to one of the largest DrupalCamps in the southeast. This year we’re expecting well over 300 attendees at the Florida Technical College campus. For only $20 (early-bird price), attendees will be fed all day (by an amazing local caterer), be outfitted in one of the coolest DrupalCamp t-shirts I’ve seen (IMHO), be able to choose from six simulatenous tracks of sessions, and enjoy a keynote presentation by one of the nicest people in the Drupal community: Ryan Szrama of Commerce Guys.
Obviously, an event of this magnitude wouldn’t be affordable for many people without the participation of our extremely generous sponsors. Our Platinum sponsor, Mediacurrent - while based in Atlanta - employes a significant number of telecommuters who live in Florida. Within minutes of my contacting them about being a sponsor for FLDC, they had committed to being our top-level sponsor.
For the past few years, we’ve worked with the Central Florida Computer Society as our fiscal sponsor. In addition to acting as our sponsor 501(c)(3) organization, they generously provide us with accounting support and a small army of volunteers the day of the camp.
With our usual venue currently undergoing renovations, the Florida Technical College (FTC) stepped up and offered us the use of their entire building (over 20 classrooms!) for the entire weekend of the event. As part of our agreement, we hope to introduce a significant number of FTC students to Drupal.
In addition to registration being open, we’re also accepting session proposals for the camp. We’ve added an “Off the Drupal Island” track to encourage our community to learn about complementary technologies, and have arranged for the trainers from OS Training to provide a full-day beginner track as part of the camp.
We’re expanding our normal Sunday events this year to include a code sprint. If you’re interested in learning how to contribute back to the Drupal community, this is a great opportunity to learn how to work on community based tasks - including code, documentation, and cat-herding. Coding for a Cause is back for its third consecutive year - during this event volunteers will build an entire web site for multiple local non-profit organizations. We’re currently accepting applications, so if you know of a Florida-based non-profit looking for a new web site, please send them to the application.
Getting back to our sponsors for a moment, Digital Frontiers Media (a Sarasota-based Drupal shop), Big Couch Media Group (a Palm Beach-based Drupal shop), Purple Rock Scissors (an Orlando-based digital creative agency), and Educational Data Resources (a Winter Park-based educational technology company) are on-board as Gold sponsors. These organizations, as well as the rest of our sponsors deserve all the credit for providing the financial support necessary to bring our community together. Thank you!
There’s a lot more to this event that I haven’t covered: a discount hotel rate, an after-party that we’re still in the midst of planning, plenty of giveaways, and the opportunity to purchase limited-edition polo shirts with our beloved Drupal Diver logo!
The hosts and organizers, the Florida Drupal Users’ Group is a diverse groups of community leaders from all of Florida. While we have various meetups in all parts of the state, we take pride in the fact that we utilize http://groups.drupal.org/florida as our “home base” and do our best to act as a single community.
I recently ran into an issue on one of our projects with a Git repository that stumped me for a few days. It was a small project: only three developers committing to a single repository hosted on Pantheon. I kept on running into an issue where I (or any of the other developers) could ever get my local repository to a “clean” state.
That is, I’d run “git status” and see
$ git status
# On branch master
#
# Changes not staged for commit:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: image.JPG
#
# no changes added to commit (use "git add" and/or "git commit -a")
Hmmm, that’s odd, as I didn’t modify image.JPG. No worries, let me just do a “git checkout” on it...
$ git checkout image.JPG
$ git status
# On branch master
#
# Changes not staged for commit:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: image.JPG
#
# no changes added to commit (use "git add" and/or "git commit -a")
Whaaa? But I just checked it out? How can it be modified?
Well, as you may be guessing by the capitalized “.JPG” extension, the root of this problem was with case-sensitivity.
I called upon my Git mentor, David Rogers to help me figure out where the problem was and how to remedy it. David explained to me that the issue was that due to the fact that the three of us developers were on case-insensitive machines (Macs), and some of the commits were being made on a case-sensitive server. Pantheon has a feature where files SFTP’d up to the server are automatically committed, and our client-developer was making his commits this way.
The problem was caused because one of our developers committed the same file with two different (according to case-sensitive Linux) filenames to the repo, “image.jpg” and “image.JPG”. So, as David eloquently explained:
So Linux sees "FOO.JPG" and "foo.jpg" as two separate files... But Mac / Win see them as the SAME file... And Git, being a Linux tool, sees them as different, because it includes the name of the file in the hashing algorithm. If the hashes don't match, there's a difference. If the name is not the exact same, the hashes won’t match.
Brilliant - we had our cause, so what was the solution? It was actually a two-parter.
First, we needed to correct the repo on a case-sensitive machine so that there was only one copy of the (lowercase-named) image. We did this by using “git rm” to remove the duplicate, upper-cased file, then committed the change, then had our developers pull the commit.
If their local repos were still “dirty”, all that needed to be done was to locally drop the offending file, then check it back out using “git checkout”.
The key step here is fixing the upstream repository on a case-sensitive machine, without doing this, we’d never fix the core issue. Or, as David explained, we’d have a classic “who’s on first” routine on all of our case-insensitive machines:
user: git, what's our status?
git: the file named FOO has changed...
user: what's changed about FOO?
git: it looks different.
user: uh, okay... mac, delete FOO.
mac: (silently) deleted "foo"
user: okay, git, what's our status?
git: you're missing two files: "foo" and "FOO"...
user: wait, what? Okay, check out "foo" for me...
git: (silently) checked out "foo"
user: okay, great now what's our status?
git: the file named FOO has changed...
user: this again!? mac, what files are in this directory?
mac: there's a file called "foo"
user: git, what's the status of file "foo"...?
git: the file named FOO has changed...
user: MUST KILL ROBOT!!!!
So, the moral of the story - always keep your filenames lowercase to avoid issues like this, and if you do encounter an issue, fix it on a case-sensitive machine.
David Rogers is a professional software developer, speaker, trainer, and organizer of the OrlandoPHP user group. If you’d like more git-based comedy routines or at least an entertaining solution to your development problems, you can find him on the internets.
Angie Byron (webchick) joins Andrew Riley, Ryan Price, and Mike Anello for the centennial edition of the DrupalEasy Podcast. We threw our standard format out the window for this episode and discussed a wide range of topics including creating ravenously passionate contributors, migrating modules to Drupal 8, the new Drupal 8 feature that Angie is looking most forward to, Angie’s job description, the tools she uses, what she views as Drupal’s biggest threat, and a whole bunch of other stuff. ![]()
![]()
All about Angie: Using Drupal book, http://www.webchick.net/, DrupalCon Sydney Presentation, How to Create Ravenously Passionate Contributors, Converting modules from D7 to D8 (Pants!), Drupal core office hours, Core mentoring overview, Drupal 8 wind sprint fridays, Main “jump off” point for what to work on in D8.
Florida DrupalCamp - Saturday, April 20, 2013 - Sponsors include Mediacurrent (Andrew's employer) and DrupalEasy.
Donate to Aaron Winborn’s Special Needs Trust
Subscribe to our podcast on iTunes or Miro. Listen to our podcast on Stitcher.
If you'd like to leave us a voicemail, call 321-441-3964. Please keep in mind that we might play your voicemail during one of our future podcasts. Feel free to call in with suggestions, rants, questions, or contributing tips for Andrew. If you'd rather just send us an email, please use our contact page at http://DrupalEasy.com/contact
Jennifer Lampton (jenlampton) of Jeneration Web Development joins Ryan Price and Mike Anello to talk about the most-excellent new theme engine forthcoming in Drupal 8: twig. Jen tells us everything that’s wrong with theming in Drupal 7, and how twig in Drupal 8 will be like riding a pure white unicorn on candy-coated road across an aqua-blue sky so much better. WYSIWYG in core, microcopy, documentation, and some really good picks of the week are also covered in the last ever 2-digit DrupalEasy podcast!
DrupalEasy is proud to be a sponsor of Florida DrupalCamp 2013, to be held April 20, 2013 at Florida Technical College in Orlando.
Donate to Aaron Winborn’s Special Needs Trust
Subscribe to our podcast on iTunes or Miro. Listen to our podcast on Stitcher.
If you'd like to leave us a voicemail, call 321-441-3964. Please keep in mind that we might play your voicemail during one of our future podcasts. Feel free to call in with suggestions, rants, questions, or scheduling tips for Andrew. If you'd rather just send us an email, please use our contact page at http://DrupalEasy.com/contact
Holly Ross, the incoming executive director of the Drupal Association joined Ryan Price and Mike Anello on this episode to talk about the her background, the Drupal community, and her new job. Along the way we learn about her background in community organizing and building as well as her love of awesome 80s music. Other topics discussed include Omega 4, the usability of module names, and the 2012 internet in numbers.
If you'd like your site highlighted, please submit it at http://DrupalEasy.com/siteoftheweek.
Subscribe to our podcast on iTunes or Miro. Listen to our podcast on Stitcher.
If you'd like to leave us a voicemail, call 321-441-3964. Please keep in mind that we might play your voicemail during one of our future podcasts. Feel free to call in with suggestions, rants, questions, or scheduling tips for Andrew. If you'd rather just send us an email, please use our contact page at http://DrupalEasy.com/contact
Doug Hercules (dhercjr on drupal.org) is a graduate of the 2012 class of the DrupalEasy Career Starter Program and currently working as an intern with DrupalEasy.
This week I was tasked with learning how to automatically close comments on a node two weeks after the node is created. We initially looked into a couple modules that did this well, Comment closer and Comment commander, but since neither is quite ready for Drupal 7, we decided this would be a good opportunity for me to learn more about the Rules module. Maintained by Wolfgang Ziegler (fago) and Klaus Purer (klausi), this module allows you to define actions that are triggered automatically on various Drupal events as they occur. This blog post will walk you through how I accomplished this task.
Drupalize.me has a great video in their “Learning the Rules Framework Series” called Introducing Rules Scheduler (currently free!) that provided the basic framework for this task. This video was invaluable in getting me up to speed with basic rules functionality.
The first thing I needed to do was download and install Rules. I enabled the Rules, Rules UI and Rules Scheduler module, which required me to also download and enable the Entity tokens and Entity API modules.
Rules Scheduler works with Rules components only, and allows us to schedule an evaluation of rules components; not executing them instantly, but later at a predetermined time. So I began by creating a rules component, which is an individual set of Rules configuration that can be implemented by a Rule, as well as other modules on your site. To get started, on the main Rules Component page (admin/config/workflow/rules/components), I clicked to “+ Add new component”. I wanted my component to actually remove the comment ability to the node (an “action”), so in the “Component plugin” box I chose “Action set” and Clicked “Continue”. In the next screen, in the “Name” box, I typed “Close comments on a node”. The Variables section at the bottom of the page then looked like this,

I entered the following; DATA TYPE: Node, LABEL: Node, MACHINE NAME: node, USAGE: Parameter, and clicked “Continue”. I wanted this component to perform on a certain node, so I chose Parameter. A parameter is a variable that is given a specific value when the Rule is performed, it receives the specific node parameters as input and then sets the variables as an output to the component.
Next, I needed to create an action that would close comments. I did this by clicking “+ Add action”, and then in the “Select the action to add” box, I chose “set a data value”. Then in the DATA section “Data selector”’ box, I selected “node:comment” because that’s what I wanted my action to impact and clicked “Continue”. To enter a VALUE, I typed “1” in the Value box (This is just a integer; 0 meaning hidden, 1 meaning it’s closed and 2 it’s open), and clicked “Save” to save my new component. On its own, the component does nothing. It is only once I create a rule that utilizes the component will anything actually happen.
The next step is to create a
rule to wait 2 weeks after my node is created, and then run the component. To do this I went to - admin/config/workflow/rules and Clicked “+ Add new rule”. In the “Name” box, I typed “actions when new articles are posted” and in the ‘React on event’ box I chose “After saving new content” and Clicked “Save”. There are many options that look similar so be sure to select this one.
I then realized I wanted this to occur not only to new stuff, but whenever I modify existing stuff as well, so I Clicked “+ Add event”, and in the “React on event” box I chose “After updating existing content” and Clicked “Add”. The key is, that in either case (new or existing content), I only want the component to be scheduled if the article is published. I’ll set this up in a later step.
In the Conditions section I Clicked “+ Add condition” and in the “Select the condition to add” box, I chose “content is of type”. Then in the CONTENT section “Data selector” box, I selected “node”. In the CONTENT TYPES section you can select all of the types that you want the comments to close after 2 weeks, in the “Value” box and I Clicked “Save”. For this exercise, I just selected “article”.
To ensure the article is published before the 2 week countdown starts, in the Conditions section, again I Clicked “+ Add condition” and in the “Select the condition to add” box, I chose “content is published”. Then in the CONTENT section “Data selector” box, I selected “node” and Clicked “Save”.
Now to schedule the component to run. In the Actions section, I Clicked “+ Add action” and in the “Select the action to add” box, I chose “schedule component evaluation”. In the COMPONENT section I chose “Close comments on a node” in the “Value” box and Clicked “Continue”. In the SCHEDULED EVALUATION DATE section, I typed “+2 weeks” in the “Value” box (For a good test to make sure you’ve done everything right, you can type “+2 minutes” to make sure it works).
The identifier is what differentiates one task from the other, so in the IDENTIFIER section, I typed “ close comments for node [node:nid] “ in the “Value” box so we only have one comment closing for each mode, and lastly, in the NODE section Data selector box, I chose “node” to send the node variable of the node being saved to the rules component and Clicked “Save”. Therefore, the Rule takes this node and passes it into the component as the node parameter, these nodes and parameters gets saved, and are then loaded when the component is executed.
Now if you did the “+2 minutes” test, you can add an article to your site, and verify the comment capability on the new node. Wait for 2 minutes, refresh your screen and see that the comment capability is gone. Once confirmed, don’t forget to go back in and edit your rule to “+2 weeks” or you won’t be getting too many comments on your site!
I’ve gone ahead and exported both the rule component and the rule for you to check out. First to import the component, go to admin/config/workflow/rules/components and paste the following rule component export into your import page.
{ "rules_close_comments_on_a_node" : {
"LABEL" : "Close comments on a node",
"PLUGIN" : "action set",
"REQUIRES" : [ "rules" ],
"USES VARIABLES" : { "node" : { "label" : "Node", "type" : "node" } },
"ACTION SET" : [ { "data_set" : { "data" : [ "node:comment" ],
"value" : "1" } } ]
}
}Similarly for the rule, from admin/config/workflow/rules, import the following:
{ "rules_actions_when_new_articles_are_posted1" : {
"LABEL" : "actions when new articles are posted",
"PLUGIN" : "reaction rule",
"REQUIRES" : [ "rules", "rules_scheduler" ],
"ON" : [ "node_insert" ],
"IF" : [
{ "node_is_of_type" : { "node" : [ "node" ],
"type" : { "value" : { "article" : "article" } } } },
{ "node_is_published" : { "node" : [ "node" ] } }
],
"DO" : [
{ "schedule" : {
"component" : "rules_close_comments_on_a_node",
"date" : "+2 weeks",
"identifier" : "close comments for node {node:nid}",
"param_node" : [ "node" ]
}
}
]
}
}and there ya go, a new component and rule in under a minute! I hope that at least sparks your curiosity into Rules.
Doug Hercules (dhercjr on drupal.org) is a graduate of the 2012 class of the DrupalEasy Career Starter Program (http://drupaleasy.com/dcsp) and currently working as an intern with DrupalEasy.
This week I had the opportunity to clone a website from a git repository using Quickstart. Quickstart is a really quick, pre-made PHP Drupal development environment in a VirtualBox, which allows you to install a virtual machine to run Linux on your Windows PC. I've only gone through the process of cloning a site into Quickstart once before, and this time I thought I’d document it in my blog for myself and anyone else who might want to do this in the future. The general idea is this - there’s a site that I need to work on that is stored in a remote git repository. I want to get a copy of the site up-and-running inside Quickstart. To get started, I downloaded Quickstart, installed VirtualBox, then imported the Quickstart file into it.
Once I got Quickstart fired up on my Windows laptop, I set off to work. I used Drush (which comes built-in to Quickstart) to configure my virtual host and create an empty database and directory for the site. The Getting started with Quickstart page is a great resource for all the Quickstart specific Drush commands that it includes. At my command prompt I typed
drush qc apache dns database --domain=localsitename.dev
Important to note, this created an empty “localsitename_dev” database. Remember that underscore when you’re setting the name of your database later during Drupal's installation process.
Next, I wanted to clone (Quickstart also comes with Git pre-installed!) the site into the directory I just made, so I changed the directory to the new localsitename directory and I used the git clone command to copy the site from the remote repository. I added a “ .” ("space-period") at the end of the clone command so it cloned the repository into the current directory.
Next, I went to my browser and installed the site by going to http://localsitename.dev/install.php (remember, the Drush command I used automatically also set up this virtual host), this is where I needed to remember that underscore when I named the database. If you run into any files directory and/or settings.php issues, here’s some commands that might come in handy:
$ cp //to copy my settings.php file
$ mkdir //to make a new files directory
$ ls -al //to show me the permissions to each file
$ chmod //to change file permissions

At this point, the site was installed with a fresh database. The final step was to get copy the database from the shared development server. I first enabled the Backup and Migrate module on my new local site, then I went to dev site and performed a quick backup (/admin/config/system/backup_migrate); saving it to my local “downloads” directory.
Finally, I went back to my new local site and restored (/admin/config/system/backup_migrate/restore) by uploading the file I just downloaded.
Poof! I have a cloned website!