Planet Drupal

Subscribe to Planet Drupal feed - aggregated feeds in category Planet Drupal
Updated: 36 min 22 sec ago

NEWMEDIA: Using the Haversine Formula in Drupal 7

Fri, 11/11/2016 - 17:05
Using the Haversine Formula in Drupal 7 John Fiala Fri, 11/11/2016 - 16:05 The Haversine formula is one of the easiest to use pieces of complicated math I've had the pleasure to use. If you're not familiar with it, it's pretty simple in theory - it's an extension of the Pythagorean formula from a grid to the surface of a sphere, which basically means that you can use it to measure the distance between two points on a sphere (1).

"But what," I hear you ask through the secret microphone hidden in your keyboard, "does this have to do with Drupal?"  And the answer is - search.  I've worked on a number of projects over the years where users wanted to search for things which were some distance from a central point - a zip code, a city, or the like.  This can be done with apache solr these days, but sometimes apache solr isn't what you need. Either you’re not doing a keyword search and just filtering your nodes (show me all mexican restaurants near 12th and Vine) or else you don't think you need the extra complexity of adding an Apache Solr instance to the project.  An index of restaurants isn't a bad idea for an example, so let’s build one.  In the tradition of Drupal demos, we'll say we're creating a restaurant search engine, which we will name 'Shout'.  So, we spin up a copy of Drupal 7, set up the usual database, add a 'Restaurant' node type, download Fivestar* to do ratings, set up a few quick taxonomies (cuisine, price range [low, medium, high], and maybe style [sit-down, food court, fast food]) which we add to the restaurant node type.

Step 1

Create a node type with location information.  To store the address there’s two good options: the Location module, which grew out of CCK, and the Address Field module, which comes from the Commerce module.

Step 2

Add the latitude and longitude to the nodes - if you’re using the location module you can enable storing those values in the same field, but if you’re starting with the address field you need to add a field which stores that information.  I recommend the Geofield module.

Step 3

Finally, you will need to set up geocoding - the process of assigning latitude and longitude based off of an address.  There’s plenty of services which will do this for you, and if you’re using the location module, then you can enable it there.  Alternately you can use the Geocoder module to store these values.


Following along with our Shout example, let's add the addressfield, geofield, and geocoder modules, which will also in turn require the geoPHP and ctools modules.  Add the Address field and tell it to store a postal address, set up a geofield on the restaurant node as well and set the widget to 'geocode from another field', and take a look at the configuration of geocoder in admin/config/content/geocoder.  You can use the google api in batch for free, as long as you don't get too crazy with the number of requests per day.  This being an example site, I think we'll be safe, but when doing a commercial site it's always best to read the Google terms of service,sign up for an API key, and close cover before striking.



I've named the Address field field_address, and in a fit of originality I've named the geofield field_map_location.  Once I had everything set up, I entered a few local restaurants and ran cron to make sure that I was getting data in the field_data_field_map_location table - I suggest you do the same.  (Well, to be honest, at first I wasn't getting data, but that's why we test our examples when writing blog posts.)

Step 4

Once you've got locations set up, the next step is your search engine.  For this task I suggest the Search API module, which allows you to define your own indexes, and to switch search engines in the future as the need arrives.  You’ll also need the Search API DB and Search API Pages modules.

Step 5

We'll start by setting up a service - in this case, just gave it an obvious name and select the Database engine.


  Step 6

Then we'll create an index - although Search API creates a Default node index when it's enabled, we want one just for restaurant nodes.  So we'll click on 'Add Index', give it a name of 'Restaurant Index', select that we want to index Restaurant Nodes, and put in a quick description to remind us of what it is, and select the server we just created.


  Step 7

After that, go into index fields for the index and select at least the title and the 'main body text' for indexing - I suggest including the address as well.  It's also important to add the Location field that you're using, and include the latitude and longitude values in the index.  When you can't find a field, expand the 'Add Related Fields' at the bottom and look for them there, and make sure you save your changes before leaving the page.



Finally, on the filter tab I suggest excluding unpublished nodes, as well as Ignoring case and adding the HTML filter.

With all that setup, use the search_api_pages module to set up a search page for the index you've constructed.


With data and index set up, it's time to add the location filtering.  Let's add a quick block to filter with:

/** * Implements hook_block_info(). */ function example_block_info() { return [ 'location' => [ 'info' => t('Search Location Filter'), 'cache' => DRUPAL_CACHE_GLOBAL, ], ]; } /** * Implements hook_block_view(). */ function example_block_view($delta) { if ($delta == 'location') { $block['subject'] = t('Filter by location:'); $block['content'] = drupal_get_form('example_location_filter_form'); } return $block; } /** * This form allows the user to restrict the search by where they are. */ function example_location_filter_form($form, &$form_state) { $form['center'] = array( '#type' => 'textfield', '#title' => t('From'), '#description' => t('Enter a zip code or city, state (ie, "Denver, CO")'), '#maxlength' => 64, '#size' => 20, '#default_value' => isset($_GET['center']) ? $_GET['center'] : '', ); $distances = [5, 10, 20, 50]; foreach ($distances as $distance) { $options[$distance] = t('Within @num miles', array('@num' => $distance)); } $form['radius'] = [ '#type' => 'radios', '#title' => t('Distance:'), '#options' => $options, '#default_value' => isset($_GET['radius']) ? $_GET['radius'] : 5, ]; $form['submit'] = [ '#type' => 'submit', '#value' => t('Filter'), ]; $parameters = drupal_get_query_parameters(NULL, ['q', 'radius', 'center']); $form['clear'] = [ '#type' => 'markup', '#markup' => l(t('Clear'), current_path(), array('query' => $parameters)), ]; return $form; } /** * Validation handler for location filter. */ function example_location_filter_form_validate(&$form, &$form_state) { if (!empty($form_state['values']['center'])) { $location = trim($form_state['values']['center']); // Is this a postal code? $point = example_location_lookup($location); if (empty($point)) { form_set_error('center', t('%location is not a valid location - please enter either a postal code or a city, state (like "Denver, CO")', ['%location' => $location])); } } } /** * Form submit handler for location filter form. */ function example_location_filter_form_submit(&$form, &$form_state) { $parameters = drupal_get_query_parameters(NULL, ['q', 'radius', 'center']); if (!empty($form_state['values']['center'])) { $parameters['radius'] = $form_state['values']['radius']; $parameters['center'] = $form_state['values']['center']; } $form_state['redirect'] = [current_path(), ['query' => $parameters]]; }

In this case, example_location_lookup() looks for a latitude/longitude pair for a given location entered by the user, which I'm leaving as an exercise for the reader in hopes to keep this post short.  It should return an array with the keys 'lat' and 'long', at least.  For testing, you can have it return a fixed point until you've got that setup, like:

function example_location_lookup($location) { return array('lat' => 39.7392, 'long' => -104.9903); }

So, now we can return to the Haversine formula.  Once you've got the position entered and passed along, it's time to match it against our restaurants.  Doing complex math is hard, so after a few moments of thought, we realize that anything more than the radius miles north or south, or east and west, of the center point will be too far away to bother including in the search radius, so we'll first filter on a range of latitude and longitude around the center, and then filter by the haversine formula to knock out everything outside of the circle.  For implementing the Haversine formula in SQL, I'm indebted to Ollie Jones of Plum Island Media, who does a great job of demystifying the formula here.

/** * Implements hook_search_api_db_query_alter(). */ function example_search_api_db_query_alter(SelectQueryInterface &$db_query, SearchApiQueryInterface $query) { $field_name = variable_get('example_location_field_name', 'field_location'); // Do we have a location? if (isset($_GET['center']) && isset($db_query->alterMetaData['search_api_db_fields'][$field_name . ':lat'])) { $location = $_GET['center']; $radius = isset($_GET['radius']) && is_numeric($_GET['radius']) ? $_GET['radius'] * 1 : 5; $point = example_location_lookup($location); if (!empty($point)) { // Basically, we make a subquery that generates the distance for each adventure, and then restrict the results from that to a bounding box. // Then, once that subquery is done, we check each item that survives the bounding box to check that the distance field is less than our radius. $latitude_field = $db_query->alterMetaData['search_api_db_fields'][$field_name . ':lat']['column']; $longitude_field = $db_query->alterMetaData['search_api_db_fields'][$field_name . ':lon']['column']; $table = $db_query->alterMetaData['search_api_db_fields'][$field_name . ':lat']['table']; $sub_query = db_select($table, 'haversine'); $sub_query->fields('haversine', ['item_id', $latitude_field, $longitude_field]); // Calculate a distance column for the query that we'll filter on later. $sub_query->addExpression("69.0 * DEGREES(ACOS(COS(RADIANS(:p_lat)) * COS(RADIANS($latitude_field)) * COS(RADIANS(:p_long - $longitude_field)) + SIN(RADIANS(:p_lat)) * SIN(RADIANS($latitude_field))))", 'distance', [':p_lat' => $point['lat'], ':p_long' => $point['long']]); // Filter out anything outside of the bounding box. $sub_query->condition($latitude_field, [$point['lat'] - ($radius / 69.0), $point['lat'] + ($radius / 69.0)], 'BETWEEN'); $sub_query->condition($longitude_field, [$point['long'] - ($radius / 69.0), $point['long'] + ($radius / (69.0 * cos(deg2rad($point['lat']))))], 'BETWEEN'); $db_query->join($sub_query, 'search_distance', 't.item_id = search_distance.item_id'); $db_query->condition('search_distance.distance', $radius, '<'); } } }

And there you go.  In my example, I set up the page as search, and tested with the url: search/diner?radius=500&center=denver, and got back the Denver Diner, but not the New York Diner.

* It's not certain depending on which version of fivestar you get, but you might need to download the entity api module as well. Just in case you're following along at home.

(1) We're just going to ignore the fact that the Earth isn't a perfect sphere for the purposes of this article - there's a degree of error that may creep in, but honestly if you're trying to find locations within 300 miles of a city, there's already enough error creeping in on the 'center' of a city that the close approximation of the Haversine formula is a relief.

Categories: Elsewhere

CiviCRM Blog: The quest for performance improvements

Fri, 11/11/2016 - 16:02

After the socialist party upgraded civicrm to version 4.6 a month ago they are experiencing performance issues. In this blog I will round up our quest for performance improvements. But before that some facts about their installation.

  • +/- 350.000 contacts
  • +/- 300 users who can access civicrm and see members in their local chapter
  • +/- 2700 groups
  • There are several campaign websites linked to CiviCRM and one of their successfully campaigns leads to 7500 new contacts per week in the system
  • Running  on a VPS with 4 CPU cores and 8GB of RAM
  • around 40 active extensions

Since yesterday we have added New Relic as a monitoring tool. With New Relic we can monitor and look back in the history. We can also see all the details in each request. So we can analyze the performance. 

Above is the screenshot of the monitoring of the last 24 hours.  The red/rose squares indicates when the overall performance is poor (more than 2 seconds per request). We also see that MySQL has a big part in the  largest peaks.

The screenshots above shows the slowest queries and the slowest mysql operations. One observation is that it looks like that the MySQL delete statements are slowing the system down.

It is not clear what exactly those delete statements are or what is causing those to be slow. That is one of the questions to look into next.

Another thing we want to look into is the tuning of the MySQL database configuration and we also want to get familiar with New Relic.

Do you have any thoughts? Or did you do any performance improvements you did? We can use any help and we will keep posted about our quest for performance.


Categories: Elsewhere - Thoughts: Using Paragraphs in Drupal 8

Fri, 11/11/2016 - 15:25

When we received the new designs for the Ixis site it was evident that they contained separate design elements which were shared across several pages, from the homepage to departmental landing pages to the “About us” page. We thought this was a perfect use case for the Paragraphs module, which allows site editors to "choose on-the-fly between predefined Paragraph Types… instead of putting all of their content in one WYSIWYG body field."

Most content types on the new Ixis site contain a Paragraphs field. An editor can create multiple Paragraphs of any defined type and sort them to specify the elements and layout of the node's content.

Paragraph types can be anything from a simple text block or image to a complex and configurable slideshow. Paragraph types are essentially fieldable entities and the Paragraphs module allows the creation of these types. Each defined type can have it’s own set of relevant fields, all added via the Drupal UI and exporting to config.

So, to support the elements outlined in our page designs we added Paragraph types for:

  • Call to action - areas of bold background colour and large text;
  • Download - a downloadable asset or file;
  • Gallery - a gallery list of images;
  • Image - a single, responsive image;
  • Testimonial - a quote or testimonial;
  • Text - basic, filtered HTML edited with CKEditor;
  • Text with Callout - regular body text coupled with a styled "callout";
  • Twitter - an embedded Twitter widget;
  • Video - an embedded video from a 3rd-party site such as YouTube.

All these Paragraph types give editors some flexibility and choice when authoring a page designed with several of these elements.


The rendered output of Paragraphs entities can be altered using a paragraph.html.twig file in the site’s theme. For example:

{% set classes = [ 'paragraph', 'paragraph--type--' ~ paragraph.bundle|clean_class, view_mode ? 'paragraph--view-mode--' ~ view_mode|clean_class, cta_style ? 'cta-style--' ~ cta_style|clean_class, ] %} {% block paragraph_content %} {{ content }} {% endblock paragraph_content %}

The rendered output of each individual Paragraph type can also be affected using a suggested Twig template, for example we have paragraph--testimonial.twig.html for appropriately rendering a testimonial quote and cited author.

In some places we’ve used a field combined with a preprocess to provide multiple variations of the same paragraph. You can see this in action above with the cta_style variable which gives us a standard or inverted dark style for Call to action paragraphs.

Content Migration

During the initial content migration, we migrated directly into a Text Paragraph in the new Paragraphs field for some content types such as blog posts. To do this, we needed a new process plugin:

/** * Saves D6 Page Body field to D8 Page Paragraph (Textarea) field. * * @MigrateProcessPlugin( * id = "node_paragraph_textarea" * ) */ class NodeParagraphTextarea extends ProcessPluginBase { ... }

We used a slightly modified version of the example plugin in this article by Amit Goyal. Then in our migration.d6.node__blog.yml we removed:

... body/format: plugin: migration migration: d6_filter_format source: format body/value: body body/summary: teaser ...

and replaced with the new process plugin to instead migrate the source body into the Paragraphs field:

... field_paragraphs: plugin: node_paragraph_textarea source: body ...

In summary, Paragraphs is a great alternative to a single WYSIWYG editor for site editors who want to be able to lay out complex pages combining text, images, video, audio, quotes or any other advanced component. Here's some further reading:

Categories: Elsewhere

Valuebound: How Drupal can be used to develop data driven web application

Fri, 11/11/2016 - 13:44

Everything about building a website or a web application is not just coding and hosting an app. It includes a thorough ecosystem research and co-designing a scalable product to cooperate and compete within the networked internet of things. Drupal is the perfect platform to build large systems like CRM system or ERP system, which is complicated as well as data oriented.

The data acquired is first organized appropriately and then analyzed to make essential business decisions. Various underlying platforms serve critical aspects in the complete system, which work really well with applications developed with Drupal.  Management, governance and security are always on the top of the list when it comes to media and entertainment companies.

Building a complex website with Drupal…

Categories: Elsewhere

Sooper Drupal Themes: New Logistics Design with Glazed 2.5.4 and Carbide Builder 1.0.15

Fri, 11/11/2016 - 04:49

First of all, sorry for the late blog. This blog refers to the drupal themes updates on November 1st. I'm currently travelling China and while I rushed to get the release out before my departure, the blog had to wait a little longer.


Glazed Logistics Design And Reaching Product-Market Fit

With the release of the Logistics design we addded a unique and beautiful theme to our collection while at the same time the core products only needed minor adjustments. This is an indication that the products have achieved a state of stability and product-market fit. SooperThemes now pivots to focus more on creating new designs and features based on the current core products. Of course this doesn't mean we don't add new features at all, there will always be a need for change in a turbulent environment like Drupal frontend development. 

Creating Great Design For The Drupal Community

In the past year we have laid the neccessary ground work that is needed to provide the Drupal community with much desired high quality designs. The site building workflow with Glazed theme and Carbide Builder is incredibly fast, efficient and produces precisely designed responsive Drupal websites. This doesn't just improve productivity of our customers and our customers' content creators but also our own productivity. At this point we completely design our Glazed demos using just the theme and drag and drop builder, no photoshop or coding. This big gain in productivity really allows us to focus more on art direction, photography and design. For our logistics demo we created a set of unique 3D isometric line icons, and we curated a collection of beautiful stock photography to really create the right atmosphere for our niche design. We can afford to produce such detailed niche designs thanks to the productivity gains we made with Glazed theme and Carbide Builder. Our goal of closing the gap with the top tier multi-purpose WordPress themes is now appearing on the horizon.  

Glazed Magazine Component and Drupal 8

This stability also means we will start planning our Drupal 8 upgrade and migration paths. The next couple of months we will focus on ramping up the design release cycle and on adding a new magazine component to our Glazed CMS distribution. We want to avoid spending months on Drupal 8 migration while the Drupal 7 product offering is only at an 80% market fit. We are aiming to offer more than just great theme settings and drag and drop functionality: expect a multitude of niche designs with fully features demo content in a turn-key installation profile. We strive to become Drupal's first "Mega Theme".

Value As A Service

As a subscription Drupal shop, we really focus on building long-term relationships with our customers and with the Drupal community at large. We make decisions based on what we think provides the most value to the most people. An important part of making those decisions in listening to the community. If you can spare a minute, please write a comment on the blog and describe what you would value the most in a Drupal theme. One feature I'm think about adding to the distribution is ready-made translation configuration as an optional component in the Glazed CMS distribution, let me know in the comments if that is something you would value.

Categories: Elsewhere

Drupal core announcements: Drupal core security release window on Wednesday, November 16, 2016

Thu, 10/11/2016 - 23:44
Start:  2016-11-15 12:00 - 2016-11-17 12:00 UTC Organizers:  cilefen xjm stefan.r catch David_Rothstein Event type:  Online meeting (eg. IRC meeting)

The monthly security release window for Drupal 8 and 7 core will take place on Wednesday, November 16.

This does not mean that a Drupal core security release will necessarily take place on that date for any of the Drupal 8 or 7 branches, only that you should watch for one (and be ready to update your Drupal sites in the event that the Drupal security team decides to make a release).

There will be no bug fix or feature release on this date. The next window for a Drupal core patch (bug fix) release for all branches is Wednesday, December 07. The next scheduled minor (feature) release for Drupal 8 will be on Wednesday, April 5.

Drupal 6 is end-of-life and will not receive further security releases.

For more information on Drupal core release windows, see the documentation on release timing and security releases, and the discussion that led to this policy being implemented.

Categories: Elsewhere

Acquia Developer Center Blog: A walk through New Orleans with Shyamala Rajaram

Thu, 10/11/2016 - 21:46

A conversation with our newest community representative to the Drupal Association Board, Director at Large, Shyamala Rajaram, recorded walking to the New Orleans Convention Center during DrupalCon NOLA 2016.

Yes, I can see I need to get a gimbal or a steady cam, but the video is still fun (for me anyway) :-)

Our conversation

Mentioned in the conversation
More Shyamala on the web

Rakesh James has trained more than 600 new Drupalists - I said 200 in the recording.


A full transcription of the conversation will be added shortly!

Skill Level: BeginnerIntermediateAdvanced
Categories: Elsewhere

Lullabot: WordPress vs Drupal

Thu, 10/11/2016 - 21:00
Matt and Mike site down with a number of cross-functional Drupal and WordPress developers to talk about the differences and similarities between the platforms, concepts, and communities.
Categories: Elsewhere

Drupal Association News: Buy The Gift of Drupal

Thu, 10/11/2016 - 20:15

We’re raising funds for 2017 Drupal community programs by clearing out our Drupal merchandise. Everything must go to make room for new things to come. What better time for a big Drupal swag sale, than holiday time! Give your friend, co-worker, or favorite module maintainer a Drupal hoodie, coffee mug, t-shirt, and more.

All merchandise is 50% off. Just use the coupon code BUYBYE. Sale ends 12/31!

Visit the Store

Categories: Elsewhere

Leopathu: 6 Essential Drupal Interview Questions*

Thu, 10/11/2016 - 19:26
1. Name and describe the five conceptual layers in a Drupal system.
Categories: Elsewhere

Four Kitchens: Frontend Style Guide Miniseries: Part Two: KSS Node

Thu, 10/11/2016 - 18:32

Welcome to part two of our frontend miniseries on style guides! In this installment, we will cover the pros and cons of using KSS Node. […]

Categories: Elsewhere

Vardot: 4 Patches to Get Entityqueue on Drupal 8 Behave as it Should Be (as of November 10, 2016)

Thu, 10/11/2016 - 17:53
How to, Resources Read time: 4 minutes


  1. Add "Reverse order in admin view" option:
  2. Fix a problem that causes the queue to be always required when using "Limit to a specific entity queue":
  3. Add a tab for Entityqueue on content types:
  4. Make "Contextual links" work for views using Entityqueue:


When using the Entityqueue module in Drupal 8 as a tool for editors and site admins to order content, you will end up working on the following use cases:

  • Use case 1: Use Entityqueue as a filter: shows only the items chosen in the queue.
  • Use case 2: Use Entityqueue as a loose sorting tool: does NOT limit the items based on queue, but prioritizes the items chosen in the queue to be displayed first, then shows the rest, perhaps in a reverse chronological order.

These are the most common use cases we use at Vardot for our clients when we build a site.

Use case 1 works perfectly if you use Entityqueue as is.

However, use case 2 does not work properly. Therefore, we have contributed (or contributed to), two patches that would make life easier to build a solid experience using the Entityqueue module in Drupal 8.

Added to that, we also patched two missing features that existed in Nodequeue, and should now exist in Entityqueue for Drupal 8.

Note: this post was written in November 10, 2016, which until this date, these patches are not yet committed to Entityqueue. Please review the patches, we hope that they get committed and become part of the next Entityqueue release.

1. Queue is always required when using "Limit to a specific entity queue"

Issue link:

Needed for use case 2, you will most likely need your view to limit results to only items in the entity queue your joining in.

  2. Get the good old "Reverse order in admin view" option

Issue link:

For use case 2, this option will come in handy, since you will be sorting in reverse chronological order after the items in the queue are shown first.
Therefore, this nice workaround allows you check "Reverse order in admin view" to ensure the items in queue appear first in view when you sort.

  3. Get the good old Nodequeue tab to appear along with content tabs

Issue link:

If I'm an editor or a site admin, it wouldn't make sense to me to see the queues that I can add a piece of content to.

This tab has been missed from Entityqueue, now it comes back.

4. Get Contextual Links to send you directly to the queue edit page

Issue link:

Plans for this is to integrate with the new outside-in approach of Drupal 8.2 using the Settings Tray module.

This patch provides you as an editor or site admin, to go directly to the queue from the front end using the contextual links, instead of searching for the queue by its name from the admin view.



Let's hope these patches get committed and pushed to Entityqueue module.

This tab has been missed from Entityqueue, now it comes back.

Tags:  Drupal drupal 8 Drupal Planet Title:  4 Patches to Get Entityqueue on Drupal 8 Behave as it Should Be (as of November 10, 2016)
Categories: Elsewhere

Dries Buytaert: Content and Commerce: a big opportunity for Drupal

Thu, 10/11/2016 - 16:08

Last week Acquia announced a partnership with Magento. I wanted to use this opportunity to explain why I am excited about this. I also want to take a step back and share what I see is a big opportunity for both Drupal, Acquia and commerce platforms.

State of the commerce market

First, it is important to understand what is one of the most important market trends in online commerce: consumers are demanding better experiences when they shop online. In particular, commerce teams are looking to leverage vastly greater levels of content throughout the customer's shopping journey - editorials, lookbooks, tutorials, product demonstration videos, mood videos, testimonials, etc.

At the same time, commerce platforms have not added many tools for rich content management. Instead they have been investing in capabilities needed to compete in the commerce market; order management systems (OMS), omnichannel shopping (point of sale, mobile, desktop, kiosk, etc), improved product information management (PIM) and other vital commerce capabilities. The limited investment in content management capabilities has left merchants looking for better tools to take control of the customer experience, something that Drupal addresses extremely well.

To overcome the limitations that today's commerce platforms have with building content-rich shopping experiences, organizations want to integrate their commerce platform with a content management system (CMS). Depending on the situation, the combined solution is architected for either system to be "the glass", i.e. the driver of the shopping experience. is a nice example of a content-rich shopping experience built with Drupal and Drupal Commerce. Drupal's unique advantage for commerce

Drupal is unique in its ability to easily integrate into ambitious commerce architectures in precisely the manner the brand prefers. We are seeing this first hand at Acquia. We have helped many customers implement a "Content for Commerce" strategy where Acquia products and Drupal were integrated with an existing commerce platform. Those integrations spanned commerce platforms including IBM WebSphere Commerce, Demandware, Oracle/ATG, SAP/hybris, Magento and even custom transaction platforms. Check out Quicken (Magento), Puma (Demandware), Motorola (Broadleaf Commerce), Tesla (custom to order a car, and Shopify to order accessories) as great examples of Drupal working with commerce platforms.

We've seen a variety of approaches to "Content for Commerce" but one thing that is clear is that a best-of-breed approach is preferred. The more complex demands may end up with IBM WebSphere Commerce or SAP/hybris. Less demanding requirements may be solved with Commerce Tools, Elastic Path or Drupal Commerce, while Magento historically has fit in between.

Additionally, having to rip and replace an existing commerce platform is not something most organizations aspire to do. This is true for smaller organizations who can't afford to replace their commerce platform, but also for large organizations who can't afford the business risk to forklift a complex commerce backend. Remember that commerce platforms have complex integrations with ERP systems, point-of-sales systems, CRM systems, warehousing systems, payment systems, marketplaces, product information systems, etc. It's often easier to add a content management system than to replace everything they have in place.

This year's "State of Retailing Online" series asked retailers and brands to prioritize their initiatives for the year. Just 16% of respondents prioritized a commerce re-platform project while 41-59% prioritized investments to evolve the customer experience including content development, responsive design and personalization. In other words, organizations are 3 times more likely to invest in improving the shopping experience than in switching commerce platforms.

The market trends, customer use cases and survey data make me believe that (1) there are hundreds of thousands of existing commerce sites that would prefer to have a better shopping experience and (2) that many of those organizations prefer to keep their commerce backend untouched while swapping out the shopping experience.

Acquia's near-term commerce strategy

There is a really strong case to be made for a best-of-breed approach where you choose and integrate the best software from different vendors. Countless point solutions exist that are optimized for narrow use cases (e.g. mobile commerce, marketplaces and industry specific solutions) as well as solutions optimized for different technology stacks (e.g. Reaction Commerce is JavaScript-based, Magento is PHP-based, Drupal Commerce is Drupal-based).

A big part of Acquia's commerce strategy is to focus on integrating Drupal with multiple commerce platforms, and to offer personalization through Lift. The partnership with Magento is an important part of this strategy, and one that will drive adoption of both Drupal and Magento.

There are over 250,000 commerce sites built with Magento and many of these organizations will want a better shopping experience. Furthermore, given the consolidation seen in the commerce platform space, there are few, proven enterprise solutions left on the market. This has increased the market opportunity for Magento and Drupal. Drupal and Magento are a natural fit; we share the same technology stack (PHP, MySQL) and we are both open source (albeit using different licenses). Last but not least, the market is pushing us to partner; we've seen strong demand for Drupal-Magento integration.

We're keen to partner with other commerce platforms as well. In fact, Acquia has existing partnerships with SAP/hybris, Demandware, Elastic Path and Commerce Tools.


Global brands are seeing increased opportunity to sell direct to consumers and want to build content-rich shopping journeys, and merchants are looking for better tools to take control of the customer experience.

Most organizations prefer best of breed solutions. There are hundreds of thousands of existing commerce sites that would like to have more differentiation enabled by a stronger shopping experience, yet leave their commerce capabilities relatively untouched.

Drupal is a great fit. It's power and flexibility allow it to be molded to virtually any systems architecture, while vastly improving the content experience of both authors and customers along the shopping journey. I believe commerce is evolving to be the next massive use case for Drupal and I'm excited to partner with different commerce platforms.

Special thanks to Tom Erickson and Kelly O'Neill for their contributions to this blog post.

Categories: Elsewhere

OSTraining: How to Use the Drupal 8 Video Embed module

Thu, 10/11/2016 - 14:54

In this tutorial, I will explain how to use the Drupal 8 Video Embed module so that you can easily add YouTube videos to your Drupal 8 site.

Categories: Elsewhere

Drop Guard: Drupalers, what do you want?

Thu, 10/11/2016 - 11:50

It's no secret that Drupal's success depends heavily on the collaborative community culture and the continuous communication process between all members of the community. It’s not for nothing that we embrace the “come for the code, stay for the community” mantra.

Today we're asking you - an agency, freelancer or a lone webmaster - to think with us a little bit about the quality of security protection your service provider delivers to ensure your website and online services are running smoothly.

Security Drupal Planet Drupal Process Drupal Community
Categories: Elsewhere

Annertech: No Surprises - Using PatternLab to Build the Design Your Client Signed Off

Thu, 10/11/2016 - 11:17
No Surprises - Using PatternLab to Build the Design Your Client Signed Off

I bet this opening sounds familiar to you.

Clients sign off on designs. You build a website for them based on these designs. It looks quite like the designs, but not exactly like them. It's not your fault. It's not the client's fault. But wouldn't it be nice if you could build what the client signed off?

Why are the websites we build not exactly like what the client signs off and why is it nobody’s fault? Here’s three (good) reasons:

Categories: Elsewhere

Unimity Solutions Drupal Blog: Steps for Theme Development in Drupal 7 using ZEN Theme

Thu, 10/11/2016 - 08:59

Here are Simple steps to get started with theming for a Drupal newbee.

Categories: Elsewhere

Acquia Developer Center Blog: Contribution Stories: Amin Astaneh, using data to make better teams.

Wed, 09/11/2016 - 21:40

Drupal gets better when companies, organizations, and individuals build or fix something they need and then share it with the rest of us. Our community becomes better, stronger, and smarter when others take it upon themselves to make a positive difference contributing their knowledge, time, and energy to Drupal. Acquia is proud to play a part, alongside thousands of others, in some of the stories making tomorrow’s Drupal better than today’s. One of them is Amin Astaneh.

Tags: acquia drupal planetdevopspeopledata
Categories: Elsewhere Drupal 6 security update for Views Send

Wed, 09/11/2016 - 20:08

As you may know, Drupal 6 has reached End-of-Life (EOL) which means the Drupal Security Team is no longer doing Security Advisories or working on security patches for Drupal 6 core or contrib modules - but the Drupal 6 LTS vendors are and we're one of them!

Today, there is a Moderately Critical security release for the Views Send module to fix a Cross Site Scripting (XSS) vulnerability.

Views Send enables you to send mail to multiple user from a View.

The module doesn't sufficiently filter potential user-supplied data when it's previewing the mail which can lead to a Cross Site Scripting (XSS) vulnerability.

This vulnerability is mitigated by the fact that an attacker must have a role with the permission "mass mailing with views_send".

You can download the patch.

If you have a Drupal 6 site using the Views Send module, we recommend you update immediately! We have already deployed the patch for all of our Drupal 6 Long-Term Support clients. :-)

If you'd like all your Drupal 6 modules to receive security updates and have the fixes deployed the same day they're released, please check out our D6LTS plans.

Note: if you use the myDropWizard module (totally free!), you'll be alerted to these and any future security updates, and will be able to use drush to install them (even though they won't necessarily have a release on

Categories: Elsewhere

valechatech: Hack Proof your drupal site

Wed, 09/11/2016 - 18:25
Hack Proof your drupal site naveenvalecha Wed, 11/09/2016 - 22:55
Categories: Elsewhere