Skip to Content


Drupal Association News: Introducing the User Personas

Planet Drupal - 14 December 2014 - 11:15am

As part of our mission to reinvent, we’ve been digging deep to understand who uses the website and how. At DrupalCon Austin, we began the process of discovering the personas of users who visit to do so, we interviewed numerous users and asked questions about how frequently they use, how they use the website, their frustrations with, the things they enjoy about the site, and how we can make it easier for people to learn, use, and connect on

Once we had that data, we set about looking for patterns and common themes. We built categories where we grouped people's similar experiences and frustrations together, and at the end of the process we had come up with five distinct personas that can apply to everyone who visits These personas detail our users’ familiarity with Drupal software and Drupal community, how they use, how they contribute (or don’t), and more.

The five personas that we drew up are based on proficiency in Drupal and the Drupal ecosystem. They are:

  • Newcomer: This person has heard of Drupal, but has never built a Drupal site and doesn’t know where to start.
  • Learner: This person knows a bit about Drupal and the general Drupal ecosystem. He or she may have built a Drupal website, but likely has used only a few contrib modules and hasn’t made any customizations.
  • Skilled: This person understands and is fluent in Drupal-specific terminology, can build a Drupal website themselves using contributed modules, themes or distributions, or with the help of Drupal service providers. She or he has spent a decent amount of time working with Drupal, and is lightly engaged with the community, often not directly, via some sort of liaison.
  • Expert: This person has a deep understanding of Drupal and the Drupal ecosystem, knows how to build advanced websites with Drupal. Expert typically has been working with Drupal for at least a couple of years, is actively engaged with the community online and via local/national events, and actively contributes back in a variety of ways.
  • Master: This person has pervasive knowledge of Drupal and the Drupal ecosystem. He or she knows how to build Drupal websites of great complexity, is deeply engaged in the Drupal community, knows and has access to other Masters. Usually this person has been using Drupal and been around the Drupal community for a long time.

Proficiency-based personas are a new facet through which we can look at our community. It’s important to note that these personas are NOT only about developers. All kinds of roles can be on different levels of this ladder — UX designers, project managers, and business owners can be Experts and Masters, just like developers and themers. Simultaneously, people can have different backgrounds and be experts in other areas, but when it comes to fluency in Drupal and Drupal ecosystem, they would be represented as Newcomers, or Learners, or any of the other personas.

How will we use personas?

User personas will guide feature prioritization and feature development for, as we improve the site to make it easier for our users to progress from Newcomers to Masters. There are a variety of different ways we can go about it, but since our resources are limited, we will focus on just a few critical areas that will have the biggest impact on the overall user experience. So, to start our work, we’ll be focused on removing barriers and helping our users move more easily from Learners to Skilled. We found that our users have great success moving from Newcomer to Learner today, whereas moving from Learner to Skilled is much more difficult, since so much of the project is focused on doing things “the Drupal way” and learning the processes. Our secondary focus will be on moving users from Skilled to Expert.

Growing our pool of Skilled users is crucial, because by doing so we grow the number of people who own and/or build websites using Drupal, thus grow Drupal adoption. On the path from Skilled to Expert is when our users begin to give back by contributing patches, writing documentation, building and sharing modules and themes, helping others in the issue queues, and bringing in their friends. By growing the number of Skilled and Expert users on, we’ll directly grow our community. It’s a win-win.

By growing Drupal adoption and growing our community, we directly support our mission and goals as an organization (you can read more about those in our 2015 Leadership plan and budget), and that’s why improving is one of our organizational imperatives in the coming year. The 2015 roadmap outlines the numerous ways we’re planning to do it.

As we use personas in our work, you may hear us refer to our “Primary” (Learner and Skilled), “Secondary” (Expert), and “Tertiary” (Master and Newcomer) personas — these distinctions correspond to the order of conversions we look to make easier, not to the users’ importance. Every user is important to us!

As we modify, we’ll be using the personas to help us make the experience for the whole community better. After all, that’s what these personas are — a representation of the entire Drupal community. To help bring our personas to life, we talked to five different community members, each representing one user persona. Over the next few days we’ll share the stories of each person’s unique Drupal journey so that we can see how they got to where they are now. We’d like to say a big thank you to each of our volunteers for sharing their personal stories — as always, they’ve reminded us how fantastic our community really is.

At the end of the series, we’ll close it all off with interviews with several prominent community members who will share their views on how personas can be used outside of development.

We enjoyed working on the user research project and are excited to share user personas with the Drupal community. As a reminder, you can view and download the full report. Take them, use them, go out and make great things!

Personal blog tags: user research
Categories: Drupal

Friendly Machine: Drupal 8 and Backdrop CMS - A Brief Comparison

Planet Drupal - 14 December 2014 - 9:28am

I recently had the opportunity to see Nate Haug deliver a presentation about the Backdrop CMS project and it's upcoming 1.0.0 release (Jan. 15). It had been a while since I had taken a look at Backdrop and I came away quite impressed with both its progress and direction.

Many of you reading this will be familiar with Backdrop, but for those of you who haven't heard of the project, it is the first fork of the Drupal project, and the source of a great deal of controversy and angst in the Drupal community.

Backdrop has been perceived as a threat by many Drupalists, but I think as we step through the features and approaches of the two projects, those fears will be at least somewhat allayed. My own take is that the two systems seem complementary instead of competitive.

As a bit of background for the origin of Backdrop CMS, Nate told the story of his reaction to the massive changes in Drupal 8. He realized that his own business,, was going to have major issues with the upgrade path.

It was going to take a huge effort to upgrade his site - we're talking many, many months - to simply replicate the work he had already done in Drupal 7. He didn't want to throw away the huge investment he had already made in his business and start over. His solution to the problem was forking Drupal to create Backdrop CMS.

And then...all hell broke loose.

Feature Comparison

I'll set the controversy behind Backdrop aside and get straight into a comparison of the features. Keep in mind, however, I'm using the term "features" here a bit loosely. That's because I also want to talk about how Backdrop is managed as well as other differences between the two projects. This list is not exhaustive. It just has some of the things that seem to me the most significant or interesting.

Target Market

I know many will squirm uncomfortably when I say this, but the target market for Drupal 8 is large enterprises. By contrast, the target for Backdrop is small to medium size businesses and non-profits - really the original market of the Drupal project. As we go through this list, you'll see how this targeting plays out in some of the decisions the two projects have made.

Configuration Management

This has been widely touted as the killer feature of Drupal 8. If you've dreamed of having all the cool configuration management features in D8 available for Drupal 7, then Backdrop may be tempting because that is essentially what it offers. Instead of using YAML files to store configuration data, however, Backdrop uses JSON. Otherwise, it's pretty much the same.


Another one of the major additions to Drupal 8 is the Twig template engine. This is a big plus for many front-end folks and it's something that is not available in Backdrop at this time - and I'm not sure I would look for it in the near future. Backdrop currently uses the Drupal 7 PHPTemplate theme engine.

Responsive Images

As a front-end developer, I have a particular interest in this one. Drupal 8 includes the Responsive Image module, which is essentially a reworking of the Picture module in D7.

At this writing, Backdrop doesn't have a responsive image solution. I asked Nate about this and he's not a fan of the Picture module approach (he favors using srcset, something that may possibly be added in versions 1.1 or 1.2 of Backdrop), so if that is something you require, it will need to be added as either a custom or contributed module.

Contributed Modules

Speaking of contrib, most of you reading this will be familiar with Drupal's massive collection of contributed modules. The contributed modules for Backdrop CMS will be hosted on GitHub and managed similar to how the jQuery project organizes its plugin registry. I don't think there have been any ports as of yet (all the energy is going to the 1.0.0 release), so this is pending.

Some of you may have heard that Drupal 7 modules will be compatible with Backdrop. This isn't true, primarily due to modules needing to be rewritten to support configuration management. Porting a Drupal 7 module should be fairly straightforward, however. Instead of storing config in the variables table, it needs to be in JSON files. Here's a video that will help get you started.

As a quick aside, having Backdrop (and eventually the contrib modules) hosted on GitHub seems like it will be a more familiar and friendly environment for potential project contributors.

Project Organization

The "do-ocracy" that is the Drupal project has been much discussed lately. Nate has organized the Backdrop CMS project along the same lines as the Project Management Committee of the Apache project. That was very wise in my opinion. It bodes well for the project.


Another really nice thing in Drupal 8 is the inclusion of a default WYSIWYG editor. Love them or hate them, virtually every client wants one, so now with D8 you won't have to add one yourself for every project. As of version 1.0.0, Backdrop doesn't have this functionality, but look for it in version 1.1 or 1.2.

I remember Nate saying something about it being ironic that Backdrop was launching both without Twig or a WYSIWYG since he and Backdrop co-founder Jen Lampton had been instrumental in bringing those to Drupal 8.

I suppose I should mention that Backdrop minor versions - from 1.0 to 1.1, for example - will occur regularly at an interval of about three or four months. So for the features mentioned that may be in version 1.1 or 1.2, it means they can be expected in either late spring or late summer.

Panels and Views

How about Panels and Views in core? Yeah, I like it! And that's what you get with Backdrop. Drupal 8 provides Views in core, but not Panels. It may be a while before Panels is ready for D8, but it may also be a while before D8 is ready, so I guess that's not a problem.

System Requirements and Backwards Compatibility

It may seem odd to group these two, but this is one point where the intended audiences (enterprise vs small organizations) are put into stark contrast. For example, Backdrop is intentionally friendly to cheap hosting. Drupal 8, by contrast, is almost certainly going to use more server resources than Drupal 7, potentially causing issues for those on shared hosting plans. 

For large organizations, the cost of hosting is not a big deal, but for some small organizations, it can be. So a solution architected to work well with limited resources may be attractive and also serves to highlight the different approaches between the two projects.

With backwards compatibility, we see the same philosophical divergence. Drupal has never focused much on backwards compatibility, making it a pain in the ass (and often expensive) to upgrade across major versions. The benefit of that approach is that Drupal has been able to innovate without being constrained by past decisions.

Backdrop, however, places a lot of value on carefully managing change so that existing sites can be upgraded affordably. I would recommend looking at Backdrop's philosophy, because it's there where you really find the motivations for the project and how it differs (and will differ more in the future) from the Drupal project. From system requirements, to upgrade path, to reaching out to hear voices not found in the issue queue, Backdrop CMS is consistently friendly to the needs of the little guy.

Wrap Up

Again, this isn't a comprehensive list of all the features or differences between the two systems. There is an issue on GitHub that might be of some help in learning more as well as this Drupal 8 feature list.

To me, these two projects don't compete with one another. Sure, some enterprises may use Backdrop and many small organizations may use Drupal 8. But really, the changes in Drupal 8 are a move toward the enterprise and the talk around Drupal 8 has reinforced that message. Having an alternative for small organizations on a budget and with a need to preserve software investments isn't a bad thing.

You may politely leave any comments below.

Categories: Drupal

Paul Booker: Updating a user role when a class (group) is flagged as finished

Planet Drupal - 14 December 2014 - 5:38am
function mymodule_training_class_node_form_submit($form, &$form_state) { if ($form_state['input']['field_class_is_finished']['und'] == 1) { $nid = $form_state['values']['nid']; $query = db_select('og_membership', 'ogm') ->condition('ogm.gid', $nid, '=') ->fields('ogm', array('etid')); $result = $query->execute(); foreach ($result as $record) { $uid = $record->etid; _mymodule_training_class_assign_alumni_role($uid); } } } function _mymodule_training_class_assign_alumni_role($uid){ $rid = db_select("users_roles", "ur") ->fields("ur", array("rid")) ->condition('ur.uid', $uid, '=') ->execute() ->fetchField(); if (empty($rid)) { db_insert('users_roles') ->fields(array( 'uid' => $uid, 'rid' => ALUMNI, )) ->execute(); } } mysql> describe field_data_field_class_is_finished -> ; +-------------------------------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------------------------+------------------+------+-----+---------+-------+ | entity_type | varchar(128) | NO | PRI | | | | bundle | varchar(128) | NO | MUL | | | | deleted | tinyint(4) | NO | PRI | 0 | | | entity_id | int(10) unsigned | NO | PRI | NULL | | | revision_id | int(10) unsigned | YES | MUL | NULL | | | language | varchar(32) | NO | PRI | | | | delta | int(10) unsigned | NO | PRI | NULL | | | field_class_is_finished_value | int(11) | YES | MUL | NULL | | +-------------------------------+------------------+------+-----+---------+-------+ 8 rows in set (0.00 sec) mysql> mysql> describe og_membership; +-------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | type | varchar(255) | NO | | | | | etid | int(10) unsigned | NO | MUL | 0 | | | entity_type | varchar(32) | NO | | | | | gid | int(11) | NO | MUL | NULL | | | group_type | varchar(32) | NO | MUL | | | | state | varchar(255) | YES | | | | | created | int(11) | NO | | 0 | | | field_name | varchar(255) | NO | | | | | language | varchar(12) | NO | | | | +-------------+------------------+------+-----+---------+----------------+ 10 rows in set (0.00 sec) mysql> select * from og_membership where gid=1304; +------+----------------------------+-------+-------------+------+------------+-------+------------+--------------+----------+ | id | type | etid | entity_type | gid | group_type | state | created | field_name | language | +------+----------------------------+-------+-------------+------+------------+-------+------------+--------------+----------+ | 8275 | og_membership_type_default | 1 | user | 1304 | node | 1 | 1402485115 | og_user_node | en | | 8276 | og_membership_type_default | 10106 | user | 1304 | node | 1 | 1402485280 | og_user_node | en | | 8277 | og_membership_type_default | 10113 | user | 1304 | node | 1 | 1402485286 | og_user_node | en | | 8278 | og_membership_type_default | 10114 | user | 1304 | node | 1 | 1402485292 | og_user_node | en | +------+----------------------------+-------+-------------+------+------------+-------+------------+--------------+----------+ 4 rows in set (0.00 sec) mysql> describe users; +------------------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------------+------------------+------+-----+---------+-------+ | uid | int(10) unsigned | NO | PRI | 0 | | | name | varchar(60) | NO | UNI | | | | pass | varchar(128) | NO | | | | | mail | varchar(254) | YES | MUL | | | | theme | varchar(255) | NO | | | | | signature | varchar(255) | NO | | | | | signature_format | varchar(255) | YES | | NULL | | | created | int(11) | NO | MUL | 0 | | | access | int(11) | NO | MUL | 0 | | | login | int(11) | NO | | 0 | | | status | tinyint(4) | NO | | 0 | | | timezone | varchar(32) | YES | | NULL | | | language | varchar(12) | NO | | | | | picture | int(11) | NO | MUL | 0 | | | init | varchar(254) | YES | | | | | data | longblob | YES | | NULL | | +------------------+------------------+------+-----+---------+-------+ 16 rows in set (0.01 sec) mysql> select * from users where uid=10106; +-------+----------------------+---------------------------------------------------------+------------------------------------------------+-------+-----------+------------------+------------+------------+-------+--------+------------------+----------+---------+------------------------------------------------+------+ | uid | name | pass | mail | theme | signature | signature_format | created | access | login | status | timezone | language | picture | init | data | +-------+----------------------+---------------------------------------------------------+------------------------------------------------+-------+-----------+------------------+------------+------------+-------+--------+------------------+----------+---------+------------------------------------------------+------+ | 10106 | user_authenticated_1 | $S$DBGDqh770IDr09aztKD8Ey8aNGxwx8iiCaYo/rGCcBpa5XzNKnDF | | | | full_html | 1401792983 | 1401794533 | 0 | 1 | America/New_York | | 0 | | NULL | +-------+----------------------+---------------------------------------------------------+------------------------------------------------+-------+-----------+------------------+------------+------------+-------+--------+------------------+----------+---------+------------------------------------------------+------+ 1 row in set (0.00 sec) mysql> select * from users where uid=10113; +-------+----------------------+---------------------------------------------------------+------------------------------------------------+-------+-----------+------------------+------------+--------+-------+--------+------------------+----------+---------+------------------------------------------------+------+ | uid | name | pass | mail | theme | signature | signature_format | created | access | login | status | timezone | language | picture | init | data | +-------+----------------------+---------------------------------------------------------+------------------------------------------------+-------+-----------+------------------+------------+--------+-------+--------+------------------+----------+---------+------------------------------------------------+------+ | 10113 | user_authenticated_2 | $S$DeG84e0QP/H2h2rGv6cw93krL3CDoQ6CZOzhiSQCZa4OpZOAeP21 | | | | full_html | 1402485227 | 0 | 0 | 1 | America/New_York | | 0 | | NULL | +-------+----------------------+---------------------------------------------------------+------------------------------------------------+-------+-----------+------------------+------------+--------+-------+--------+------------------+----------+---------+------------------------------------------------+------+ 1 row in set (0.00 sec) mysql> select * from users where uid=10114; +-------+----------------------+---------------------------------------------------------+------------------------------------------------+-------+-----------+------------------+------------+--------+-------+--------+------------------+----------+---------+------------------------------------------------+------+ | uid | name | pass | mail | theme | signature | signature_format | created | access | login | status | timezone | language | picture | init | data | +-------+----------------------+---------------------------------------------------------+------------------------------------------------+-------+-----------+------------------+------------+--------+-------+--------+------------------+----------+---------+------------------------------------------------+------+ | 10114 | user_authenticated_3 | $S$D4xWR53hWUcyoZmIuZOLv7K8oasOsPCmqWaQGT.kpMQiX9k7XpfD | | | | full_html | 1402485256 | 0 | 0 | 1 | America/New_York | | 0 | | NULL | +-------+----------------------+---------------------------------------------------------+------------------------------------------------+-------+-----------+------------------+------------+--------+-------+--------+------------------+----------+---------+------------------------------------------------+------+ 1 row in set (0.00 sec) mysql> select rid from users_roles where uid=10106; +-----+ | rid | +-----+ | 7 | +-----+ 1 row in set (0.00 sec) Tags:
Categories: Drupal Setup Entity Translation the right way

Planet Drupal - 13 December 2014 - 5:36am

This article contains a detailed instruction on how to setup the Entity Translation module for Drupal 7 websites.
Entity Translation is part of Drupal 8 core and its approach is to translate fields instead of full nodes/entities.

Goal of this tutorial is to set up a multilingual website that can be navigated in multiple languages by visitors and to enable the content to be easily manageable by editors / cms administrators.
To get multilingual right, it’s critical that you configure your content-types and fields with care and precision and upfront, because if content is already in your database it is almost impossible to change these configurations.
So let's go.

Categories: Drupal

Pixelite: Adding Apple and Android favicons to Drupal

Planet Drupal - 12 December 2014 - 4:00pm

As you end up building more and more websites that target mobile devices (e.g. iPhone, iPad, Android, Windows), you need to supply an ever increasing amount of favicons. This process can be complex if done by hand, luckily there is an easy way to introduce these into your Drupal site.

What you will need

Before we start you will need a high quality icon to begin with, the icon should be:

  • 260x260px (i.e. square)
  • a PNG with transparency as needed
  • recognizable when shrunk right done to your browser favicon (so don’t use your entire logo complete with words).
Generating the favicons

This is where the really handy website comes into play. I have used many other websites that offer similar functionality, but this seems to be the best, and is dead simple to use.

You will need to upload the 260x260px PNG file, and also select a hex color for the Windows 8 tile, but this should be straight forward.

I also opt for the option “I will place favicon files (favicon.ico, apple-touch-icon.png, etc.) at the root of my web site.” as this seems the most sensible place for them anyway.

When you complete the process, you will be able to download a zip file containing a whole bunch of icons and XML files, this is fine, extract them to your docroot for Drupal.

Adding the favicons to Drupal

You now will need to edit your html.tpl.php inside your theme, and add the code that the generator provides. The code should resemble something like this:

1 <link rel="apple-touch-icon" sizes="57x57" href="/apple-touch-icon-57x57.png"> 2 <link rel="apple-touch-icon" sizes="114x114" href="/apple-touch-icon-114x114.png"> 3 <link rel="apple-touch-icon" sizes="72x72" href="/apple-touch-icon-72x72.png"> 4 <link rel="apple-touch-icon" sizes="144x144" href="/apple-touch-icon-144x144.png"> 5 <link rel="apple-touch-icon" sizes="60x60" href="/apple-touch-icon-60x60.png"> 6 <link rel="apple-touch-icon" sizes="120x120" href="/apple-touch-icon-120x120.png"> 7 <link rel="apple-touch-icon" sizes="76x76" href="/apple-touch-icon-76x76.png"> 8 <link rel="apple-touch-icon" sizes="152x152" href="/apple-touch-icon-152x152.png"> 9 <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon-180x180.png"> 10 <link rel="icon" type="image/png" href="/favicon-192x192.png" sizes="192x192"> 11 <link rel="icon" type="image/png" href="/favicon-160x160.png" sizes="160x160"> 12 <link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96"> 13 <link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16"> 14 <link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32"> 15 <meta name="msapplication-TileColor" content="#b91d47"> 16 <meta name="msapplication-TileImage" content="/mstile-144x144.png">

You will notice though that Drupal likes to place it’s default favicon into the <head> section of the page, we need to remove this in order for it not to mess up the above code you inserted.

<link rel="shortcut icon" href="http://[YOURSITE]/misc/favicon.ico" type="image/" />

The following code below can be inserted into your template.php file for your theme to remove the default favicon from Drupal:

1 <?php 2 /** 3 * Remove the unneeded favicon from the head section. 4 */ 5 function YOURTHEME_html_head_alter(&$head_elements) { 6 foreach ($head_elements as $key => $element) { 7 if (!empty($element['#attributes'])) { 8 if (array_key_exists('href', $element['#attributes'])) { 9 if (strpos($element['#attributes']['href'], 'misc/favicon.ico') > 0) { 10 unset($head_elements[$key]); 11 } 12 } 13 } 14 } 15 } 16 ?>

There you have it all done.

Extra for experts - Google’s theme-color meta tag

Google recently announced that from Chrome 39 onwards on Android Lollipop (5.0+), a new meta tag will be supported

<meta name="theme-color" content="#b91d47" />

This is what your site’s title bar now looks like (instead of boring and grey).

This meta tag can be added to your html.tpl.php file as above.


Let me know if this has helped you, and also if you have any other tips and tricks when it comes to favicons on your mobile devices.

Categories: Drupal

Mediacurrent: Protect thyself! Don&#039;t send TESTING emails to REAL users

Planet Drupal - 12 December 2014 - 1:05pm

Have you ever accidentally triggered emails to real users while working in a development environment? Or how about accidentally pushed data to a "live" third party service from a development environment?

Categories: Drupal

CiviCRM Blog: Drupal Views in CiviCRM Dashlets

Planet Drupal - 12 December 2014 - 10:58am

Here at Skvare, we strive to make Drupal and CiviCRM work as one to accomplish goals in a way that is simple and intuitive. Continuing our work in Drupal/CiviCRM integrations, we’ve cooked something new up for you all. We would now like to take this opportunity to introduce Views in Dashlets.

What is Views in Dashlets?

Views in Dashlets is a Drupal module that allows one to create a dashlet containing a Drupal View. That is right, in addition to CiviCRM reports you can use the power of Drupal Views to create a customizable experience. This opens grand new opportunities to use our imagination and drive to strengthen the bond between Drupal and CiviCRM. A majority of the functionality of Views is currently at your fingertips, with further enhancements on the horizon.

How did we get to this point?

We had the idea of rendering a View in a dashlet, but that’s all it was. An idea. We researched extensively trying to find out how exactly a dashlet works. Curiously, I created a forum post where I received a small piece of knowledge and took our first big step in creating this module. After that, it was a matter of development of ideas. Thank you totten for the quick and helpful response.

Basic Instructions

It is very simple to create a dashlet. All you have to do is:

  1. Open/create your view and add a new “CiviCRM Dashlet” display
  2. Configure the display to your liking and save
  3. Visit and click “Configure Dashboard”
  4. Add your created dashlet to a column and click “Done”

And now your brand new dashlet is on your dashboard!

Why Views in Dashlets?
  • Simplicity -- Using CiviCRM reports to create dashlets is a great feature of CiviCRM, but new reports require PHP and SQL coding skills. Some organizations have staff with these skills, but many do not. Many more people do have the ability to use site-building techniques to create Views through its powerful UI.
  • Customize - Customize your view to render your CiviCRM or Drupal data just how YOU want it. Quickly add sorts, filters, fields, relationships, no results behaviors, and rewrite field output functionality.
  • Style - Make it pretty! Use View’s built in style features to wrap fields in html elements and add classes to fields for css styling.
  • Content -- More than just data, place content on the dashboard. Display a node, add links to documentation, or list your latest Drupal Commerce orders. If it can be Viewed, it can be on the Dashboard.
  • Combine - Use in combination with the CiviCRM Entity and Entity Reference modules to create rich data structure displays combining Drupal content with CiviCRM data. Also, there are tons of great modules that expand Views functionality and most will work with Views in Dashlets.
  • Reuse - Use the same view for a Drupal page and CiviCRM dashlet.
  • Much more that we have not thought of!
"What can I do to help?"

If you would like to join the journey of Views in Dashlets then go ahead and create an issue. This issue could be a bug report or even a feature request. Views in Dashlets is a work in progress, but there is ALOT you can do with it already. We would be very grateful for your feedback. This is a team effort, and our community is the number one team.

For more information, visit the project page at

Categories: Drupal

Drupal Watchdog: Migrate API

Planet Drupal - 12 December 2014 - 10:29am

The migrate API works with plugins and stores the configuration for those plugins in a configuration entity. There are a number of plugin types offered: source, process, and destination are the most important. Source merely provides an iterator and identifiers, and most of the time the destination plugins provided by core are adequate, so this article will focus on process plugins.

Process plugins

Nothing gets into the destination unless it is specified under the top level process key in the configuration entity. Each key under process is a destination property and the value of it is a process pipeline. Each “stage” of this pipeline is a plugin which receives the output of the previous stage as input, does some transformation on it, and produces the new value of the pipeline.

There are a few plugins which indeed only use the pipeline value as input – for example, the machine name plugin transliterates the input (presumably a human name) and replaces non-alphanumeric characters with underscores. However, if that was all plugins could do they wouldn’t be too useful. Instead, every plugin receives the whole row and the name of the destination property currently being created.

Each stage in the process pipeline is described by an array, where the plugin key is mandatory and the rest is just the plugin configuration. For example:

process: vid: - plugin: machine_name source: name - plugin: dedupe_entity entity_type: taxonomy_vocabulary field: vid

The above mentioned machine name transformation is run on name and then the entity deduplication plugin adds a numeric postfix ensuring the vid field of the taxonomy_vocabulary entity is unique. That is the canonical format of the process pipeline.

Categories: Drupal

Media Pinkeye

New Drupal Modules - 12 December 2014 - 9:27am

Media Pinkeye is one of "full-featured" media solutions for Drupal8. It's goal is to provide basic media features and experience (WordPress parity).

Categories: Drupal

Lullabot: Coding in Schools

Planet Drupal - 12 December 2014 - 8:49am

In this episode, Amber Matz and her guests Eric Schneider and Matthew Tift talk about the successes and challenges on how parents and school officials worked together to get coding into the curriculum in Minnetonka Schools. Eric Schneider is the Assistant Superintendent for Instruction, Minnetonka Public Schools and Matthew Tift is a Senior Developer at Lullabot and a Minnetonka parent.

Categories: Drupal

Inline JS

New Drupal Modules - 12 December 2014 - 8:17am

Allows to add inline JavaScript code to different part/position of JS script tag as there is no straight forward way in Drupal 8 core. More details at #2391025: Regression: Design flaw change disallow attaching of inline JS

Categories: Drupal

ThinkShout: Oregon Zoo Small Actions

Planet Drupal - 12 December 2014 - 8:00am
Oregon Zoo: Small Actions

The Oregon Zoo in Portland approached us to develop an action portal component for their Drupal web site. The action portal is a tool that suggests real-world actions that anyone can take to help wildlife survive and flourish. A social sharing component is important for spreading these tips organically. Pun intended. Like wildflowers.

Many sites integrate social sharing, but there are a couple of things that make the Zoo's action portal different. The main difference is that by sharing an action, you are saying that you've actually done that action in the real world, and you are encouraging your friends and followers to take the same action. The aim is not just to generate site traffic, but rather to encourage people to make real change that has a tangible impact on wildlife. Also, the shared content is more personalized, since it's a combination of a single species and the action that you've taken, plus custom messaging the visitor would like to add.

The original intent was to enable visitors to share an action on several social channels: Facebook, Twitter, etc. During technical planning, it was decided that Facebook alone would be the best place to start. We would integrate directly with Facebook and track the shares internally with a custom integration code interacting with Facebook's API.

When we began implementation, we spent a little more time exploring options for sharing on multiple channels, compared to Facebook only. There would be a couple of benefits of sharing directly on Facebook. Using their API would pave the way for deeper integration in the future, taking advantage of Open Graph properties as a starting point. We would have better control over messaging, and we would have complete control over how logging happens in Drupal. And I must say, the Facebook developer documentation is top notch.

But adding the ability later to share on other social networks would require additional API integration for each site. We wanted to consider paving a clearer path forward, so we looked into existing services for sharing on multiple sites. There are many: Gigya, AddThis, ShareThis, and more. For something to work for us, it would need to be free or very inexpensive, allow us to customize the shared message, and provide some statistics, mainly for a share count to display on the site. The ShareThis service ended up working best for us. When using any of these services, there is less control over how shares are logged.

We presented the client with these options along with the pros & cons of each and, ultimately, it was decided that we'd use ShareThis. Having approximate share counts was an acceptable tradeoff in exchange for the benefit of being able to share to multiple social networks.

So, back to how we actually did this...

Structurally, we started with two content types: Action (for the action we want people to take) and Animal (Species that relate to the actions). These each have mostly common field types, such as image and body text.

On the Action content type, we added an Animals entityreference field in order to make the connection between the two content types.

There are three new pages for this feature: the main landing page, the animal detail page, and the action detail page. We created an Animals view for the landing page and action detail page, and we created an Actions view also for the Explore by Action tab of the landing page and for the animal detail page. For the tabs on the landing page, we created a simple block using hook_block_info() and hook_block_view().

Something that's easy to miss when initially planning lists of things is how sorting should be controlled. Since an action references multiple animals, we use that order for displaying animals on the action detail page. But we were pretty limited in how to control the order of actions on an animal detail page. We needed independent sorting control between animals on action pages, and actions on animal pages. We opted to stay with the native drag and drop sorting of entityreference fields, so we added a matching entityreference field on animals to reference actions, and added the Corresponding Entity References to keep these references in sync with each other. Now we have native draggable sorting on both content types. There are several other methods that could have been used, such as adding a weight field, using the draggable views module, or using nodequeue, but using CER with a pair of entityreference fields kept complexity at a minimum.

An essential goal of this feature is sharing an action. The requirement was to have the sharing widget appear on individual actions only when listed on an animal detail page. The shared message is a combination of elements from both content types: the image and name of the animal, plus the contents of a Sharing Message text field from the action. The the URL shared is related to the action.

Message when sharing the FSC action from the Chimpanzee page:

Here's how we put that together. We start by including the global stuff for the ShareThis widget. An implementation of hook_views_pre_render() adds some javascript settings and includes the ShareThis javascript library. To add the unique things to each action, we add a new variable "sharethis_attributes" in hook_preprocess_views_view_field(). This variable contains a string of pseudo attributes: st_url="" st_title="Example Page Title" st_image="" st_summary="This is the text that will be shared." st_via="OregonZoo". We use that variable in a very specifically-named template file that takes effect for only this field in this view. The rest of the markup and classes placed in that field template came from ShareThis.

<?php print $output; ?> <div class="sharethis-custom"> <span class='st_sharethis_vcount' displayText='ShareThis' <?php print $sharethis_attributes; ?>></span> </div>

All of this work: content types, fields, image styles for the image fields, views, and the handful of custom hook implementations are bundled together in a new custom feature.

Check out the small actions pages at the Oregon Zoo site and see if there is a small action you can take that will have an impact on a wild animal you care about. There are some great tips that will help you live cleaner and sustain our irreplaceable wildlife.

Categories: Drupal

Mobile game and engine company lands piece of Qualcomm investment

Social/Online Games - Gamasutra - 12 December 2014 - 7:03am

Qualcomm Incorporated has announced it will invest an aggregated $40 million in various Chinese companies, including Chukong Technologies. ...

Categories: Game Theory & Design

Stanford Web Services Blog: Adaptive Architecture: Leave Room to Evolve

Planet Drupal - 12 December 2014 - 6:55am

All forward-thinking technologies share one attribute: the original designers intentionally build in opportunities for future users to innovate. It requires humility and a belief in the creativity of others. This is true for buildings, computers, networks, and other tools.

Categories: Drupal

Search API Glossary

New Drupal Modules - 12 December 2014 - 4:38am

Placeholder for Search API Glossary A-Z style glossary.
DEV version of the module is currently in progress and will be made available once peer approved.

Categories: Drupal

Node template reaction (context)

New Drupal Modules - 12 December 2014 - 2:54am

Node template reaction allows to set node's template as context reaction.
In difference of context node template module, it allows to choose node.tpl file for node (not page.tpl) as context reaction.

Created by ADCI solutions team

Categories: Drupal

Gábor Hojtsy: The Drupal 8 configuration schema cheat sheet

Planet Drupal - 12 December 2014 - 2:20am

After over a month of concentrated work, Drupal 8 was ready today to finally flip the switch and enforce strict configuration schema adherence in all TestBase derived tests in core. See the announcement in the core group.

If you are a Drupal 8 contrib developer and provided some configuration schema earlier (or you integrate with an existing core system like blocks, views, fields, etc.) then your tests may now fail with configuration schema errors. Unless of course all your configuration schema is correct: #highfive for you then.

Otherwise I thought you'll have questions. There is of course the existing configuration schema documentation that I helped wrote. However if you are a visual person and want to get an understanding of the basics fast, I thought a cheat sheet would be a great tool. So sat down today and produced this one in the hopes it will help you all! Enjoy!

Categories: Drupal

Blair Wadman: Programmatically assign roles to users in Drupal

Planet Drupal - 12 December 2014 - 12:24am

This post is part of a series of posts on making changes in Drupal programmatically rather than in the Drupal interface.

In this tutorial, we will be programmatically assigning role(s) to user(s). You would typically do this in a site deployment module in order to automate this task rather than having to manually assign the roles in the Drupal UI.

Categories: Drupal

In Media Res

Gnome Stew - 12 December 2014 - 12:00am

Today’s guest article is by Patrick Regan, a screenwriter living in Los Angeles, who learned how to write for TV by GMing after a college roommate made the mistake of showing him Dungeons and Dragons. He blogs at, podcasts at Cinema Excelsior, and can be generally found on Facebook and Twitter @underwoodfive. Thanks, Patrick! –Martin

Who Needs Context?

The Hook breathes heavily as he walks through the dark, although it sounds like it’s coming from all around you. Molly, you’re badly hurt, four lethal damage, one agg, and are hiding in a cupboard in an abandoned ranger station, gripping the Hook’s old weapon, a butcher cleaver. The only thing that can kill it.

Rhona, you’re also hurt, but not as bad, hiding under a table. You shiver as the Hook’s boots clomp next to you, and you can see the gleam of his namesake weapon in your mind.

Jack, you’re at the top of a cliff, looking down at the ranger station. You’ve got three lethal and a bashing from a fight with the Hook before it turned, for no reason at all, and leapt down the mountain. Your gun is effectively useless. You might as well have been shouting insults at it.

Terry, your wounds are knitting up from the Goblin fruit you ate and you’re barreling through the woods at breakneck pace, but you’ve still got an Arm Wrack tilt until the fruit finishes healing. And there’s an 11 foot deep trench between you and the station.

What do you do?

That’s how I began my most recent session of Changeling: the Lost. For the record, I really have no idea how the characters got to be in the specific place they were in when we opened up, and neither do the players. We had ended the last session with them recovering the butcher cleaver, the only weakness of the Hook. I chose to fast forward straight through to the fight. In media res, in other words.

To put on my over-educated hat, in media res is latin for: “In the Midst of Things,” and is a storytelling device that basically tosses the audience right into the middle of the action without any set-up to explain what’s going on or how they got there.

You can see it the most often in television, where it’s assumed repeat viewers already know, for example, that Oliver Queen is the Green Arrow and he fights crime with a bow and arrow. Your average Arrow episode starts with Oliver and company (ha) in the midst of foiling some crime that will end up thematically relating to the main problem of the episode.

I come here today to encourage you to take that tactic and apply it to your own games.

The Status Quo

With the exception of games that had to be left off in the middle of things (who among us hasn’t taken photos of a miniature board?), pretty much every game session I’ve been playing in has started one of two ways:

  1. “The Open Ended Question” In this popular form, the GM gives a brief recap of the events of previous sessions, as well as any ramifications actions of the previous sessions may have had. She then asks an open ended question: “What do you do?”
  2. “The Inciting Incident” In this opening, the GM provides some kind of inciting incident. A Mr. Johnson with a job, a summons to the Lucifuge in Milan, a strange wizard in the tavern looking for some patsies to get him an amulet. You might have some indicated downtime, but it’s all really just wheel spinning until you meet the person with the yellow exclamation point over their head (to use WoW parlance).

There’s nothing inherently wrong with either of these options. In fact, they help let your players know what kind of session you’re running, be it an open-ended sandbox or mission based game play. And frequently those can change — the Chronicle from the example above is fairly open-ended, but given where the last session ended (we got the knife that kills the monster!), I had a fairly good idea what the next step was going to be (kill the monster!).

In media res lets us cut through the clutter and the wheel spinning that often accompanies a starting session and cuts straight to the action. The technique is applied differently to both ways of starting, though, so let’s examine them one at a time.

The Open Ended Question

For a sandbox-style game or a sandbox-style session, you want to be careful to not railroad the characters too much. After all, the whole point of the session or the game is that it’s player controlled, based on what the characters would want to do.

Instead, use this as way of helping immersion and recognizing the fact that at any given time, almost nobody is doing nothing, which is often a weakness of the leading question. It always feels like the character just popped into existence seconds ago, and hasn’t really been doing anything until we checked in on them.

Don’t think of this as forcing an inciting incident on the party, it’s more about setting a mood and tone for the game as a whole. Superheroes might be talking to the press after foiling a bank robbery, or even at the tail end of foiling it (no need for rolls, you know they’re going to succeed). Vampire, with its themes of alienation from humanity, might start with the character having to interact with their human facades in a way that reminds them of what they were.

Don’t forget about the fun of domesticity, too. Especially if your characters all live together, someone has to clean, cook, and buy groceries. You’d be surprised what kinds of stories can come up when a vegetarian and a werewolf try to go food shopping together.

The general aim when using this technique with sandboxes is to make the breaks between sessions feel seamless. This is a dynamic world that changes with the players’ actions, and their characters are dynamic people. You want your players to believe that, as opposed to feeling like they’ve logged into the WoW accounts.

Where in media res really shines, though, is when you’re dealing with the inciting incident, because in media res lets you cut through a lot of the clutter and dreck that can accumulate before you get to the actual good parts.

The Inciting Incident

Since it’s the most popular heavy mission-style based game that I know of, I’m going to use Shadowrun as an example. Most Shadowrun games follow a traditional narrative:

  1. Shadowrunning team looks for a job
  2. Someone (usually a Mr. Johnson) approaches team with job
  3. Team and Mr. Johnson discuss job, team takes or rejects job
  4. Team plans job
  5. Team performs job
  6. Team gets reward in some way or another

Obviously, there are twists and turns aplenty to be found in this narrative, and it can potentially last for several sessions (particularly if you’ve got a team of severe over-planners). In general, though, this is how Shadowrun games are designed to go. It’s baked into the title — you’re a team of mercenary Shadowrunners in a fantasy cyberpunk future.

But look at that narrative. If you’ve been playing for a while, there’s a LOT of places in there that you can probably skip entirely unless you’re actively performing some kind of twist. If the meet with the Mr. Johnson is going to go exactly the same as every other meet with the Mr. Johnson, it’s a meeting you can skip. Is this a Mr. Johnson they’re ever going to meet again? Is anything different going to happen if it’s someone they already know? If the answer is no, consider starting with your characters casing the joint and making their plans.

If you’re feeling a little sadistic (and have players that don’t mind this sort of thing), start halfway through the plan, when everything inevitably goes to hell in a hand basket. The general theory, though, is bypass the stuff that simply doesn’t matter, is boring, or is rote.

On the other hand, if the team is suddenly being brought up the Saeder-Krupp headquarters for some one-on-one time with Lofwyr himself? That might deserve some special attention, but even then, don’t start with getting the message, then driving to the building, then getting their drive-on passes, etc.

Start in the middle of it. Start in the plush elevator raising them high, high, higher over the Berlin metroplex. Start them waiting in the a plush room that’s nicer than their apartments, having been there for over an hour (because the Great Dragon sees you when it’s damn well convenient for him).

One of my favorite things to do with this method is set a mood. Like my Hook example up above, I started in the middle of the fight for two reasons. The first was avoiding repetition: the characters had researched and beaten a dream echo of the Hook to get the butcher cleaver, and I didn’t see any reason to repeat a fight they had essentially already had.

Secondly, and maybe more importantly, I wanted to make it clear from the get go what a fight with the Hook meant. The Hook comes from Grim Fears and is one of the most terrifying ready-made antagonists I’ve ever seen. He is, quite literally, pure fear and feeds off of pure fear. He’s a True Fae’s embodiment of slasher movie tropes, and whether he or those tall-tales came first is irrelevant at this point. All that matters is just how scary he is.

I didn’t want a pitched battle with Hook, a tactical ambush or a street brawl. That’s not what the Hook is. He’s there to stalk characters, make them run and hide until they have that one chance to make the blow that kills him.

All this being said:

Communication, Communication, Communication

If it’s been said once here at Gnome Stew, it’s been said a thousand times. Use your words and talk to your players. Some players feel like any in media res storytelling is taking away player agency and won’t put up with it. Others take a more relaxed attitude and generally will think “Yeah, that sounds like something my character would do” once you explain it to them.

Whether you’re starting a campaign or simply want to start introducing this technique at your table, sit down and chat with the players first. Does this sound fun to them? Are they willing to give up a little character agency for greater immersion and less having to be told by the Herald that the King wants to see them?

After all, above all else, you should be having fun.

Categories: Game Theory & Design

Motivating Your Indie Team - Pt. 3 - by Katie Chironis Blogs - 11 December 2014 - 11:59pm
It's no secret that motivation to finish is the thing which kills nearly every indie game project. But it doesn't have to be that way. Here are some helpful tips on keeping your team together, productive, and moving forward.
Categories: Game Theory & Design
Syndicate content

about seo