Planet Drupal

Subscribe to Planet Drupal feed - aggregated feeds in category Planet Drupal
Updated: 53 min 35 sec ago

ThinkShout: Navigating Entity URIs: A Practical Example

Fri, 27/06/2014 - 19:15

At ThinkShout, most of our modules are based around the Entity system. After all, like most developers, we are big abstraction nerds. Entities enable some rad abstraction in Drupal land: our Registration module lets you registration-enable any fieldable entity; the new version of MailChimp lets you sync any fieldable entity with an email address with your MailChimp lists; and our Salesforce module lets you sync any entity with a Salesforce object.

Did you notice the little restriction I worked into my first two examples there? MailChimp and Registration are only for “fieldable entities”. There are a lot of reasons for this, but one of the conveniences of fieldability is that it gives you a natural place to add your entity-specific stuff, like a registration form or a MailChimp list signup dialogue: display it with field API!

Salesforce is different. It isn’t field-based. Instead, an individual “Salesforce Mapping” entity describes a synchronization relationship between a Drupal Entity Bundle (like a node content type of “Event”) and a Salesforce Object Type (like a “Campaign”): there’s no need for any entity-side configuration -- or at least, there didn’t used to be.

Recently, we began implementing a suite of Salesforce sync administration tools to help resolve the inevitable issues that arise with two complex systems trying to pass data back and forth. One of the features of this tool is the ability to change the Salesforce Object that a particular Drupal entity is connected with (change a specific Event to map to a different Campaign). Another is to view the synchronization history for any Drupal entity.

We started out by implementing a central administrative UI to provide access to locate and edit all these Synchronization Object instances.

The UI is handy: searchable, filterable, sortable. Sometimes Drupal makes stuff really easy!

Can we be real for a second, though? If I have an Event syncing with a Salesforce Campaign, and I want to look at the sync history, does it make sense for me to go to a special part of my site and track down that Event with some weird unique UI?

Hardly. Just put a tab on my Event Node, dude!

Great idea! Shouldn’t be too hard, right? We’ll just do a hook_menu, load up all our of Salesforce Mappings, and add a menu item to their Entity Bundles based on their URI:

<?php /** * Implements hook_menu(). */ function salesforce_mapping_menu() { $items = array(); // Load our Salesforce mappings and loop through: $mappings = salesforce_mapping_load(); foreach ($mappings as $mapping) { // Create a dummy entity to load the URI: $entity = entity_create($mapping->drupal_entity_type, array('type' => $mapping->drupal_bundle)); $uri = $entity->uri(); // Danger Will Robinson! $path = $uri['path'] . '%' . $type . '/salesforce_activity'; // Figure out which argument has our entity ID in it: $entity_arg = substr_count($path, '/') - 1; // Use the URI and entity arg to generate a nice menu item: $items[$path] = array( 'title' => 'Salesforce activity', 'description' => 'View Salesforce activity for this entity.', 'type' => MENU_LOCAL_TASK, 'page callback' => 'salesforce_mapping_object_view', 'page arguments' => array($entity_arg, $mapping->drupal_entity_type), ); } return $items; }

This worked great in development, but as soon as we tested on a production site, it exploded. Why? This line:

<?php $uri = $entity->uri();

Sadly, this method doesn’t work for every Drupal Entity. Nodes, for example, and Commerce Orders, don’t respond to $entity->uri(). They like:

<?php $uri = entity_uri($entity)

Grr. Ok, easy fix right?

<?php $uri = method_exists($entity, 'uri') ? $entity->uri() : entity_uri($type, $entity);

And yes, this is pretty good. But for some reason, our tab still wasn’t appearing on Commerce Orders. On closer inspection, this is the URI we were getting from our function call on Commerce Orders:

<?php array( ‘options’ => array( ‘entity_type’ => “commerce_order”, ‘entity’ => {stdClass} ), )

Notice something missing? Yeah, there’s no ‘path’ index for the next line to use:

<?php $path = $uri['path'] . '%' . $type . '/salesforce_activity';

Thanks for nuthin', flagship example of how to use the Entity system! I’m sure the Commerce team has a good reason for leaving the ‘path’ piece of URIs empty on raw Entity objects: almost all Commerce Entities behave this way. But it’s not very helpful for us!

We could potentially resolve this by loading a random object and parsing its URI's 'path' to extract an abstract version, or by offering a patch to Commerce. Perhaps the latter option would be ideal, but we decided a work-around would be more expeditious: we really don’t want to break Commerce on a live site.

Instead, we decided to override the entity data for the important entity types in a local module:

<?php /** * Implements hook_entity_info_alter(). */ function my_module_entity_info_alter(&$entity_info) { // Replace ‘commerce_order_ui_order_uri’ $entity_info['commerce_order']['uri callback'] = 'my_module_uri_order'; } /** * URI callback wrapper to ensure a proper ‘path’ index for Orders. */ function my_module_uri_order($entity) { // Call the original uri function and fix only if necessary: $uri = commerce_order_ui_order_uri($entity); if (is_null($uri)) { $uri = array( 'path' => 'admin/commerce/orders/', ); } return $uri; }

This solves the issue for Orders. A similar technique can be used for any Entity Type that fails to offer a proper ‘path’ index for its URI.

The only entities left to deal with are those that don’t offer any URI at all: entities without a direct management interface. Field Collections are a common example. Fortunately, we started out with a Universal Admin UI: it seems reasonable to hang the Salesforce Object administration interface off this Admin page. Here’s the final, complete hook_menu implementation for our Salesforce Mapping UI:

<?php /** * Implements hook_menu(). */ function salesforce_mapping_menu() { $items = array(); $items['admin/content/salesforce'] = array( 'title' => 'Salesforce Mapped Objects', 'description' => 'Manage mapped Salesforce objects.', 'type' => MENU_LOCAL_TASK, 'page callback' => 'salesforce_mapping_object_overview_page', 'file' => 'includes/', 'access arguments' => array('view salesforce mapping object'), ); // Define SF activity local tasks for all mapped entities. $defaults = array( 'file' => '', 'file path' => drupal_get_path('module', 'salesforce_mapping') . '/includes', ); $mappings = salesforce_mapping_load(); $mapped_entities = array(); foreach ($mappings as $mapping) { // We grab the bundle now because it becomes inaccessible for some entities // after it is put into the loop below: $mapped_entities[$mapping->drupal_entity_type] = $mapping->drupal_bundle; } foreach ($mapped_entities as $type => $bundle) { $entity = entity_create($type, array('type' => $bundle)); $uri = method_exists($entity, 'uri') ? $entity->uri() : entity_uri($type, $entity); // For entities without their own menu items, we hang the UI off the universal // Salesforce object admin page: if (empty($uri['path'])) { $path = 'admin/content/salesforce/' . $type . '/%' . $type . '/salesforce_activity'; $menu_type = MENU_NORMAL_ITEM; } else { $path = $uri['path'] . '%' . $type . '/salesforce_activity'; $menu_type = MENU_LOCAL_TASK; } $entity_arg = substr_count($path, '/') - 1; $items[$path] = array( 'title' => 'Salesforce activity', 'description' => 'View Salesforce activity for this entity.', 'type' => $menu_type, 'page callback' => 'salesforce_mapping_object_view', 'page arguments' => array($entity_arg, $type), 'access callback' => 'salesforce_mapping_entity_mapping_accessible', 'access arguments' => array('view', $entity_arg, $type), ); $items[$path . '/view'] = array( 'title' => 'View', 'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -10, ); $items[$path . '/edit'] = array( 'page callback' => 'salesforce_mapping_object_edit', 'page arguments' => array($entity_arg, $type), 'access arguments' => array('edit salesforce mapping object'), 'title' => 'Edit', 'type' => MENU_LOCAL_TASK, 'context' => MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE, ) + $defaults; $items[$path . '/delete'] = array( 'page callback' => 'drupal_get_form', 'page arguments' => array('salesforce_mapping_object_delete_form', $entity_arg, $type), 'access arguments' => array('delete salesforce mapping object'), 'title' => 'Delete', 'type' => MENU_LOCAL_TASK, 'context' => MENU_CONTEXT_INLINE, ) + $defaults; } return $items; }

Now we can find what we need from two natural directions: by thinking about Salesforce Sync Objects or just by thinking about the entity we want to deal with. The inconsistent responsiveness of Drupal Entities to the uri() request is frustrating, but not impossible to work around. Hopefully, you find this article helpful -- and if you maintain a module that creates its own entities, please test out the uri() function before your next release!

Categories: Elsewhere

Drupal core announcements: Drupal 8 alpha 13 on July 2nd

Fri, 27/06/2014 - 15:31

The next alpha for Drupal 8 will be alpha 13! Here is the schedule for the alpha release.

June 30th-July 1st, 2014 Only critical and major patches committed July 2nd, 2014 Drupal 8.0-alpha13 released. Emergency commits only. July 3rd-5th, 2014 Disruptive patch window
Categories: Elsewhere

Pronovix: The WalkHub distribution now has a recorder!

Fri, 27/06/2014 - 15:26

If you’ve installed your own WalkHub you’ve been able to use the Walkthrough recorder for a few weeks now. But yesterday after adding a few UX improvements we’ve now also released the Walkthrough recorder on With it, it is now extremely easy to create Walkthrough tutorials:

Categories: Elsewhere Featured Case Studies: Jewish Federation of Greater Philadelphia

Fri, 27/06/2014 - 15:16
Completed Drupal site or project URL:

The Jewish Federation of Greater Philadelphia seeks to enrich the lives of Philly’s multi-generational Jewish community. They work for social justice, educate about Jewish life and tradition, and have even strengthened the Jewish community living in Israel and around the world.

In order to better engage the community they were trying to help, the Federation needed a new website to effectively communicate their work and successes, both locally and abroad. eCity Interactive helped create and cultivate a brand identity via this website that clearly articulated the Federation’s impact on the community as well as convey the importance of getting involved, be it financially or through volunteer work.

Key modules/theme/distribution used: ZenViewsPanelsDisplay SuiteMediaFeedsLocation FeedsLocationGMap ModuleBeanProfile 2RulesSchedulerSearch APITaxonomy menuHierarchical SelectCalendarWebformWebform ReportOrganizations involved: eCity InteractiveTeam members: hessam61
Categories: Elsewhere

Pronovix: The WalkHub distribution now has a recorder!

Fri, 27/06/2014 - 15:12

If you’ve installed your own WalkHub you’ve been able to use the Walkthrough recorder for a few weeks now. But yesterday after adding a few UX improvements we’ve now also released the Walkthrough recorder on With it, it is now extremely easy to create Walkthrough tutorials:

Categories: Elsewhere

Code Karate: Drupal 7 Jammer Module

Fri, 27/06/2014 - 14:19

In this episode of the Daily Dose of Drupal we go over the Jammer module. This simply module allows you to show/hide content type elements from various roles.

Categories: Elsewhere

Greater Los Angeles Drupal (GLAD): Greater Los Angeles Drupal Partners with Microsoft BizSpark

Fri, 27/06/2014 - 11:15

We're excited to announce our partnership with Microsoft BizSpark, a program that provides support to software entrepreneurs.

For a limited time, Greater Los Angeles Drupal members can sign up and receive the Ultimate MSDN subscription (worth up to $13,000 in software licenses) and $150 / month of Windows Azure. Rumor has it that the BizSpark benefits may change in July, 2014, so we encourage you to sign up as soon as possible.

To qualify, you must be:

  • Actively engaged in development of a software-based product or service that will form a core piece of its current or intended business
  • Privately held and in business for less than 5 years, and
  • Bringing in less than US$1 million in annual revenue

This program is not for consultants or agencies. For any questions about eligibility, see Microsoft's Support & FAQs.

Inside the MSDN subscription is Azure, Visual Studio and more, all of which can be used by Greater Los Angeles Drupal startups and entrepreneurs who are developing apps (either web or mobile). If you haven't considered Azure for your startup, see the Microsoft Azure page on Wikipedia for a quick overview.

To get started, contact us and select "Microsoft BizSpark Program" on the the webform. Telling us about your startup is optional and be sure you have a Microsoft ID (,, etc.). A Microsoft representative will follow up with you with a personalized link so that you can sign up without the usual waiting period.

This is the second time Microsoft has sponsored Greater Los Angeles Drupal. In November, 2011, Microsoft sponsored Droplabs' Drupal Job Fair and introduced our developer community to their WebMatrix development tools. Thanks, Microsoft! We're grateful for your support.

Tags: MicrosoftBizSparkstartupsPlanet DrupalWebMatrixAzure
Categories: Elsewhere

Drupal core announcements: Booting D8CX

Fri, 27/06/2014 - 06:53

Now that we're nearly down to single figures for beta-blockers a few of us have started organizing around a D8CX initiative similar to that run during the Drupal 6->7 update. Talk on irc over a month-or-so led to a formal kick-off meeting to set down some goals and get some action items.

What is D8CX I hear you say

Back in the Drupal 6 -> Drupal 7 cycle the D7CX initiative promoted/assisted contrib modules porting from Drupal 6 to 7.
The CX stands for 'Contrib experience', ie its about ensuring the best contrib-module experience for building sites with Drupal 8.

Kick off meeting Attendance

Present at the meeting were Nick Waring (nickwaring89) (PreviousNext), Dave Reid (davereid) (Lullabot), Tim Plunkett (tim.plunkett) (Acquia) and myself (larowlan) (PreviousNext). Apologies were received from Angela Byron (webchick) (Acquia), Michael Schmid (schnitzel) (Amazee Labs) and Kim Pepper (kim.pepper) (PreviousNext). Although Kim did drop in for the last few minutes.


Introductions aside we turned our attention to the group's goals which were agreed as follows:

  • Promoting the status of Drupal 8 ports of key contrib modules
  • Establishing a curated list of modules to report on
  • Facilitating communication to wider the community of key contrib module maintainers' needs (eg testing, funding, sprinters)
  • Providing a centralized location/point of call for those willing to help/sponsor to make first contact

We decided that our primary objective should be to reboot a site similar to (via wayback machine). We discussed re-purposing but @webchick kindly offered the domain.

Screenshot of from Internet Wayback Machine

Proposed features

We settled on the following feature-set for the site:

  • Dashboard on home page showing status/% of modules with links to more detail
  • Call to action 'get involved'.
  • Possible 'pledge/chip-in/sponsor' links where module maintainers identify a need?
  • For each selected module
    • Status (none/dev/alpha/beta/rc/full)
    • Percent complete (manually set)
    • Status description (text)
    • Upcoming sprints
    • Links to crowd-sourcing campaign if applicable
    • How to help blurb (priority tasks)?
    • Maintainer details/bio
    • Port team/sponsor details/acknowledgements/thanks
    • Latest news/updates
  • News feed (of updates/progress) for syndication (twitter/rss)

In addition we planned to have regular (fortnightly) meetings to discuss progress.


We discussed proposed ways to promote the work being done and our status as follows:

  • post to announce initiative and goals with details on how to get involved (you're reading it - spooky)
  • Regular blog article on port status/milestones reached (eg module x reached beta) - see news feed feature above
  • Regular podcast/lightning talk? (hangouts on air) Regular catch-up with selected maintainer to flag where they're at and where audience can help?
  • @schnitzel has proposed a session on D8 Contrib Module status for a session at DC Amsterdam

One of the key items identified is that Drupal 8 might mean some significant refactoring of modules during porting. To this end a Contrib mentoring session similar to core mentoring was proposed, essentially contrib office hours where maintainers/those helping with ports can come to irc and ask questions like 'how should I do this?' 'what happened to y?' 'what's the best way to architect x?'. This is informally happening in #drupal-contribute already but a dedicated Q/A session at regular timeslot(s) via irc made sense. The caveat here would be that the knowledge captured/shared during these sessions be distilled into handbook/documentation pages and/or the examples project. Yes, you must take a blood oath to do so. Seriously.

Action items

Meeting action items were as follows:

  • Decide on a domain and organize hosting (@timplunkett).
  • Start building the site functionality (@larowlan)
  • @nickwaring89 kindly volunteered to co-ordinate site updates/collaborate with maintainers to gauge their needs/status
  • Post minutes on g.d.o/core (@larowlan)
  • Start building a list of candidate modules to report on(@davereid, @kim.pepper)
  • Assess state of upgrade status for support querying 8.x status (@larowlan, @webchick)
  • Reach out to other large Drupal shops/service providers to seek their involvement in the initiative (@timplunkett, @kim.pepper)
  • Reach out to module maintainers of modules identified(@nickwaring89)
Next meeting

Next meeting 10pm UTC Wednesday 9th of July. This is a rough time-slot for European community members but falls around 8am for Australia and at the end of the working-day for the US. We aim to move to a rolling schedule that would allow the three time-zones of participants (Europe, US, Australia) to be able to reasonably attend two of every three meetings.

Want to get involved?

Get in touch with nickwaring89 to register your interest in getting involved.

AttachmentSize Screenshot 2014-06-27 14.23.17.png88.72 KB
Categories: Elsewhere

PreviousNext: Linking to revisionable files in Drupal 7

Fri, 27/06/2014 - 02:51

Our client had some very specific requirements for their project. They needed to be able to insert links to files and they needed to keep the same URL for those files even if the file changed. Those familiar with Drupal will know that by default, Drupal will suffix the newer version of the filename with _0, _1 etc which obviously breaks the URL. Here's how we worked around the issue...

Categories: Elsewhere

Exaltation of Larks: Weaving Community with TimeBanks USA: Drupal and Time-Based Alternative Currencies

Thu, 26/06/2014 - 21:50

TimeBanks USA is a 501c3 nonprofit organization that promotes and supports timebanking. Timebanking was created by Dr. Edgar S. Cahn, who founded TimeBanks USA in 1995.

Timebanking is a tax-exempt alternative currency system that works like this: if I spend one hour helping you build your website, I earn one credit, or time dollar. You can then turn around and exchange that time dollar by giving it to someone who fixes your refrigerator, coaches you on your resume, or gives you a ride to the airport.

The possibilities are endless,” according to TimeBanks USA. “An hour of gardening equals an hour of childcare equals an hour of dentistry equals an hour of home repair equals an hour of teaching someone to play chess.” It’s different from bartering, because this type of timebanking is based on services (and not goods) between members of a network.

This wasn’t the first time Exaltation of Larks has worked with alternative currencies. We created a virtual economy for Digital Dollhouse, a casual game where girls are empowered to become their own interior designers. In this virtual world, it’s possible to trade or regift items like dolls, plants and pets, and work with an in-game currency named ddCoins.

In addition to our work with TimeBanks USA, our experience with timebanking includes working as volunteers with two Los Angeles-area timebanks: Arroyo S.E.C.O. Time Bank and the West LA timebank cleverly named Our Time Bank. Our Time Machine project is an experimental Drupal installation profile for communities and organizations looking for turnkey timebanking software for their members and participating businesses and organizations.

TimeBanks USA founder Dr. Edgar S. Cahn has spent more than four decades striving for social justice. He began his career working for the Kennedy administration, focusing on alleviating poverty and hunger. He then opened the Citizens Advocate Center, an organization dedicated to protecting the rights of community groups as they interacted with the government. In 1972, Dr. Cahn founded the Antioch School of Law, whose curriculum was designed to teach students to practice law for the greater good of society.

Here at Exaltation of Larks, we have enormous respect for Dr. Cahn: at the age of 80, he is still a rabble-rouser and hell-raiser who is fighting to change the world, and we’re proud to provide him with the technical assistance to further this goal. Dr. Cahn is a true visionary and we hope to work with — and write about — him and his partner, Chris Gray, TimeBanks USA’s CEO, more in the future.


TimeBanks USA supports timebanking in myriad ways, including offering onsite trainings nationwide; organizing an annual timebanking conference; hosting webinars and teleconference calls; and consulting individually with clients. The organization helps members connect with local timebanks or create their own.

One of the parts of TimeBanks USA infrastructure is a large scale social networking platform named Community Weaver, which has a software-as-a-service subscription model. There are more than 400 timebanking websites all around the world that rely on it to help manage and organize their timebanking processes, community activities and other needs.


Exaltation of Larks performed a substantial security and performance audit on Community Weaver, a complex Drupal multisite system. We helped TimeBanks USA fix critical issues affecting one of their essential online organizational tools — their Community Weaver software. This software platform runs a quickly evolving and iterating network of Drupal websites, so it was vital that the software could be updated and developed sustainably and seamlessly, yet without overriding the autonomous decision-making processes of each chapter website.

In addition, we worked with TimeBanks USA to develop a project plan for version 3.0 of Community Weaver and raise the funds to build it; we addressed problems arising from the system’s simultaneous use of both WordPress and Drupal; and we helped streamline the organization’s decision-making process.

TimeBanks USA needed extensive rework on their Community Weaver software, specifically with regard to security, performance and usability issues. Community Weaver is an online organizing and tracking tool for timebank members: it records time exchanged, displays service offers and requests, keeps track of memberships, and displays announcements for the community. Any local timebank can subscribe to TimeBanks USA’s software-as-a-service (SaaS) system to manage their members’ work. TimeBanks USA hired Exaltation of Larks to audit and rework Community Weaver 2.0, with the plans to eventually migrate all their technology, online memberships and e-commerce data to version 3.

TimeBanks USA was also experiencing security problems with its self-hosted WordPress website, which was outside our original scope of work. TimeBanks USA used our emergency support system and we quickly mobilized to resolve this new issue. We determined that security had been compromised and implemented several solutions to tighten it up, from checking the code integrity to updating MySQL access and hardening file permissions.

In addition to our work with TimeBanks USA, we worked with the Arroyo S.E.C.O. Time Bank, one of the many timebanks affiliated with TimeBanks USA. Arroyo S.E.C.O. serves neighborhoods in the eastern and northeastern Los Angeles area, which meant the Larks who were in the Downtown Los Angeles area could work with them one-on-one.


We began by tackling the security issues found in Community Weaver. Fortunately, TimeBanks USA had an in-house Drupal developer, who we worked with on a massive infrastructure audit, focusing on security and performance. This multisite installation had been built by its previous developer with development practices that were common in 2007, before Features and configuration-in-code became popular. We identified which multisite instances had been modified by their local chapters’ coordinators — which meant examining data structures, views, and content types across hundreds of Drupal websites — and which had unsafe code or configuration. We found security vulnerabilities through the entire stack, from the Drupal systems and websites down to the server operating system, all of which we documented, prioritized and / or resolved.

This was an extensive audit that had both technical and political ramifications. Each chapter is run by its coordinators and volunteers and sometimes in completely different ways than other chapters. In a multisite environment, making technical decisions for the entire fleet of hundreds of websites would impact all local chapter websites that had been modified for their own business cases.

We worked in conjunction with TimeBanks USA to devise policies and joined them on many global community conference calls — open to all coordinators of all the timebanks in the world — to describe our technical approach and to solicit feedback. Our task was to provide technical leadership for the entire organization. We needed a set of standards for sustainable development of this enormous network, but we also needed to respect each individual chapter’s right to make its own decisions.

The project plan we provided included time estimates to address the security problems we found. TimeBanks USA’s tech coordinators reviewed our list of most-needed fixes and then we consulted with a local timebank coordinator and Community Weaver user to make sure these fixes matched their timebank’s list of essential tasks.

We worked with several popular web hosting providers, including Drupal-as-a-service platform companies, to negotiate competitive pricing on behalf of TimeBanks USA. Due to their unique system and web application architecture, we recommended SoftLayer based on their features and pricing.

The unfortunate multisite architecture that the prior developers had devised had the result of creating exponential complexity precluding any proper maintenance and further development on the system. We navigated our way through thousands of lines of uncommented custom code. We also found that the Linux server environment was an abandoned and unsupported custom distro. In both cases, we replaced as many unknown components as possible with stable, peer-reviewed alternatives and we documented the rest. We also stabilized the system by locking down the kinds of changes that individual coordinators could make to their individual timebank chapter websites, thus reducing future maintenance costs.

We fixed several security issues in the system by altering file permissions, MySQL accounts, and text input filters. We used PHP Filter Lock, a module we developed that disables the text form fields that contain PHP code, thereby mitigating the risk of CSRF and XSS security threats on websites that have the core PHP Filter module enabled.

On the same server as the Drupal multisite network was a WordPress marketing website. This in itself is not a problem. Exaltation of Larks’ position is that WordPress is great for simple websites and Drupal is great for complex systems and web applications. Having both on the same server created unnecessary security issues, however. The WordPress installation was technically able to overwrite anything on the Drupal side as well as access the Drupal database. We changed all MySQL usernames and passwords and locked down the file permissions so that the WordPress website could no longer be overwritten or be a risk to other software on the server, including Community Weaver.

Next, we worked with TimeBanks USA to develop the requirements for the next version of Community Weaver. The materials we developed included specifications for a fully featured mobile app, a business plan with financials and pitch deck, and more, and were designed to help TimeBanks USA secure additional funding. In the meantime, we trained a member of their community to maintain the software so they could further reduce their total cost of ownership.

Exaltation of Larks also provided TimeBanks USA with communications strategy consulting services. We performed a 360-degree organizational audit and came up with a more streamlined decision-making process. We created flowcharts of all the key players and stakeholders at TimeBanks USA and highlighted the points at which they had both strengths and weaknesses, and made recommendations where more efficiency was needed.


Timebanking has evolved very differently in other parts of the world in ways that no one could have predicted. Nowhere is this emergent behavior more apparent than in highly populated cities, where the numbers, density, and different practices around timebanking create vastly different needs. One such advanced timebank is the Arroyo S.E.C.O. Time Bank in Los Angeles, which has thousands of members across dozens of separate neighborhoods. They needed several custom workflows implemented on their individual timebanking website to manage the scale that had resulted from their impressive growth. By its very nature, the timebank had no money for further development on their individual website.

Barnraisings are a concept taken from Amish culture, where the community comes together to build a barn for a newly married couple who wouldn’t be able to afford the time or expense of building a barn on their own. In the context of web development, barnraisings are like code sprints where the programming community gets together with a deserving nonprofit, and works with them to create or improve their software. For the development community, this is a teaching experience, and newer developers get to learn from seasoned veterans about client relationships, requirements gathering, project planning and the tools used for effective teamwork. The nonprofit brings food — usually excellent food — and everyone benefits.

Starting in April, 2012, the Larks partnered with Droplabs and arranged three separate barnraisings to build new features for the Arroyo S.E.C.O. Time Bank. Not only was a good time had by all, the team built functionality that the Larks turned into Features-based modules that could then be securely distributed to the other timebanks, to be turned on, or not, according to the wishes of each individual timebank coordinator. Features built included a custom registration workflow, neighborhood-specific blogs, and structured data types for content, among others.


Previous to Exaltation of Larks coming on board, TimeBanks USA had been working with a different development company. The Community Weaver software proved challenging to rework and over the 2 years we worked together we ensured that key security and performance problems with the software were resolved.

TimeBanks CEO Chris Gray says of the project: “Given the importance of the software for the mission and vision of TBUSA, and given how much we had to learn, this was a very intense experience for us.”

In addition, with the help of the volunteers at the barnraisings, we added several new features to the Community Weaver software, including a blog post content type and RSVP feature that integrates with the Signup module. These features directly benefit all the hundreds of TimeBanks chapters around the world that use the same Drupal distribution of Community Weaver.

“All members of the Larks team, from the principals to the project leader to the programmers, demonstrated that they cared deeply about the quality of the work undertaken,” Chris Gray said. “[They] provided many hours of consultation to this endeavor. We are truly grateful for those contributions. Under challenging circumstances, they provided highly professional services to TBUSA. We greatly appreciate the professionalism of the Larks and the ongoing willingness to go above and beyond.”

read more

Categories: Elsewhere

Chapter Three: Branch Naming

Thu, 26/06/2014 - 18:07

Having a good workflow is important. A workflow that is repeatable and consistent makes your life easier.

I create a branch for every Drupal core issue that I work on and use the issue’s node id as a branch name. For example:

git checkout -b 2284103

This system has many advantages, especially if you work on multiple patches. It’s also quite easy to implement. If you are reading an issue on, you already have the branch name. From there, it’s as simple as copying and pasting from the url. If you have git shell completion installed, you can change your command prompt so that you know which issue you are working on by glancing at the terminal prompt.

Categories: Elsewhere

Acquia: Closing the Drupal Education Gap

Thu, 26/06/2014 - 16:56

Demand for Drupal talent is high… Really high. A good Drupaler can find work on some of the most notable sites in the world next to other great minds and in good working conditions. Drupal is taking the world by storm, converting government agencies, Fortune 500s and many more on a daily basis. But this popularity has come at a price. The existing talent pool is just too limited to support Drupal’s popularity without serious investment in developing a greater pool of talent, and that something the existing community has got to own and make happen.

Categories: Elsewhere

Acquia: So What is Acquia Lift, Anyway?

Thu, 26/06/2014 - 15:29

I’ve spent a disproportionate amount of my time over the last year thinking and talking about Personalization in Drupal (just ask my wife), and I’ve had the privilege of working with a brilliant group of people to help design and build a solution for it. Since we launched Lift in February, I’ve also given a large number of demos and discussed Lift in great detail with organizations large and small, learning ever more about what the needs are in the market, and stealing..err..borrowing ideas from them as I go along.

This post marks the first of a multi-part blog series where I hope to distill everything I know about Acquia Lift as a product, as well as personalization, testing and targeting more broadly as we implement these tools.

Categories: Elsewhere

Acquia: Gábor Hojtsy: DevDays Szeged and the new wave of contribution in Drupal

Thu, 26/06/2014 - 14:51

Gábor and I sat down for a chat at United Nations headquarters at NYCCamp in April 2014. We talked about the very productive contribution sprints at the NYC Camp; effecting positive change in the world with technology and how Drupal 8 will enable anyone to communicate using tools in their own language; and the incredible energy and quantity of contributors at the Drupal DevDays in Szeged Hungary.

Categories: Elsewhere

Drupal Easy: Drupal Web Developer Career Series Post 1: Drupal Jobs Landscape

Thu, 26/06/2014 - 12:53

DrupalEasy was really jazzed to host the career how-to session with community leaders, living Drupal success stories, and a panel of talent-hungry recruiters from Drupal organizations around the world At DrupalCon Austin. Drupal Career Trailhead; Embark on a Path to Success provided so much great information on mapping out your Drupal Career, and so many people asked about follow up, that we realized it warranted some further dissemination.


read more

Categories: Elsewhere

There is a module for that!: A recipe for extending Views handlers without subclassing

Thu, 26/06/2014 - 08:41

One of my long-standing gripes with Views is the inability to alter the behaviour of existing Views handlers (e.g. fields, filters, etc.) without having to subclass the desired handlers to add new functionality. While the subclassing approach is fine when the functionality targets a new field type, it is not ideal if the change required should affect existing fields, across different types of handlers.

I was recently commissioned to create a module that displays tooltips on field headers, regardless of field type.

read more

Categories: Elsewhere

Modules Unraveled: 112 Kalabox 2.0 with Mike Pirog - Modules Unraveled Podcast

Thu, 26/06/2014 - 07:00
Published: Thu, 06/26/14Download this episodeKalabox
  • What is Kalabox?
  • How is it different from MAMP, Aquia Dev Desktop, etc.?
  • What comes with Kalabox?
  • How does it work?
  • What if a shop already has a stardard set of tools? How difficult is it to start using Kalabox?
  • Some VMs get slow when you run more than one at a time, how does Kalabox scale/perform?
  • How does it integrate with Pantheon?
    • Can you pull cone from dev and database from live?
    • Are you planning to integrate with other platforms?
    • Are you planning/willing to work directly with other providers like #AberdeenCloud to build their integration plugin?
  • What’s different in the 2.0 verson?
  • You’re running a kickstarter. Tell me about that.
Use Cases
  • Things
Episode Links: Mike on drupal.orgMike on TwitterKalabox 2.0 KickstarterKalabox 1.x on GitHubKalamunaTags: 
Categories: Elsewhere

Drupal core announcements: This month in Drupal Core (June 25, 2014)

Thu, 26/06/2014 - 06:19

Note: We've renamed this post series to Drupal Core Updates since, well, you know, they weren't exactly weekly to begin with. (As always, contact xjm if you'd like to help write them!)

What's new with Drupal 8?

We may have been quiet for the past month as we prepared for -- and then recovered from -- DrupalCon Austin, but core development has been sizzling! (And not just because of the Texas climate.)

Photo credit: pdjohnson

DrupalCon Austin sprints

In addition to all the great sessions (videos below), summits, BOFs, and trainings, Austin included six full days of sprints on everything from Drupal 8 release blockers, frontend, and APIs, to D8 contrib initiatives like #d8rules, the Examples D8 port, and D8 Media, to itself. Nearly 500 sprinters and mentors got involved on the main Friday sprint day, and over 100 sprinters participated in the extended sprints before and after the Con.

If you were at the sprints, you might have noticed a few goofy sprinters decked in rabbit ears. :) These indefatigable contributors were working on some of the very last Drupal 8 beta blockers. During Austin, we managed to resolve six of these issues, but more importantly, we identified the path forward in all the beta blockers we didn't fix as well.

Done > Perfect

The past month also showed a shift in the community's outlook: It's time to get Drupal 8 done. We need to stop making large, non-essential changes, because every time we make more work for ourselves, we delay the release of 8.0.0 for hundreds of thousands of people. When we have a choice between doing something quickly and imperfectly, or slowly and perfectly, it's time to pick the quick, imperfect fix. A couple examples:

  • Last month, we discovered that Drupal 8's new support for PHP INTL dates was badly broken. Instead of spending dozens of hours trying to resolve this issue before releasing a beta, we removed the feature. It did not exist in D7, and it can be added back for 8.1.0, or provided by a contributed module.
  • In Drupal 8, comment fields can now be attached to any entity type, instead of just nodes; however, they don't work on entity types with non-numeric ID keys (contact forms are the only example in Drupal 8 core). Instead of holding up the release on making every fieldable entity type commentable, we settled for almost every entity type being commentable -- which is still a big improvement from D7.

Drupal 8.0.0 will not be perfect, but it will be powerful. And we have the chance to make it even better in 8.1.0 six months later. Think about which issues in the core queue might make sense as minor version targets, and help us work on Drupal 8 efficiently.

Photo credit: Michael Schmid. Help us battle Lord Over-Engineering!

Drupal 8 documentation updates on

Lots of comprehensive API documentation has been added to the handbook page over the past month, thanks especially to API documentation maintainer jhodgdon and review efforts from core component maintainers. This overview page (and the detailed documentation linked from it) should provide a much better starting point for learning about Drupal 8. (See below for how you can help document the remaining API topics.) has also recently added an automatic list of services provided in Drupal 8 core. For updates on Drupal documentation work, see This Month in Drupal Documentation.

Where's Drupal 8 at in terms of release?

Last week, we fixed 9 critical issues and 10 major issues, and opened 4 criticals and 6 majors. That puts us overall at 92 release-blocking critical issues and 595 major issues.

2 beta-blocking issues were fixed last week. There are still 11 of 172 beta blockers that must be resolved before we can release a Drupal 8 beta.

Where can I help? Top criticals to hit this week

Each week, we check with core maintainers and contributors for the "extra critical" criticals that are blocking other work. These issues are often tough problems with a long history. If you're familiar with the problem space of one of these issues and have the time to dig in, help drive it forward by reviewing, improving, and testing its patch, and by making sure the issue's summary is up to date and any API changes are documented with a draft change record.

  • #2238217: [Change record] Introduce a RouteMatch class

    The one reasonably approachable task in this week's top beta blockers is to complete the needed change record documentation for the recently added RouteMatch class. Help by writing a draft change record for the issue, and then update existing change records to also include an issue reference to #2238217 and to use the new API. (See comment #143 on the issue for a start.) Post links to the revision diffs for your change record updates so they can be reviewed by other contributors.

  • #2256521: New plan, Phase 2: Implement menu links as plugins, including static admin links and views, and custom links with menu_link_content entity, all managed via menu_ui module

    This massive (nearly 600 K) improvement to the Drupal 8 menu link API resolves or unblocks numerous critical issues while also supporting performance, DX, and multilingual improvements. The patch is developed from a sandbox:
    git clone --branch 2256521
    Help this issue by:

    • Providing code additional reviews, since the patch is way too big for any one contributor to review in one sitting.
    • Proactively identifying things in the patch (or from others' reviews) that could be resolved in followup issues, filing those followup issues, and adding the appropriate code @todo and links to the followup issues.
    • Looking through the patch and issue to identify the complete, specific API changes it introduces, and adding these changes to the issue summary.
    • Checking for existing change records that will need to be updated for these API changes, listing the updates that will be needed in the issue summary, and editing the change records to add a reference to #2256521.
    • Drafting a new change record for the change.

    Check with Wim Leers, pwolanin, or dawehner so that you can align your efforts with their work on this patch.

  • #2144263: Decouple entity field storage from configurable fields

    This issue is key to completing the Drupal 8 Entity Field API and is the culmination of work done across DrupalCons Portland, Prague, and Austin. The patch needs test failures resolved, architectural review, and (as above) identification of any needed change record updates. Coordinate with Berdir, plach, or yched to help further with this issue.

  • #1825952: Turn on twig autoescape by default.

    Enabling Twig's built-in autoescaping of HTML-unsafe code will security-harden Drupal 8, and should eventually allow us to reduce complexity and improve perfomance in the theme layer. The patch introduces a SafeMarkup class that can be used to identify sanitized strings for use in templates, and all other strings are automatically escaped. Help with this patch by providing feedback to points raised in recent reviews (see comment #185), helping write thorough API documentation for the SafeMarkup class, or starting a draft change record. Contact xjm to help out with this issue.

Photo credit: Michael Schmid

More ways to help
  • We're closing in on Beta 1!

    Only 11 beta-blocking issues remain, and we will probably be in the single digits by the end of the week. This means now is a good time to start looking at all the beta targets and especially issues with a beta deadline. (See Beta blocker deadline target what? for an explanation of these issue categories.) Keep an eye out for other issues that should have a beta deadline as well.

  • #2148255: [meta] Make better D8 api.d.o landing page, linked to high-level overview topics, and put it in Core api.php files

    Help improve our Drupal 8 API documentation! The menu and routing topic needs review, and we also need first drafts for the REST, Migration, and Ajax documentation topic updates.

  • #1971384: [META] Convert page callbacks to controllers

    We converted all of core to use our new routing system last fall, but eighteen different form and page controllers still need to be cleaned up to conform to our best practices. Currently, almost all of these patches need to be rerolled for PSR-4 and for other core changes. Note, however, that many of these patches have gone through multiple rerolls (mostly by novice contributors) over the course of more than a year, without sufficient review before the patches become stale. So, what these issues need most is 1-2 experienced contributors with an understanding of Drupal 8 architectural concepts who can manage the meta issue and its children, and provide thorough code review when new patches are submitted. If you can help out, start by reviewing those child issues still at "Needs review".

  • #2016679: [Meta] Expand Entity Type interfaces to provide methods

    Drupal 8 core provides numerous entity types, but the full public API for each type is not easily documented or discoverable. To improve the developer experience, each entity type interface is being expanded with relevant methods for the specific entity. Most issues have a submitted patch, and what is most needed is architectural review of the proposed interface methods, including recommending which properties should instead be protected. If you have experience with one of the subsystems that still has an open child issue, or if you have a sound grasp on OO design generally, we could use your help to thoroughly review these patches so that the completed APIs are available for contributed module developers in a beta release.

As always, if you're new to contributing to core, check out Core contribution mentoring hours. Twice per week, you can log into IRC and helpful Drupal core mentors will get you set up with answers to any of your questions, plus provide some useful issues to work on.

You can also help by sponsoring Drupal core development.

Notable Commits

There have been a remarkable 360 commits since our last post in May! Far too much great work has been done across D8 core to summarize it all, but here are a handful of the more "epic" beta-blocking issues that were recently resolved:

  • Issue #2224887 by alexpott, Berdir, Gábor Hojtsy, Jalandhar: Language configuration overrides should have their own storage.
  • Issue #2247991 by xjm, typhonius, donquixote: [May 27] Move all module code to PSR-4.
  • Issue #2183231 by tstoeckler, plach, jessebeach, fago, Berdir, xjm, mauzeh: Make ContentEntityDatabaseStorage generate static database schemas for content entities.
  • Issue #2143291 by plach, alexpott, xjm, effulgentsia, pwolanin, swentel | yched: Clarify handling of field translatability.
  • Issue #2167167 by Berdir: Remove field_info_*().
  • Issue #2238217 by effulgentsia, neclimdul, martin107, tim.plunkett, cweagans, kim.pepper, xjm: Introduce a RouteMatch class.

You can also always check the Change records for Drupal core for the full list of Drupal 8 API changes from Drupal 7.

Drupal 8 Around the Interwebs

If you didn't make DrupalCon Austin -- or even if you did -- be sure to check out all the Drupal 8 session recordings. Some highlights:

Seen enough videos now? Looking for something to read instead? webchick's ongoing blog series, the Ultimate Guide to Drupal 8, is a great resource for everything you might want to know about D8 improvements.

Drupal 8 in "Real Life"

It's a sprint-filled summer!

Whew! That's a wrap!

Do you follow Drupal Planet with devotion, or keep a close eye on the Drupal event calendar, or git pull origin 8.x every morning without fail before your coffee? We're looking for more contributors to help compile these posts. You could either take a few hours once every six weeks or so to put together a whole post, or help with one section more regularly. Contact xjm if you'd like to help communicate all the interesting happenings in Drupal 8!

Categories: Elsewhere

Lullabot: CSS Regression Testing with Resemble.js

Wed, 25/06/2014 - 22:00

Roughly a year ago Alex Sexton's Smashing Magazine article highlighted a new role emerging amidst the increasing complexity of front-end work in a responsive world: Front End Ops. Since that article was published, there's been an entire conference devoted to the subject, and folks like Chris Rupl have evangelized similar roles and supporting tools to the Drupal community.

Categories: Elsewhere

Appnovation Technologies: First Thoughts on and 4 Tips for Drupal Development

Wed, 25/06/2014 - 17:47
Coming in to Appnovation as a Co-op student, I hadn’t had much exposure to Drupal before. This meant my training not only involved getting to know how the company works, but also how Drupal works. Below are some of the main things I learned during my training in Drupal at Appnovation. var switchTo5x = false;stLight.options({"publisher":"dr-75626d0b-d9b4-2fdb-6d29-1a20f61d683"});
Categories: Elsewhere