Software

Dcycle: An approach to code-driven development in Drupal 8

Drupal Planet - Wed, 2014-09-10 22:28
What is code-driven development and why is it done?

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.
Code-driven development for Drupal 7

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 management

If, 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 UUIDs

In 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, deploy

Out 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 instance

Let'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 -y

Now 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 -y

You 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 -y

Your git repo will be changed accordingly

cd .. git status git add . git commit -am 'changed theme, blocks, content types, views' Deploying your Drupal 8 site

At 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 -y

If 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 -y

Now, 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 site

What 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 -y

As 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 conclusion

Some 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: blogplanet
Categories: Software

Acquia: Mike Meyers explains – Help Drupal and it will help you: contribute!

Drupal Planet - Wed, 2014-09-10 21:20

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!

Categories: Software

Isovera Ideas & Insights: Drupal Commerce Tips: Implementing SimpleXML to Generate Invoice Files

Drupal Planet - Wed, 2014-09-10 20:46

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. 

Categories: Software

ThinkShout: Nonprofit Website Benchmarks

Drupal Planet - Wed, 2014-09-10 18:00

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 Shortcut

Back 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:

benchmark1.png

  • 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:

benchmark2.png

  • 2011: 22.04% / 22.13%

  • 2012: 23.08% / 20.28%

  • 2013: 18.67% / 17.00%

  • 2014 (to date): 16.18% / 13.98%

benchmark3.png

  • 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 Now

It 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:

benchmark4.png

  • 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:

benchmark5.png

  • 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:

benchmark6.png

  • 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.

Categories: Software

Drupal Watchdog: Extending Drupal 7 Services into an E-commerce App

Drupal Planet - Wed, 2014-09-10 17:03
Article

Shopping Cart DesignBy 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.

Categories: Software

Deeson Online: Deeson: Drupal Association Autologout and Limit Modules webinar

Drupal Planet - Wed, 2014-09-10 16:31
Deeson: Drupal Association Autologout and Limit Modules webinarBy Lizzie Hodgson | 10th September 2014

John Ennew is a solutions architect here at Deeson. He recently carried out a webinar focusing on Drupal Autologout and Limit Modules.

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
The webinar

Going to DrupalCon Amsterdam? Come and find us - tweet to meet @deesonlabs

 

Categories: Software

Acquia: Web services in Drupal 8 Core

Drupal Planet - Wed, 2014-09-10 16:13

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:

drupal 8 1

Categories: Software

LightSky: Apple Watch is a Great Sign for Drupal

Drupal Planet - Wed, 2014-09-10 15:42

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 Obsolete

Obviously 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 Coming

It 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
Categories: Software

4Sitestudios.com Drupal Blog: BuildingRating.org Website Redesign

Drupal Planet - Wed, 2014-09-10 15:30
BuildingRating.org Website RedesignThe Challenge The Institute for Market Transformation (IMT) is a Washington, DC-based nonprofit organization promoting energy efficiency, green building, and environmental protection in the United States and abroad. They approached 4Site to redesign the BuildRating.org website, an international exchange for information on building rating disclosure policies and programs, from the ground up. Our Solution 4Site worked with IMT to develop a comprehensive strategy for the BuildRating.org redesign to ensure that the new site provided as many user friendly tools as possible to help visitors find the specific information they needed. We built a world map of jurisdictions with sustainability standards, a robust search with filters for locations, topics, and content types, and a policy comparison tool in which visitors can select jurisdictions and topics to compare in a custom populated table format. The Results Visit the BuildingRating.org WebsiteInstitute for Market TransformationService: DesignInfographics & Visual ContentWebsite ThemingDevelopmentData Visualization & MappingWebsite DevelopmentStrategyContent StrategyUser Experience
Categories: Software

Drupal Easy: DrupalEasy Podcast 138: Touch of Gray (Rick Manelius - PCI Compliance)

Drupal Planet - Wed, 2014-09-10 15:14
Download Podcast 138

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.

read more

Categories: Software

Cocomore: Meet us in Amsterdam

Drupal Planet - Wed, 2014-09-10 15:13

We were going DrupalCon Amsterdam 2014.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.

read more

Categories: Software

DrupalCon Amsterdam: Training spotlight: Design, Prototype, and Style in Browser

Drupal Planet - Wed, 2014-09-10 14:31

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 Kitchens

Chris 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 Training

This 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.

Register today

Categories: Software

Metal Toad: Simple password grants with OAuth 2.0 and Drupal

Drupal Planet - Wed, 2014-09-10 10:30

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.

Categories: Software

Károly Négyesi: I AM GROOT

Drupal Planet - Wed, 2014-09-10 07:36

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.

Categories: Software

Modules Unraveled: 118 Starting and Running a DrupalCamp in a Hobbiest Community with Adam Hill - Modules Unraveled Podcast

Drupal Planet - Wed, 2014-09-10 07:00
Photo of Adam HillPublished: Wed, 09/10/14Download this episodeStarting a local Drupal community
  • When did you start the DrupalCampNE meetups?
    • Started due to meeting a friend Richard at DrupalCons in Paris, Copenhagen and Denver and saying how crazy it was that we met at DrupalCons across the world but not in the North East where we’re both native. So we setup a meeting and promoted it on twitter and with some others we knew had at least dabbled with Drupal. We had 6 people at our first meeting and that happened in a pub which was to set the stage for the future meetups which have all been held in pubs.
  • I’ve thought about how cool it would be to start a local camp, but we don’t have a lot of people even coming to our meetups. What have you (or other organizers) done to get consistent attendance to events?
    • Consistency… Mixup of talks and social but always keep it social so expectations are not too high. For the camp we needed there to be a few people interested and then had backing from my company to allow us to dedicate time. Dedicated time has been vital.
  • How large is a typical meetup? What’s the average attendence?
    • We get anything from between 5 - 20 people attending but its really a mixup again, depends heavily on the day to some extend (holidays etc.) but also on if there is a talk. Our WP vs Drupal talk got a LOT of people :)
  • How far do people travel to get to your meetups?
    • We’ve had people doing a round trip of 100 miles before because there is no meetup in the North of the North West… but usually people come from Newcastle or there abouts. We lose a few people since its too far for them to come for sure.
DrupalCampNE
  • When did you start organizing a Drupal Camp for the North East of England?
    • August 2013 - started asking/checking about venue
    • Went to other camps in UK to promote and to share info
    • November 2013 - announced the date around DrupalCamp North West
  • What were some of the challenges you faced? Were there any unexpected ones that stick out to you?
    • Local attendees
    • Sponsors
    • Cancelled talks
    • Outsourcing - Venue
  • What went really well for you? How did you plan for it?
    • The feelings of collaborating - fresh eyes were really liberated.
    • The venue was loved
    • The talks by Morten and Holly Ross
  • What advice would you give to someone who’s planning a camp now? Or will be soon?
    • Plan really well in advance
    • Find a great venue and try to get it for free :)
    • Have the freedom to make decisions - keep a small team?
    • Get sponsors early!
    • Get speakers early!
Episode Links: Adam on drupal.orgAdam on TwitterConsult and DesignTags: Drupal Campsplanet-drupal
Categories: Software

Mediacurrent: How To Do A Combined Name Search

Drupal Planet - Tue, 2014-09-09 22:55

Recently I developed some functionality for a client that I realized might be useful to the greater Drupal community. This post describes how to set up a combined fields filter in Views to allow searching for terms and matching more than one field.

Categories: Software

Palantir: DrupalCon Amsterdam

Drupal Planet - Tue, 2014-09-09 20:59
DrupalCon Amsterdam logo

Each year the Drupal Association coordinates a few large-scale conferences for the global Drupal community. This time around the European conference is in Amsterdam, and we’ll be there to enjoy code sprints, meeting new members of the community, sessions, and, of course, presenting a few ourselves.

First, a few details: DrupalCon Amsterdam runs September 29 through October 3 and will have a couple thousand people from the Drupal community in attendance. Like the North American DrupalCon, sprints, events, and over 100 sessions will happen over the course of the conference.

Palantir will have a number of folks in attendance, including our CEO George DeMet, President Tiffany Farriss, Director of Development and Professional Services Ken Rickard, and Senior Architect and Community Lead Larry “Crell” Garfield.

Larry “Crell” Garfield

Larry will be leading three sessions:

Ken Rickard

Ken dives into the consulting piece for dev shops.

George DeMet

George has been involved with several Drupal working groups for some time now and will be on two panels related to such goings on.

In addition to ours and all of the other sessions – and Amsterdam as a city, of course – we’re also excited for all of the other things that come with DrupalCon. Whether it's sprint days making progress on Drupal 8 core and contributed module development, or the the PHP track this year (which showcases a number of leading presenters from the PHP world at-large helping continue to build bridges between Drupal and the PHP community), meeting new contributors (especially from the Symfony community), or working with the Drupal Association its working groups to help plan the future of Drupal.org and DrupalCon, it's a chance for all of us to grow as members of this and other communities.

Are you headed to Amsterdam for DrupalCon? If so, say hello to Tiffany, George, Ken, and Larry. And let us know what you’re excited about in the comments, or on Twitter here. We can keep you up-to-date via our newsletter as well. Hope to see you there!

Categories: Software

Freelock : Ask Freelock: Why should I use "Media" links instead of just embedding, in Drupal?

Drupal Planet - Tue, 2014-09-09 19:36

Joaquin asks:

Sorry, John.

But when it comes to adding Youtube and Vimeo, you still haven't made the case for not going into the HTML.

Here is a test page I created.

The top video I used the "WEB" tab in the "Add Media" button (BTW, it is a little confusing that there is still that tab labeled "Youtube").

The bottom video I copy and pasted from the HTML that Youtube presents you when you click the "Embed" tab.

As you can see, pasting the HTML looks a lot better. And the first option doesn't seem to be working.

Thoughts?

DrupalDrupal PlanetMediaVideo
Categories: Software

Acquia: The future of PHP ... at a distance

Drupal Planet - Tue, 2014-09-09 15:55

The future of PHP ... at a distance

First a short disclaimer: It’s been quite a few years since I have last been subscribed to the internals mailing list. I still hang out in one of the popular core developer IRC channels, follow quite a few core developers on twitter, and chat with people at conferences--which allows me to still keep up with things to some degree. I do of course still work daily with PHP. So for better or for worse this lets me see PHP's future at a bit of distance from core development.

Categories: Software

Deeson Online: Part 2: Apache Solr - Manually Controlling a Custom Fields Bias

Drupal Planet - Tue, 2014-09-09 11:25

In part one of this post I showed you how to create a custom field to be added to Apache Solr index and altering the search based on this field. In this second part I will be showing you how you can define a custom field to be listed within the 'field bias' admin settings in the Apache Solr module.

Setting the field biases

Most of the time just setting a custom field to be added to your index is all you will need. But sometimes there is the need to be able to control the bias of your custom fields when Solr does the search.

Typically you would manage this in the Apache Solr admin pages by going to /admin/config/search/apachesolr/settings. This will show you a list of your Solr instances that you have configured for the site. To change the biases, click on the ‘bias’ link against the relevant instance.

Within this section if you choose the ‘Field Biases’ tab on the left hand site you can set the bias for fields within the site.  This will affect the what is more relevant when Apache Solr does a search.

This is fine if you just want to set the bias on the standard fields that are available, but what if you want to be able to control the bias of the new custom field that you have just created?

Allowing manual field biases control on your custom field

Looking at the Apachesolr module in more detail shows that this list of bias fields is made up of ‘default’ fields (e.g. content, h1, h2 etc.) and any fields that are ‘text’ fields.

If you have created a custom field and your field is a string (e.g. 'ss_my_field') then you would think that this would then show up as it is a string field which is text - right?

Well no ..... after looking at the field definitions in more details (as shown in part 1), string fields are different to text fields, which is why the custom string field wasn't showing in the list.

Therefore in order for your custom field to appear in the list of 'bias fields', you need to define your custom field as a 'text' field rather than a 'string' field (e.g. ‘ts_my_field’). Having done this, re-index the content and the custom field now shows in this list of field biases.

Hooray I hear you shout .... well almost.  The field shows in the list but the label of this custom field shows as the field name (e.g. ‘ts_my_field’) - not very readable or friendly.

Helpfully there is a hook provided by the ApacheSolr module to map fields to a label for display:

/** * Implements hook_apachesolr_field_name_map_alter(). */ function MY_MODULE_apachesolr_field_name_map_alter(&$map) { $map['ts_my_field'] = t('This is the label for my custom field'); }

Now your new custom field shows in the list of 'bias fields' and has a nice friendly label for it. So you can now set the relevant value you would like for it to alter your search - happy days!

Read morePart 2: Apache Solr - Manually Controlling a Custom Fields BiasBy Mike Davis | 9th September 2014
Categories: Software

Pages