Software
Code Karate: Drupal 7 Entity Registration Module
The Drupal 7 Entity Registration Module makes it easy to host sign-ups or registration forms directly on your Drupal 7 website. This solution works great for event, conference, webinar, or training signup forms.
In this lesson you will learn:
Tags: DrupalDrupal 7Drupal PlanetDrupal Watchdog: Cooking Up Sites With Open Outreach
Drupal distributions can be a huge leg up in building a website, especially for those with little technical knowledge. The “ingredients” (modules) you need are already assembled, leaving you with just the task of stirring it up, and perhaps adding your own personalizing flavors. The Open Outreach distribution is specifically designed for nonprofit and grassroots groups. It comes with a wide range of apps — bundles of modules and configurations that are geared to the needs of groups, such as contact management or mapping. It also includes a number of helper features, such as a text editor, commenting, and social media handling.
For more detailed instructions on how to work with Open Outreach, see the complete user documentation.
Below you’ll find some recipes for whipping up a specific kind of Open Outreach site, giving you the apps you need: to enable; required configuration; suggested themes for the look and feel of your site; and tips on customizations to take your site further. Happy site building!
Environmental group focused on mining impactsYou’re a board member of this small but enthusiastic group. You’ve been tasked with creating a website that will serve as the public face, but more importantly also track membership contacts as well as your contacts with other groups, government bodies, and industry.
Lullabot: Finding related content faster with Apache Solr
We recently fixed a performance issue at the MSNBC project: the More Like This list of content related to the current page was stressing our database servers with slow, complicated MySQL queries. Here is a screenshot of the block in question:
Drupal Association News: Drupalaton 2014 in Hungary, at the largest lake in Central Europe
This post originally ran on Imagine Creativity, and has been reprinted with permission.
Wow my Hungarian friends - you have done it again! Two weeks ago, I spent a long weekend at Drupalaton, a Drupal camp in Hungary with the difference that it also served as a short relaxing break. It was the perfect combination of a holiday and work with the beautiful surroundings of Central Europe’s largest lake Balaton.
I was very excited to return to the country after the amazing Drupal Developer Days in Szeged event that I went to in March. It was also filled with meeting amazing people from all around the world, learning and sharing knowledge and connecting with so many inspiring people.
At both events the thing that really stood out for me was the great hospitality shown by the Hungarians I met there. I have really been humbled by how friendly and hospitable they have been, and all of the time they put into making the event so amazing for all the attendees.
This was the fifth year that large Drupal events have been taking place in the country, but the second where the language hasn’t been exclusively in Hungarian. Last year’s event brought people from Romania, Serbia and other neighbouring countries but this year we had a much more international event with people from Austria, Belgium, Finland, Germany, Spain, & the UK in attendance.
Patchy, the sprint whale. Unofficial @drupalaton mascot with @ChandeepKhosa @brynvertesi @rteijeiro pic.twitter.com/AxydLT3JiO
— Bryn Vertesi (@brynvertesi) August 9, 2014
The team that made it happenTamás ‘York’ Pintér, was the main organiser and lives in the area of the camp, Zsófi Major co-ordinated many aspects of the event including community outreach over social media & sponsorship management, István Csáki, helped to create the website and other support, Bálint Fekete, made some amazing design work (in particular the innovative scroll on the website where the boat moves across the page which I spent far too long playing with!).
Also on the team were Gábor Hojtsy, (Drupal 8 multilingual initiative lead) helping with event-marketing, István 'PP' Palócz who helped with finances (and helped me learning some basic Hungarian phrases) and last but not least Tamás ‘TeeCee’ Szügyi, the photographer who documented the great event.
Some numbersIn the recent newsletter to all attendees from the organisers the following statistics were disclosed.
"We are really proud of the following numbers, so let us share with you:
Our 79 attendees came from 13 countries from all over the world, and only a bit more than half of them were from Hungary. This lucky number is significant for us, as Drupalaton started as a local Drupalcamp, and now we can proudly say that we are on the big Drupalmap :)"
- You spent more than 1420 minutes (almost 24 hours) on 8 workshops with learning.
- The sprinters worked on 70+ issues during the 4 days. This a great number, you can find more thoughts about it in Gábor Hojtsy's blog post.
- During the 4 days you consumed 134 pcs of Túró Rudis, 132 ps of Marzipan ladybugs, 260 cans of beer, 60 kilograms of different fruits and 7 kilograms of nuts."
Next year
If any of that sounds good you should attend next year, 6-9 August 2015, I'm very excited about returning. Even the founder of Drupal, Dries Buytaert, regrets not attending! Maybe he will join us too next year, that would be awesome!
Photos from Drupalaton: https://t.co/TP0ARVawzb Wish I could have been there!
— Dries Buytaert (@Dries) August 11, 2014
Check out the pictures from Flickr below, or on Twitter and the Facebook page!
Drupal 8 Rules: #d8rules updates, BoF & sprints at DrupalCon Amsterdam
Hello everyone!
DrupalCon Amsterdam is coming close and we are working hard to get Milestone 1 for porting the Rules module to Drupal 8 done. Here's an outline where you can join fago, klausi, nico and many others for updates on the initiative, discussions and hands-on during the sprints!
Drupal 8 Contrib Module Update (shared session)Tuesday · 14:15 - 15:15, Room: Auditorium (Wunderkraut)
https://amsterdam2014.drupal.org/session/drupal-8-contrib-module-update
A quick, 12-minutes update on the status of Rules for Drupal 8 together with Webform (quicksketch), Display Suite (by aspilicious), Media (by daveried/slashrsm), Search API (by drunken monkey), Commerce (by bojanz), Redirect, Global Redirect, Token, Pathauto (by berdir), Panels (by japerry) & Simplenews (by miro_dietiker/ifux).
#d8rules initiative meeting (BoF)Thursday 13:00 - 14:00, Room: Emerald Lounge E
https://amsterdam2014.drupal.org/bof/d8rules-initiative-meeting
Let's get into a deeper discussion about the #d8rules initiative in this birds-of-a-feather session. We'll inform you about the current state of funding & development and prepare you well for the sprints on Friday.
#d8rules sprintsFriday 9:00 - 18:00, Coder lounge in the venue
https://groups.drupal.org/node/427578
Sprinting at DrupalCon is THE way to learn about contributing to Drupal in general. With our training experience from DrupalCamp Alpe-Adria and Drupalaton we know that working on Rules 8.x is a great way to get started with the new programming paradigmes of Drupal 8. Join fago, klausi to port actions, fix integrations for Drupal 8 core and get Milestone 1 done in general.
#d8rules sprints are focused mainly on Friday, but we will also be around for extended sprints prior and after the conference. Check out the information about all the sprints at and around DrupalCon Amsterdam by gabor. And please don't forget: thank you for helping us estimate the number of people attending and sign-up using the sprints spreadsheet.
#d8rules trainings & sprints at DrupalCamp Alpe-Adria, Slovenia, May 2014
We are looking forward meeting everyone there. As always, you can find us on irc: #drupal-rules and don't forget to use the twitter hashtag #d8rules.
dasjo on behalf of the #d8rules team
InternetDevels: Thanks for the great time at Lviv Euro DrupalCamp 2014!
Four months of preparation. Three golden sponsors. Two days. One Lviv Euro Drupal Camp 2014.
Ladies and gentleman, we can proudly announce — we did it! Our camp became the biggest Drupal-evet taking place in Ukrane this year, which got together the most cheerful and friendly drupalers. We hope, that all those 150 people have got a huge pile of positive emotions and impressions. But let’s get in details inch by inch :).
Read moreDcycle: An approach to code-driven development in Drupal 8
Code-driven development is the practice of placing all development in code. How can development not be in code?, you ask.
In Drupal, what makes your site unique is often configuration which resides in the database: the current theme, active modules, module-specific configuration, content types, and so on.
For the purpose of this article, our goal will be for all configuration (the current theme, the content types, module-specific config, the active module list...) to be in code, and only content to be in the database. There are several advantages to this approach:
- Because all our configuration is in code, we can package all of it into a single module, which we'll call a site deployment module. When enabled, this module should provide a fully workable site without any content.
- When a site deployment module is combined with generated content, it becomes possible to create new instances of a website without cloning the database. Devel's devel_generate module, and Realistic Dummy Content can be used to create realistic dummy content. This makes on-ramping new developers easy and consistent.
- Because unversioned databases are not required to be cloned to set up new environments, your continuous integration server can set up new instances of your site based on a known good starting point, making tests more robust.
Before moving on to D8, let's look at a typical D7 workflow: The technique I use for developing in Drupal 7 is making sure I have one or more features with my content types, views, contexts, and so on; as well as a site deployment module which contains, in its .install file, update hooks which revert my features when needed, enable new modules, and programmatically set configuration which can't be exported via features. That way,
- incrementally deploying sites is as simple as calling drush updb -y (to run new update hooks).
- deploying a site for the first time (or redeploying it from scratch) requires creating the database, enabling our site deployment module (which runs all or update hooks), and optionally generating dummy content if required. For example: drush si -y && drush en mysite_deploy -y && drush en devel_generate && drush generate-content 50.
I have been using this technique for a few years on all my D7 projects and, in this article, I will explore how something similar can be done in D8.
New in Drupal 8: configuration managementIf, like me, you are using features to deploy websites (not to bundle generic functionality), config management will replace features in D8. In D7, context is used to provide the ability to export block placement to features, and strongarm exports variables. In D8, variables no longer exist, and block placement is now exportable. All of these modules are thus no longer needed.
They are replaced by the concept of configuration management, a central API for importing and exporting configuration as yml files.
Configuration management and site UUIDsIn Drupal 8, sites are now assigned a UUID on install and configuration can only be synchronized between sites having the same UUID. This is fine if the site has been cloned at some point from one environment to another, but as mentioned above, we are avoiding database cloning: we want it to be possible to install a brand new instance of a site at any time.
We thus need a mechanism to assign the same UUID to all instances of our site, but still allow us to reinstall it without cloning the database.
The solution I am using is to assign a site UUID in the site deployment module. Thus, in Drupal 8, my site deployment module's .module file looks like this:
/** * @file * site deployment functions */ use Drupal\Core\Extension\InfoParser; /** * Updates dependencies based on the site deployment's info file. * * If during the course of development, you add a dependency to your * site deployment module's .info file, increment the update hook * (see the .install module) and this function will be called, making * sure dependencies are enabled. */ function mysite_deploy_update_dependencies() { $parser = new InfoParser; $info_file = $parser->parse(drupal_get_path('module', 'mysite_deploy') . '/mysite_deploy.info.yml'); if (isset($info_file['dependencies'])) { \Drupal::moduleHandler()->install($info_file['dependencies'], TRUE); } } /** * Set the UUID of this website. * * By default, reinstalling a site will assign it a new random UUID, making * it impossible to sync configuration with other instances. This function * is called by site deployment module's .install hook. * * @param $uuid * A uuid string, for example 'e732b460-add4-47a7-8c00-e4dedbb42900'. */ function mysite_deploy_set_uuid($uuid) { \Drupal::config('system.site') ->set('uuid', $uuid) ->save(); }And the site deployment module's .install file looks like this:
/** * @file * site deployment install functions */ /** * Implements hook_install(). */ function mysite_deploy_install() { // This module is designed to be enabled on a brand new instance of // Drupal. Settings its uuid here will tell this instance that it is // in fact the same site as any other instance. Therefore, all local // instances, continuous integration, testing, dev, and production // instances of a codebase will have the same uuid, enabling us to // sync these instances via the config management system. // See also https://www.drupal.org/node/2133325 mysite_deploy_set_uuid('e732b460-add4-47a7-8c00-e4dedbb42900'); for ($i = 7001; $i < 8000; $i++) { $candidate = 'mysite_deploy_update_' . $i; if (function_exists($candidate)) { $candidate(); } } } /** * Update dependencies and revert features */ function mysite_deploy_update_7003() { // If you add a new dependency during your development: // (1) add your dependency to your .info file // (2) increment the number in this function name (example: change // change 7003 to 7004) // (3) now, on each target environment, running drush updb -y // will call the mysite_deploy_update_dependencies() function // which in turn will enable all new dependencies. mysite_deploy_update_dependencies(); }The only real difference between a site deployment module for D7 and D8, thus, is that the D8 version must define a UUID common to all instances of a website (local, dev, prod, testing...).
Configuration management directories: active, staging, deployOut of the box, there are two directories which can contain config management yml files:
- The active directory, which is always empty and unused. It used store your active configuration, and it is still possible to do so, but I'm not sure how. We can ignore this directory for our purposes.
- The staging directory, which can contain .yml files to be imported into a target site. (For this to work, as mentioned above, the .yml files will need to have been generated by a site having the same UUID as the target site, or else you will get an error message -- on the GUI the error message makes sense, but on the command line you will get the cryptic "There were errors validating the config synchronization.").
I will propose a workflow which ignores the staging directory as well, for the following reasons:
- First, the staging directory is placed in sites/default/files/, a directory which contains user data and is explicitly ignored in Drupal's example.gitignore file (which makes sense). In our case, we want this information to reside in our git directory.
- Second, my team has come to rely heavily on reinstalling Drupal and our site deployment module when things get corrupted locally. When you reinstall Drupal using drush si, the staging directory is deleted, so even if we did have the staging directory in git, we would be prevented from running drush si -y && drush en mysite_deploy -y, which we don't want.
- Finally, you might want your config directory to be outside of your Drupal root, for security reasons.
For all of these reasons, we will add a new "deploy" configuration directory and put it in our git repo, but outside of our Drupal root.
Our directory hierarchy will now look like this:
mysite .git deploy README.txt ... drupal_root CHANGELOG.txt core ...You can also have your deploy directory inside your Drupal root, but keep in mind that certain configuration information are sensitive, containing email addresses and the like. We'll see later on how to tell Drupal how it can find your "deploy" directory.
Getting started: creating your Drupal instanceLet's get started. Make sure you have version 7.x of Drush (compatible with Drupal 8), and create your git repo:
mkdir mysite cd mysite mkdir deploy echo "Contains config meant to be deployed, see http://dcycleproject.org/blog/68" >> deploy/README.txt drush dl drupal-8.0.x mv drupal* drupal_root cp drupal_root/example.gitignore drupal_root/.gitignore git init git add . git commit -am 'initial commit'Now let's install our first instance of the site:
cd drupal_root echo 'create database mysite'|mysql -uroot -proot drush si --db-url=mysql://root:root@localhost/mysite -yNow create a site deployment module: here is the code that works for me. We'll set the correct site UUID in mysite_deploy.install later. Add this to git:
git add drupal_root/modules/custom git commit -am 'added site deployment module'Now let's tell Drupal where our "deploy" config directory is:
- Open sites/default/settings.php
- Find the lines beginning with $config_directories
- Add $config_directories['deploy'] = '../deploy';
We can now perform our first export of our site configuration:
cd drupal_root drush config-export deploy -yYou will now notice that your "deploy" directory is filled with your site's configuration files, and you can add them to git.
git add . git commit -am 'added config files'Now we need to sync the site UUID from the database to the code, to make sure all subsequent instances of this site have the same UUID. Open deploy/system.site.yml and find UUID property, for example:
uuid: 03821007-701a-4231-8107-7abac53907b1 ...Now add this same value to your site deployment module's .install file, for example:
... function mysite_deploy_install() { mysite_deploy_set_uuid('03821007-701a-4231-8107-7abac53907b1'); ... Let's create a view! A content type! Position a block!To see how to export configuration, create some views and content types, position some blocks, and change the default theme.
Now let's export our changes
cd drupal_root drush config-export deploy -yYour git repo will be changed accordingly
cd .. git status git add . git commit -am 'changed theme, blocks, content types, views' Deploying your Drupal 8 siteAt this point you can push your code to a git server, and clone it to a dev server. For testing purposes, we will simply clone it directly
cd ../ git clone mysite mysite_destination cd mysite_destination/drupal_root echo 'create database mysite_destination'|mysql -uroot -proot drush si --db-url=mysql://root:root@localhost/mysite_destination -yIf you visit mysite_destination/drupal_root with a browser, you will see a plain new Drupal 8 site.
Before continuing, we need to open sites/default/settings.php on mysite_destination and add $config_directories['deploy'] = '../deploy';, as we did on the source site.
Now let the magic happen. Let's enable our site deployment module (to make sure our instance UUID is synched with our source site), and import our configuration from our "deploy" directory:
drush en mysite_deploy -y drush config-import deploy -yNow, on your destination site, you will see all your views, content types, block placements, and the default theme.
This deployment technique, which can be combined with generated dummy content, allows one to create new instances very quickly for new developers, testing, demos, continuous integration, and for production.
Incrementally deploying your Drupal 8 siteWhat about changes you make to the codebase once everything is already deployed. Let's change a view and run:
cd drupal_root drush config-export deploy -y cd .. git commit -am 'more fields in view'Let's deploy this now:
cd ../mysite_destination git pull origin master cd drupal_root drush config-import deploy -yAs you can see, incremental deployments are as easy and standardized as initial deployments, reducing the risk of errors, and allowing incremental deployments to be run automatically by a continuous integration server.
Next steps and conclusionSome aspects of your site's configuration (what makes your site unique) still can't be exported via the config management system, for example enabling new modules; for that we'll use update hooks as in Drupal 7. I'm still having some errors doing this in D8, but I'm working on it!
Also, although a great GUI exists for importing and exporting configuration, I chose to do it on the command line so that I could easily create a Jenkins continuous integration job to deploy code to dev and run tests on each push.
For Drupal projects developed with a dev-stage-prod continuous integration workflow, the new config management system is a great productivity boost.
Tags: blogplanetAcquia: Mike Meyers explains – Help Drupal and it will help you: contribute!
Michael E. Meyers, VP Large Scale Drupal at Acquia, knows better than most how contributing to the open source project you are relying on to build or improve your business will pay off. He and his team did just that when they successfully built and sold NowPublic.com – the first venture capital funded, Drupal-based startup – while making massive contributions to the Drupal project along the way.
He and I invite you not only to use Drupal, but also to make it better and to get involved with its community. If you're only using it without giving back, you're not getting the full benefit it could be giving you. Come to DrupalCon Amsterdam or an event near you and make a difference!
Isovera Ideas & Insights: Drupal Commerce Tips: Implementing SimpleXML to Generate Invoice Files
Part 1 - Implementing SimpleXML to generate Invoice files
As part of the work with one of our E-Commerce clients it was a requirement to integrate with the RetailPro back-office tool. While the following post is specific to the RetailPro files and system. This same techniques could easily be re-purposed to help integrate various other systems that require invoice files to be sent to a 3rd party system.
ThinkShout: Nonprofit Website Benchmarks
Your website is a unique snowflake with singular requirements. While there’s surely overlap, the make-up of your audience is different from every other site, because your mission – and the content you put on your website to support that mission – is different from every other nonprofit.
But you’ve probably wondered how your site compares to others. I know I’ve always wanted access to website benchmarks – some way to see if the trends I notice in our own dashboards are reflective of larger patterns.
Of course, benchmarks can be dangerous. If you obsess about them, the action becomes whatever the opposite of navel gazing is.
When you analyze the efficacy of your own website, you always need to consider it within the context of your own target audiences and organizational goals instead of worrying that your overall bounce rate is 4% higher than the "average."
After all, if your site has the profile of a news organization, with links to recent articles shared widely through third-party channels, you should expect a higher bounce rate: people come, consume, and leave. That might be okay! The goal of that content may have been to spread some news, not generate donations.
Benchmarks can inform us about larger trends, though, and it’s damned annoying that they’re so hard to find.
It’s been almost four years since Groundwire published its 2010 Website Benchmarks Report. (Fortunately, you can still download the PDF from a third-party site.) Since then, Google has discontinued its Analytics Benchmarks Report – and even the semi-useful newsletter that followed.
You can order a $395 report from Marketing Sherpas (PDF), which may or may not be helpful; I certainly didn’t buy it. KISSmetrics published an infographic about bounce rates a couple of years ago with some interesting data… that may have come from a 2006 post to a Yahoo group.
Pew Research recently released an interesting study comparing news sites, using aggregated data from ComScore. I love how they’ve analyzed visitor loyalty across segments, but rare is the nonprofit that’s going to share the content goals of CNN or NBC News.
On our side, there are a couple of stats of interest in the latest Benchmarks Study from M+R and NTEN and the 2013 Online Marketing Benchmark Study for Nonprofits from Blackbaud, but they’re mostly focused on traffic growth and donation page conversions.
At ThinkShout, because we start almost all of our engagements by exploring how our client’s audiences use their current website, we felt it would be important to have some point of comparison. To facilitate discussion around questions like "How much do we need to worry about mobile?" or “How can we convert the influx of new visitors into engaged users?”, we’ve aggregated the data we have available to us.
It seems only fair to share some of it.
This data is in no way reflective of the industry as whole, and it is very top-level. It represents fifteen organizations with diverse missions and traffic patterns, ranging from a few thousand sessions per month to more than 100,000. These are also generally organizations that have recognized the need to redesign their website.
With those caveats, we hope this data may help you understand that some of what you see in your own analytics may, in fact, be reflective of broader trends.
The following are three I see in the 37,000,000 pageviews we have access to.
Search Is the Ultimate ShortcutBack in 2010, Groundwire found that search engines referred 55% of traffic to the nonprofit websites in their study. While we can’t do a direct comparison since the sites in question aren’t the same, I feel comfortable making the blanket statement that the trend is toward more traffic coming from search.
Here are the mean / median numbers since 2011:
2011: 47.06% / 43.97%
2012: 48.12% / 50.12%
2013: 52.99% / 54.02%
So far in 2014, those numbers have increased to 55% (mean) / 60% (median).
That means, of course, that traffic from the other two legs of the standard triumvirate have dropped:
2011: 22.04% / 22.13%
2012: 23.08% / 20.28%
2013: 18.67% / 17.00%
2014 (to date): 16.18% / 13.98%
2011: 28.87% / 24.76%
2012: 26.81% / 20.75%
2013: 25.36% / 21.42%
2014 (to date): 25.82% / 19.75%
Essentially, the best home page ever created will not solve your problems, as your users are more and more likely to turn to search first to find what they’re looking for. Your information architecture must take into account the fact that the first page your visitors encounter may be deep in your website.
User Experience starts in the first place your users experience you. You can use your data to make some assumptions about where that’s mostly likely to happen and optimize the top landing pages, but, more and more, you need to worry about every piece of content on your site.
Stop Wondering if Mobile Is Important Right NowIt is. Groundwire found that in 2010, the median number of mobile visitors to the sites in their study was just 1%. That’s changed over the past few years. Looking just at mobile phones (not tablets), you can see the surge:
2011: 5.70% / 4.97%
2012: 7.68% / 7.67%
2013: 12.84% / 12.04%
2014 (to date): 18.68% / 17.45%
I’ve seen the argument made that mobile doesn’t require your attention quite yet because it still represents, according to this data, just 1 in 5 visits.
Our suggestion would be to get ahead of the curve instead of fighting to catch up. The growth in mobile traffic is having an obvious impact on the most basic measures of engagement.
Mean Median Year Bounce Rate Time per Session Pages per Session Bounce Rate Time per Session Pages per Session 2011 62.30% 2:04 2.30 67.07% 1:57 2.09 2012 66.17% 1:58 2.06 67.20% 1:56 1.89 2013 70.48% 1:54 1.87 70.10% 1:39 1.84[I’ve excluded 2014 because I haven’t cleaned out the data from sites that have gone through a responsive redesign. This isn’t meant to be a marketing piece, but I can tell you that redesigning for mobile can have a significant impact.]
My suspicion is that as people grow more comfortable using their smartphones to browse the Internet, visiting brands that have implemented a mobile strategy, they’re less likely to put up with sites that don’t work as well as they expect in their mobile browsers.
By structuring your content properly, you can create ways to put the content mobile users are most interested in front and center. If nothing else, you should take the time to understand what mobile visitors are doing on your site as a first step.
Loyalty Is Hard to Come By (or Even Define)Perhaps, given the growth in search and mobile traffic, it’s no surprise that the percentage of "New" visitors has increased over the years:
2011: 65.65% / 66.01%
2012: 70.34% / 70.13%
2013: 74.35% / 75.00%
On the flip side, "Loyal" visitors (defined as those with at least three visits in the period under review) have crashed:
2011: 20.86% / 19.00%
2012: 15.64% / 15.66%
2013: 12.16% / 12.26%
And those numbers aren’t just relative percentage drops, caused by increases in other types of traffic, because the real numbers have dropped as well:
2011: 44,734 / 33,894
2012: 43,076 / 29,989
2013: 37,757 / 22,781
I’m fairly confident, given the scale of the data, that this isn’t simply because people are getting better at clearing their cookies regularly – there’s wide variation in estimates, much of it from surveys of user behavior, rather than actual data – or browsing the web incognito. Those technologies have been around for years, and I doubt even Mr. Snowden has had that much of an impact on people’s everyday habits. (But I’m willing to be convinced otherwise.)
This loss could also be reflective of device fragmentation. Google and others are working on ways to track users across the many devices they use, but right now, if somebody visits you on August 14th on their laptop, comes back on September 9th on their tablet, and then again on October 21st on their phone, they would be classified as three different New users. As we see mobile traffic grow, it may mean that right now, we don’t have an accurate way to track visitor loyalty.
Perhaps some of that loyalty is being transferred elsewhere, however, from the website to social spaces, third party donation pages, or even mobile apps. In that case, the better sites are at converting website visitors into these different kinds of traffic, the less relevant the website will become to them.
Rare is the constituent who comes once a year to donate. Engagement, even within a multi-channel strategy, has to strike a balance between assuming that visitors will find continued value from the resources we make available on the web and moving new visitors to spaces where they’re more likely to continue to interact with us and each other.
In any case, if visitors are increasingly less likely to return to nonprofit websites, we need to rethink some of our engagement strategies. If they’re turning elsewhere because they aren’t finding what they want, when they want it, we’ve got some serious work to do.
Interested in Helping Out?I’ve made the spreadsheet with the cleaned data for 2011-2013 publicly available. We hope you’ll check it out and add insights of your own!
But beyond using it as a tool to inform your own website, we could use your help. What other data should we track and share? What do you want to know?
And more importantly, are you willing to share your own?
If you’d like to work with us on a template that can be used to collect data from other nonprofits, just let me know. We’ll keep the org-by-org breakdown anonymous. Once we reach an arbitrarily large threshold – 100,000,000 pageviews? – we can do some follow-up work.
Lev Tsypin, ThinkShout’s Director of Engineering, has suggested that we could go so far as to set up a Google form that feeds an anonymized spreadsheet. We could then make that data available via JSON, for further manipulation.
In the end, I believe that the more we aggregate and share, the better we’ll identify the problem areas we need to focus on as a community.
Drupal Watchdog: Extending Drupal 7 Services into an E-commerce App
By now, you’ve surely heard that Drupal 8 is pushing boundaries for users, content editors, administrators, and developers – if not, where have you been?
Obviously, not every site has the luxury of being able to migrate and adopt new technologies. If you are in the same position as me, then many of your clients – or indeed, the company you work for – have spent lots of time and money investing in Drupal 7; at this point, urging a new platform on them is probably going to fall on deaf ears. But all is not lost! Drupal 7 can still create a powerful RESTful Web Service API or a terrific mobile application.
So the old adage again rings true: “Where there is a Drupal 8 core initiative, there is a Drupal 7 contributed module.”
Having attended the Commerce 2.x sprint in Paris, I can safely say that if you do eventually upgrade to Drupal 8, it won’t be a massive undertaking molding your Drupal 8 Core services output to match that of Drupal 7 contrib services. Not all your work will be lost.
When I first started down the road of mobile apps, I was certain I did not have the time to learn Objective C and Java, as well as the intricacies of each mobile platform. (Sound familiar?) All I wanted was the ability to utilize the Drupal technology I already knew, and then enable PhoneGap without having to learn any device-specific language.
For purposes of this article, I won’t assume you know mobile apps technology nor much about Drupal’s Services module, REST, jQuery Mobile, Xcode, or PhoneGap. I do assume that you know Drupal, can work your way around the administration interface, and know some basic PHP and Javascript. With that in mind let’s take an overview of technologies you can utilize for your mobile application.
First, let’s install DrupalGap and its dependencies.
Now we have a core DrupalGap service and the basic service resources we might want for our mobile application. All the generic things we use on most Drupal sites are right there: resources are content-available for query through endpoints; and DrupalGap supplies us with a default endpoint.
Deeson Online: Deeson: Drupal Association Autologout and Limit Modules webinar
Attendees included Drupal developers, solutions architects, and programmers. John took the attendees through a series of steps, and in the webinar, explained how to:
- Log users out after a period of inactivity
- Prevent users from having more than one active session at a time
- Apply your company password policy to your web site
- Configure flood control settings
- Check the health of your site to identify potential security problems
Going to DrupalCon Amsterdam? Come and find us - tweet to meet @deesonlabs
Acquia: Web services in Drupal 8 Core
Some of the great news in Drupal 8 development was the introduction of web services directly in core, allowing other applications to interact with Drupal to consume exposed information or services without the need to install contributed modules.
Let’s look at the list of modules that ship with D8 core related with web services:
LightSky: Apple Watch is a Great Sign for Drupal
Earlier this summer Dries Buytaert, the original creator of Drupal, had a pretty visionary keynote at DrupalCon, which we talked about in pretty good detail in a podcast. One of the things that we mentioned in our analysis of his keynote is that while what Dries was presenting was looking pretty far into the future, it showed that Drupal is being guided on the right path to be positioned well in the future of the web, and Apple's announcement yesterday of the new Apple Watch just supports this position. The Apple Watch is exactly the type device that Dries is trying to position Drupal to be ready to feed content to.
Screen Size Could Make the Current Web ObsoleteObviously anyone who has looked at the pictures or video of Apple's new watch can immediately see that you aren't going to be viewing a website on it. Really in any form, a website as we know it won't be displayable on this type of device. Even the best designers and front-end developers aren't going to be able to make a site responsive down to this size effectively, and the important thing to note is that this is totally ok. But it is not just small screens that change the way content is going to have to be consumed, big screens cause just as much problem. We aren't going to be displaying whole websites on billboards, or 6x4 signs found on the sidewalks in major cities, we have to be able to feed content to them.
Be Ready, Change is ComingIt probably isn't going to quickly eliminate web sites as we know it, but agencies and other organizations need to be ready for change in the way their content is consumed. Whether it be how products are displayed to potential buyers, your store hours, notifications of sales and events, it doesn't matter what the content is, the way it is consumed will be different in just a matter of months even than it is now. CMS frameworks need to be ready, and the reality is that many just aren't ready, and aren't headed in the right direction to be ready. Drupal on the other hand, is on the right track.
For more tips like these, follow us on social media or subscribe for free to our RSS feed and newsletter. You can also contact us directly or request a consultation.4Sitestudios.com Drupal Blog: BuildingRating.org Website Redesign
Drupal Easy: DrupalEasy Podcast 138: Touch of Gray (Rick Manelius - PCI Compliance)
Rick Manelius (rickmanelius), project architect at NEWMEDIA, and one of the leading minds in our community when it comes to PCI Compliance, joins Mike Anello to further demystify PCI Compliance and the role it plays in any site that involves credit card data. We also discuss two-factor authentication, when we might see a Drupal 8 beta, and Drupal’s persistence.
Cocomore: Meet us in Amsterdam
There is the European DrupalCon happening from Sept. 29th to the Oct. 3rd in Amsterdam and a team of Cocomore - as one of the biggest Drupal shops in Germany and Spain - will of course attend.
DrupalCon Amsterdam: Training spotlight: Design, Prototype, and Style in Browser
Design, Prototype, and Style in Browser (formerly Advanced Sass and Compass for RWD) is back! One of our most popular courses returns, with even more great new content - and now is your chance to attend this training at DrupalCon Amsterdam!
With more mobile device activations per day than human births and full internet browsers coming to television sets and gaming consoles (both home and portable), the old techniques we have used to create pixel-perfect sites for desktop audiences have already become a thing of the past.
We will explore content strategy as a method for designing responsive websites, building separate components and layouts, and will emphasize creating DRY code. We will dive deep into the power of Sass and Compass and a handful of JavaScript tools and how they can be utilized for your growing website. These tools can ease much of the hard work related to creating truly awesome responsive websites.
Meet the Trainers from Four KitchensChris Ruppel (rupl) and Ian Carrico (iamcarrico) are Frontend and Backend developers at Four Kitchens respectively. Both are well-known in the Drupal community as both RWD and Sass experts, having trained and spoken at numerous events around the world, including Portland, Denver, New York, Austin, San Francisco, and Munich, Germany.
Neither are strangers to community contribution: Ian maintains the Aurora base theme and Magic module and contributes to many RWD-related Compass extensions such as Toolkit, Singularity, and Breakpoint. Chris maintains the Modernizr module and has contributed to Modernizr, the Drupal 8 HTML5/Mobile initiatives, and the Drupal.org D7 upgrade.
Attend this Drupal TrainingThis training will be held on Monday, 29 September from 09:00-17:00 at the Amsterdam RAI during DrupalCon Amsterdam. The cost of attending this training is €400 and includes training materials, meals and coffee breaks. A DrupalCon ticket is not required to register to attend this event.
Metal Toad: Simple password grants with OAuth 2.0 and Drupal
Like many Drupal developers, we have become big fans of decoupled front-ends using Drupal as a RESTful backend (a.k.a. "headless" Drupal). The myriad of authorization options can be confusing, however. We've settled on OAuth 2.0 for most situations. When OAuth is brought up, many people will think of the single-sign-on flow in a browser, with the associated redirects and permission dialogs. This flow is widely used, but not always a good fit for first-party applications, or machine-to-machine API interactions.
Károly Négyesi: I AM GROOT
Or, languages are really hard.
So I was handing over some CSV export functionality to a client who loaded it into Excel as it is without using the import wizard. This resulted in misinterpreted UTF-8 as WIN-1252. I quickly wrote this little function (error handling omitted for brevity):
<?php
function uconv($text) {
$descriptorspec = array(array("pipe", "r"), array("pipe", "w"));
$process = proc_open("/usr/bin/uconv --add-signature", $descriptorspec, $pipes);
fwrite($pipes[0], $text);
fclose($pipes[0]);
$text = stream_get_contents($pipes[1]);
fclose($pipes[1]);
proc_close($process);
return $text;
}
?>
A quick test of the function showed it working, so I patched the CSV export to call it, deployed it on the dev server and... it died on the first accented character. I have checked on the dev server from command line and it worked. W.T.F. I compared the mbstring ini values, all the same. W.T.F, no, really, this can't be.
Well, there must be something different, right? What could be? Locale? But what's locale? Environment variables. Hrm, proc_open has environment variables too. Well then let's see whether my shell feeds something into this script that makes it work: env -i php x.php. It breaks! Yay! It's always such relief when I can reproduce a bug that refuses to be reproduced. The solution is always easy after -- the LANG environment variable is en_US.utf8 in the shell, and C in Apache:
<?php
proc_open("/usr/bin/uconv --add-signature", $descriptorspec, $pipes, NULL, array('LANG' => 'en_US.utf8'));
?>
Ps. Curiously enough, -f utf-8 as an uconv argument didn't help -- but -f utf-8 -t utf-8 did. Morale of the story: uconv defaults to the value LANG both to and from. This is not documented and it's very hard to discover.