Planet Drupal

Subscribe to Planet Drupal feed - aggregated feeds in category Planet Drupal
Updated: 17 min 17 sec ago Default Search API Sorts Per View in Drupal 7

Mon, 09/11/2015 - 17:46

It's been a while since I've written a post here (especially, Drupal-related). But today I have something interesting to share.

There's a module called Search API sorts ( that provides custom sorts and a global sort block for Search API. The module itself is ok, but ...

Read now

Categories: Elsewhere

Wellnet Blog: Webprofiler meets Devel

Mon, 09/11/2015 - 16:41

Big news for all Drupal developers!
Some days ago the Webprofiler and Devel projects have been merged together.
This is a huge win for both: Devel gets a shiny new query logger and Webprofiler can reach way more developers.

Categories: Elsewhere

Drupalize.Me: Meet Project Manager Sean Lange

Mon, 09/11/2015 - 15:01

We asked Sean Lange what it means to be a project manager and for some advice from his experience. Sean is an advocate for developers and project manager at Lullabot, a fully distributed digital agency. Read more about Sean's approach to his role as a project manager in this Drupalize.Me interview, part of our Drupal roles series.

Categories: Elsewhere

Janez Urevc: When will media be ready for Drupal 8?

Mon, 09/11/2015 - 14:00

Disclaimer: This post ended up being quite long and I apologize for that. Media is a complex problem and there is a lot to be said. If you have better things to do in your life skip directly to the most important part: list of modules in D8 media space and their status. Would you like to help? See what is our current focus. Would you like to get in touch? We will be happy to talk to you!

OK. Now we're ready to start!

With Drupal 8 around the corner a lot of people started asking me when will media be ready. It was quite reasonable to expect this to start happening. Unfortunately there is no simple answer to this question. Shortest would be: "It depends.... What exactly do you need?". I know what you're thinking now... "Are you joking with me!?"

First things first

Your web browser doesn't support playing this WebM screencast.

Screencast displays WYSIWYG embedding in D8 core.

Quite some things happened since Drupal 8 release cycle started. Initially we focused on improving core itself. Improvements that were added to core are not many, but some of them are still very nice. Most noticeable for a day to day user are WYSIWYG embedding of images, multi-upload with drag'n drop support and listing of files in the system.

Your web browser doesn't support playing this WebM screencast. TODO - add multi upload screencasr

Screencast displays multi upload in Drupal 8.

Good stuff, you have to admit that. :) I hope that you already feel better... While those won't cover every possible use case are still nice improvements that most of sites will leverage from.

Drupal 8 file listing.

At some point during the D8 cycle it became clear that we won't be able to include any more major improvements in core. It was necessary to start thinking about contrib space. Discussions were started. We tried to identify what went wrong in the past and proposed ideas to make things better.

Categories: Elsewhere

OSTraining: New Video Class: Drupal 7 Security

Mon, 09/11/2015 - 11:04

This week's new video class is "Drupal 7 Security".

In this class, Robert gives a comprehensive overview of what you need to do to keep your Drupal 7 website secure.

Robert explains the importance of user permissions and the User 1 account. He talks about how to safely allow people to add content to your site.

Robert also discuesses the technical steps you need to keep your Drupal installation secure, how to store important but private files, SSLs and much more.

Categories: Elsewhere

Web Omelette: Overriding Queues in Drupal 7. Or How Not to Create Duplicate Queue Items

Mon, 09/11/2015 - 09:02

Have you ever needed to override a Queue in Drupal 7? For example, the reliable database SystemQueue? It's actually quite easy and very flexible as well. Let me first tell you the use case we are going to work with in this article.

Let's say that we want to make sure that when adding items to a queue, those items don't already exist in the queue table. That's actually a fair request in my opinion. An option would be to make a query and see if the item already exists before delegating its creation to the responsible Queue class. However, we'd have to deal with querying for serialised data and is just not performant.

A better way is to use our own DrupalQueueInterface implementation:

/** * Custom implementation of the DrupalQueueInterface */ class MyCustomQueue extends SystemQueue { /** * Overriding the method to make sure no duplicate queue items get created * but that the items are updated if the exist. */ public function createItem($data) { $serialized = serialize($data); $query = db_merge('queue') ->key(array('name' => $this->name, 'data' => $serialized)) ->fields(array( 'name' => $this->name, 'data' => $serialized, 'created' => time(), )); return (bool) $query->execute(); } }

As you can see, we are extending from the good ol' SystemQueue but overriding it's createItem() method. Instead of the db_insert() statement with which items were persisted, we are using a db_merge() statement to UPSERT the items. This means that if the items already exit, they get updated. If not, they get created. Which is exactly what we want.

Lastly, we need to make sure this class is being used for our queue. Again the solution is simple. Let's say our queue name is my_custom_queue. When requesting it like so:


... Drupal looks in the variables table for a variable called queue_class_my_custom_queue. If it finds it, it will try to instantiate a class that has the name specified as the variable value (if it also implements DrupalQueueInterface). If there is no such variable, it falls back to the default one which is SystemQueue.

So this means that our module needs to create that variable so that when we are requesting this particular queue, we get an instance of our own class. We can do this inside install and uninstall hooks:

/** * Implements hook_install(). */ function my_module_install() { variable_set('queue_class_my_custom_queue', 'MyCustomQueue'); } /** * Implements hook_uninstall(). */ function my_module_uninstall() { variable_del('queue_class_my_custom_queue'); }

And that is pretty much it. Now our queue will use the custom class we wrote and we can make sure no items are duplicated.

Hope this helps.

Categories: Elsewhere

Larry Garfield: Why I speak

Sat, 07/11/2015 - 23:51

A few weeks ago I gave a keynote presentation at PNW PHP in Seattle. It was the second time I'd given that particular talk, Eating ElePHPants, a quasi-history and lessons-learned of the process of rebuilding Drupal 7 to Drupal 8.

Overall reception was good, and afterward I was appraoched by a woman who was trying to push for better development practices and refactoring a legacy code base at her company. We've exchanged a few emails since, as she goes about trying to subvert her company's development process for its own good to introduce testing, refactoring legacy code, decoupling, and other concepts that many of us on the conference circuit take for granted.

In the course of that email conversation, she had this to say:

When I first started with this entire effort about 2 months ago, I thought I will never succeed, and I thought I had set myself up to failure - until I heard you speak about your experience. Your talk was highly inspiring and got me excited to invest more time into what I was doing and I believed in myself for the reasons I chose this effort.

And later...

All the tech talks helped me realize that I can get somewhere, made it seem within reach, but you and Adam Culp [who also gave a session on refactoring] left me inspired.

read more

Categories: Elsewhere

Drupal Association News: What’s new on - October 2015

Fri, 06/11/2015 - 23:33

Look for links to our Strategic Roadmap highlighting how this work falls into our priorities set by the Drupal Association Board and Working Groups.

Drupal 8 will be released on November 19th!

Drupal 8 is finally on its way and no-one is more excited than we are. The Association plays a critical role in providing the supporting infrastructure and developer tools that make the release of Drupal possible. In September we focused hard on making sure was ready for the Release Candidate, and now we have a final release date for Drupal 8.0.0 of November 19th!

Releasing the next major version of Drupal is no small endeavor. In October we focused hard on ensuring there will be no infrastructure blockers for the release of Drupal 8. We also spent time designing the release page and improvements to the download experience which we will implement before release day.

What better reason than the release of Drupal 8 to celebrate? We've added a category for Drupal 8 release parties to - so please post your events there, or look there for one to attend!

Drupal Association Membership Campaign

With the imminent launch of Drupal 8, now is a better time than ever to become a member of the Drupal Association. In mid-October we launched a membership campaign with the goal of adding an additional 1,000 members to our current base of 3,200 and raising an additional $100,000.

To support this campaign we placed a banner on asking for your support, and asking existing members to share the campaign. The campaign will end on December 30th, and with your help we can sustainably fund ongoing improvements to like the ones you see here every month.

The Roadmap Content Strategy Documentation Section

Overhauling documentation on continues to be a top priority coming out of our Content Strategy work. As we continue to build out the features that will be the building blocks of the new Sections on, we want to gather feedback about how our existing users are using the Documentation pages and what improvements are needed.

We've added a survey in the lower right hand corner of every documentation page so that users can provide that feedback before our next round of implementation work.

About - Breadcrumbs in Beta

We're also prototyping some of the new features that will be part of the toolbox for Sections on A small feature, but a welcome improvement, is the addition of breadcrumb navigation in the new Section content types. Right now you can see a beta of this in the About section.

Search Improvements

In October we continued our efforts to improve the utility of search on Just in time for the release of Drupal 8, developers can now search for api functions through the search box and receive results from


In October we enabled DrupalCI testing for Drupal 7 and Drupal 6. We are now in the process of validating that testing for these legacy versions is functioning correctly before disabling legacy testbots and statically archiving Drupal 8 testing on the legacy system has already been disabled.

We are also focusing on tuning DrupalCI to economize the testing process. Each Drupal 8 core test job runs over 12,000 tests containing approximately 100,000 code assertions. From September to October we have reduced the average time to complete a core test from 40 minutes to 30 minutes and the average cost of a full test job from $0.37 to $0.24. However, with around 12,000 test jobs run in the past month alone (that's 14,400,000,000,000 assertions!) we will continue to look for ways to manage this expense while providing a better, faster testing service for Drupal code.

Spam Fighting
From Wikimedia Commons
by user Qwertyxp2000

The announcement of Drupal 8's release candidate lead to a surge in spam activities on, and the Drupal Association pivoted to respond, both by fighting the spam directly and by developing new tools for reporting, blocking, and preventing spam for ourselves and the community volunteers who help to fight spam on every day. We made the following changes:

  • We upgraded Flag module to version 3.
  • Our report spam links on now use Flag.
  • We built new views for spam fighters to manage content reported as spam.
  • We increased our rate limiting to prevent bulk submissions.
  • We removed automatic granting of higher user roles - there are now enough Community level users on to confirm new users manually.
  • We eliminated spam targets by fixing content filtering to rel="nofollow" user submitted links in more places.

Going into November we are hoping to implement some new tools from our Technology Supporter Distil Networks to help prevent spam registrations before they occur.

Revenue Related Projects (Funding our work)

Beyond the membership campaign we're continuing our regular work on upcoming DrupalCons. Registration for DrupalCon Asia—the FIRST DrupalCon after the release of Drupal 8!—will open soon. We're very excited to celebrate Drupal 8's release with the local community in Mumbai and with the wider community in Asia.

Design work for DrupalCon Dublin is ongoing in anticipation of the full site launch. In consultation with the local community we have some great design concepts that will really tell the story of Drupal in Dublin. We think you'll really enjoy it!

Sustaining support and maintenance Faster Development Environments

Deploying a hosted development environment for contributing to is one of the critical services provided by the Drupal Association. These environments are used both by our internal staff and by community volunteers who are creating features for As recently as a year ago it has taken up to 3 hours to spin up a new development environment. As recently as September it took around an hour and twenty minutes.

By providing our sanitized nightly snapshot of the database as a docker container we're now able to provide new development environments for in approximately 10 minutes. Even in a short time this has improved our feature development velocity.

Upgrades and Improvements

In addition to improving our development environments, we've focused on upgrading our the operating system on many of our servers to CentOS 6.7, and making sure that our Solr infrastructure is highly-available.


As always, we'd like to say thanks to all volunteers who are working with us and to the Drupal Association Supporters, who made it possible for us to work on these projects.

Follow us on Twitter for regular updates: @drupal_org, @drupal_infra

Personal blog tags: whats new on
Categories: Elsewhere

Drupal core announcements: Drupal 8.0.0-rc4 on Thursday, November 12, 2015

Fri, 06/11/2015 - 22:22
Start:  2015-11-12 16:00 - 17:00 America/Chicago Organizers:  xjm catch Event type:  Online meeting (eg. IRC meeting)

In preparation for the scheduled release of Drupal 8.0.0 on Thursday, November 19, we will create the final release candidate for Drupal 8.0.x, Drupal 8.0.0-rc4, on Thursday, November 12. We have added this release candidate in addition to the scheduled release windows to provide a final testing target for changes during the RC phase. (Unlike other release candidates, this release window will not include a 24-hour code freeze.) Plan to help test this final release candidate for bugs and regressions during the final week before 8.0.0's release!

Following RC4, we will further restrict the patches we commit to severe bugs or regressions and documentation fixes only, at committer discretion. So, if you have any allowed RC changes underway, plan to complete them by November 12.

There will not be a separate release candidate on November 18. (The November 19 release date is an extension of the November 18 release window.)

Categories: Elsewhere

DrupalCon News: Session Submissions In Review

Fri, 06/11/2015 - 20:50

Thank you for all of the session submissions for DrupalCon Asia! In true Drupal fashion, we had a huge surge in the last few days/hours of session submissions to bring us to a total of 349! We are already busy working to make our selections, but check out some stats about the process in the meantime.


Categories: Elsewhere

Pantheon Blog: Easily Install Drush with a Phar

Fri, 06/11/2015 - 19:45
Composer has helped quite a lot in the area of installation and dependency management for Drupal and Drush; however, users who want to get a quick start with Drush are sometimes put off by the Composer-based install.  As of the Drush 8.0.0-rc3 release, it is now possible to install Drush using a phar. This requires fewer steps than the previous method. First, navigate to the Drush project page at
Categories: Elsewhere

Advomatic: Upgrading to Drupal 8: through the client’s eyes

Fri, 06/11/2015 - 19:17

The Northwest Atlantic Marine Alliance (NAMA) advocates for healthy marine ecosystems. Through their site,, they organize and promote a movement toward a thriving ocean and a just seafood system. Having helped create the original Drupal 6 site for NAMA in 2008, it’s been a rewarding experience re-architecting it in Drupal 8 (beta). The main purpose... Read more »

The post Upgrading to Drupal 8: through the client’s eyes appeared first on Advomatic.

Categories: Elsewhere

Acquia Developer Center Blog: Drupal and the Raspberry Pi

Fri, 06/11/2015 - 18:37
Jeff Geerling

For the past few years, I've been fascinated with credit card-sized budget computers, most especially the one that started the current revolution in hardware hacking, the Raspberry Pi.

Tags: acquia drupal planetdrupal 8internet of thingsraspberry piansibledevops
Categories: Elsewhere

InternetDevels: Drupal 8 release: great parties are on the way!

Fri, 06/11/2015 - 16:39

Great news about the "great 8" brought to you by InternetDevels Drupal team ;)

Drupalers, hold your breath and count to 8! This moment is approaching! “The great 8” A.K.A Drupal 8 will be finally released on November 19. Yes, officially! Yes, for sure! :)

Read more
Categories: Elsewhere

Zengenuity: October's Most Interesting New Drupal Modules and Themes

Fri, 06/11/2015 - 14:05

Some of the most interesting new modules and themes I saw posted to in October:

Views Manager [sandbox]

Gives you vertical tabs on the Views admin page, separating Views by their tags.


Allows for speedier page loads for authenticated users. First you send the fast, cached parts of the page, then fill in the expensive parts when they are ready.

Accelerated Mobile Pages (AMP)

Make your Drupal site ready for Accelerated Mobile Pages. Right now, it only adds the AMP javascript library, but the plan is to serve AMP pages directly from Drupal.

OG Multiple Paths [sandbox]

This module creates multiple paths for the same node using Organic Groups and Pathauto. It’s not best practice for SEO, but it’s nice in situations where content is posted to multiple groups, and you want the node path to reflect the group context the user is currently in.

Menu Link Field

Provides a field similar to the menu link form on node forms but for any entity type.

Human Behavior

An anti-bot technology that looks for mouse movement and mobile device touch events to determine if a bot is filling out a form.

Views Numeric Range Filter [sandbox]

It gives you a numeric filter for Views that includes a +/- tolerance. So you can say 100 +/- 10%, and it will give you results between 90 and 110. Neat!

Address Field Lookup [sandbox]

Integrates the Address Field module with validation services to correct address formatting issues.

Features Export Explode

Breaks your features into a bunch of different files, which makes it easier to see what changed when you review a git commit. For example, it breaks each view out into its own file.


An example theme for Drupal 8 that shows you how to use the new features of the D8 theme system. Heavily commented to explain your options.

Commerce Cart Link

Provides a new field formatter for Add to Cart fields attached to Commerce products and product displays that is a simple link, rather than a form. This way users can buy a product without invoking the full Form API on each product item.

CRUD log

Captures and logs all node CRUD operations, “create”, “read”, “update” and “delete”. This module logs the events in a custom table and exposes the data to Views. It allows you to select which operations will be captured, so you can turn off read events if that is too verbose.

User Moderation [sandbox]

A user moderation system that uses votes from other users to decide if a user is a spammer or not.

Responsive Menu Combined

Allows you to combine multiple menus into the responsive hamburger menu with tabs in it.

Mailsuite [sandbox]

Provides a unified administration interface for managing the templates of all the emails you send from your Drupal site.

Twig PHP Filter

Ha! If you love doing everything wrong and putting PHP code in your template files, this is the Drupal 8 module for you. If you’re slightly less crazy and only want to query the DB from your twig files, then the new Little Bobby Tables module may be a “better” choice.

Categories: Elsewhere

Microserve: Drupal Migration Tips

Fri, 06/11/2015 - 10:32
Drupal Migration TipsNov 6th 2015

As part of our recent work on, we performed a large data migration and transformation of hundreds of thousands of rows of data into their new Drupal 7 site, including users, taxonomy terms, nodes and comments. We did this using a combination of the migrate, migrate_d2d and migrate_extras modules, as well as a custom module to house all of our own migration code. During this process, I’ve collated some tips and tricks that I found useful.

Use Drush

I’d suggest tha tyou use Drush to run the migrate commands rather than using the Migrate UI. I’ve found it to be more robust because I’ve had migrations fail when being run via the migrate UI, only to run successfully when executed via Drush.

There are the main Drush migrate commands that you can run:

$ drush migrate-import (mi) $ drush migrate-stop (mst) $ drush migrate-reset-status (mrs) $ drush migrate-rollback (mr)

To see a full list of the available Drush Migrate commands, run $ drush --filter=migrate.

Use prepareRow() and drush_print_r()

If you’re used to using functions like dpm(), dsm() or kpr() in your module code to find out a value of a variable, or what properties an array or object has, there's a similar function in Drush - drush_print_r(). This outputs data to the screen in the same way that PHP’s print_r() function does.

I tend to use it within the prepareRow() method to see what data is available within the $row object.

protected function prepareRow($row) { drush_print_r($row); }

If you are using migrate_d2d or extending another class, remember to use parent::prepareRow() to add to the preparations in the parent class rather than overridding them, and also to skip the row if was skipped in the parent class.

class RoadccPageNodeMigration { ... protected function prepareRow($row) { if (parent::prepareRow($row) === FALSE) { return FALSE; } } } Limit the Number of Items that You Are Importing

Rather than waiting for an entire migration to run to confirm if your latest script amend or addition worked, you can run a migration on a reduced number of items by using the --limit option.

drush mi RoadccPageNode --limit=”10 items”

You can limit by the number of items, such as "10 items", or by the amount of time, such as "60 seconds".

Update, not Rollback

You can also save time by using the --update option to update any already-imported rows, rather than rolling back and removing them, then re-importing.

drush mi RoadccPageNode --limit="10 items" --update Use addSimpleMappings()

As part of each migration, you need to map the source values to the approprate destination using the addFieldMapping() method. For example:

$this->addFieldMapping('destination', 'source');

If, however, the source and destination names are the same, you can use the addSimpleMappings() method. This just takes a list of property names in an array and automatically uses each one as both the source and the destination.

$this->addSimpleMappings( array( 'uid', 'created', 'changed', 'field_foo', ... ) );

If you are using migrate_d2d then some of the common properties - e.g. uid, created, changed - will already be mapped in this way in the parent class.

Use addUnmigratedSources() and addUnmigratedDestinations()

If you use the Migrate UI, then you may see messages like the one in this image. In this example, there are 108 unmapped destination properties, although the same can happen for sources (properties attached to the data being imported). These may be intentionally not mapped, a newer source database has added more sources following a schema update, or a new module has been installed and has added more destinations.

If you do mean to intentionally not map a source or a destination, then use the addUnmigratedSources() and/or the addUnmigratedDestinations() method within your constructor after declaring your field mappings.

Both methods take an array of property names to declare as unmigrated, and will therefore mark them as mapped and remove the error.

public function __construct(array $arguments = array()) { ... // These fields are not being migrated, so mark them as such. $this->addUnmigratedDestinations( array( 'field_one', 'field_two', 'field_three, ) ); }

This makes it much clearer when you or a colleague re-visits this migration at a later date that these were intentionally not mapped and not forgotten about or were not present when the migration class was written.

Write your own base Migration Classes

Because migrate is based on object-oriented classes, these can be extended and customised as needed, making them extremely flexible. I’ve found this to be very useful when I needed to do something that needed to apply to all migrations, such as getting the database connection, or something affected all migrated nodes, such as replacing full URLs with relative ones so that they work on different environments, or mapping the source node ID values to the destination ones.

This is done by writing our own abstract classes that extend the default ones such as Migration or DrupalNode6Migration. Because we’re using the abstract keyword before the class name, we ensure that these classes cannot be instantiated directly, and must be extended by another class.

Extending a Normal Migration Class class RoadccMigration extends DrupalMigration { protected function getConnection($connection = 'migrate') { return Database::getConnection('default', $connection); } }

In this example, we can use $query = $this->getConnection() as the starting point for any classes that extend RoadccMigration, and then continue building the query using the db_select() syntax. This means that there is less duplication within our custom classes, and it makes it easy to update if needed as it’s only declared once.

Extending a migrate_d2d Class abstract class RoadccNodeMigration extends DrupalNode6Migration { public function __construct(array $arguments = array()) { parent::__construct($arguments); } protected function prepareRow($row) { // Update any absolute URLs. foreach (array('body', 'teaser') as $property) { if (isset($row->{$property})) { if (strpos($row->{$property}, '')) { $row->{$property} = str_replace('', '', $row->{$property}); } if (strpos($row->{$property}, '')) { $row->{$property} = str_replace('', '', $row->{$property}); } } } } }

In this example, we’ve extended the DrupalNode6Migration class from the migrate_d2d module, and are performing some transformations on the body and teaser values - removing the full URL so that users aren’t redirected back to the original production site rather than to their intended destination.

As all of our node migrations extend RoadccNodeMigration, this automatically applies to all nodes imported via the migration.

Limit your Result Set

If you need to test something, like if all of your field mappings are working, I found it beneficial to find a small collection of examples that would cover all use cases, and then limit the query so that the migration would only affect those nodes, rather than reguarly searching for the right examples to test against.

If you’re writing normal migrations you can do this in your __construct() method as part of your query. If you’re extending a migrate_d2d class, then you’ll need to add your own query() method and add the additional conditions to the query from the parent class.

For example:

class RoadccPageNodeMigration extends RoadccNodeMigration { ... protected function query() { // Get the query from the parent class. $query = parent::query(); // Add any new conditions. In this case, just filter on this single node. $query->condition('n.nid', 123456); // Return the new, full query. return $query; } }

This means that you can quickly re-run that migration and see how your changes affected the result, if at all, rather than waiting for the entire migration to be re-run on of hundreds or thousands of nodes.

Just remember to remove the test conditions when they are no longer needed. If you use Git for version control, I’d suggest using git add -p to interactively add chunks of code to the staging area, allowing you to review each one and keep your code repository clean of any test conditions.

Written by: Oliver Davies, Senior Drupal Developer

Microserve is a Drupal Agency based in Bristol, UK. We specialise in Drupal Development, Drupal Site Audits and Health Checks, and Drupal Support and Maintenance. Contact us for for further information.

Categories: Elsewhere

Drupal Association News: Why is Module X slow? Or is it really module Y? Debugging performance at scale

Fri, 06/11/2015 - 00:48

Its an exciting time to be working on! Content strategy is being implemented, and thus we've been evaluating and implementing modules, including:

  • Organic Groups
  • Panels
  • Page Manager
  • Panelizer
  • Flag 3.x (already implemented for spam)

There are numerous reasons why we're looking at using these modules, but one of them is because we're able to see them in action on Panelizer was being called out as one of the least performant of these modules. This was due to a slow query that was observed at Drupalcon Barcelona:

SELECT * FROM {panelizer_entity} WHERE entity_type = :entity_type AND entity_id IN (:ids)

For each entity that gets loaded, panelizer needs to grab the associated panelizer_entity ID and load it up for preperation to view. While this isn't a problem for a few nodes, it doesn't scale when you're querying 100s or thousands of them:

2015.09.23.mysql-slow.gz:2015-09-23T09:41:14.147976+00:00 db5 mysql-slow: EXPLAIN SELECT * FROM panelizer_entity WHERE entity_type = 'node' AND entity_id IN ('171', '177', '179', '181', '183', '185', '189', '193', '199', '201', '209', '211', '213', '215', '217', '219', '221', '225', '227', '229', '233', '235', '239', '243', '245', '247', '249', '251', '253', '255', '277', '279', '281', '287', '289', '291', '293', '295', '297', '301', '303', '305', '307', '309', '311', '313', '317', '319', '321', '323', '325', '327', '335', '337', '343', '347', '349', '351', '353', '359', '363', '367', '381', '385', '389', '391', '397', '399', '403', '405', '407', '409', '411', '413', '415', '417', '419', '421', '423', '427', '429', '431', '433', '435', '437', '439', '441', '443', '449', '451', '453', '455', '459', '461', '463', '465', '467', '469', '471', '473', '475', '477', '479', '481', '483', '485', '489', '495', '497', '499', '501', '503', '505', '507', '509', '511', '513', '515', '517', '519', '521', '523', '525', '527', '529', '531', '533', '535', '537', '539', '541', '543', '545', '547', '549', '551', '553', '555', '557', '559', '561', '563', '565', '567', '569', '571', '573', '575', '577', '579', '583', '585', '589', '591', '593', '595', '597', '599', '601', '603', '605', '607', '609', '611', '613', '615', '617', '619', '623', '631', '633', '635', '637', '639', '641', '643', '645', '647', '649', '651', '653', '655', '657', '659', '661', '663', '665', '667', '669', '671', '673', '675', '677', '679', '681', '683', '685', '687', '689', '691', '693', '695', '697', '699', '701', '705', '707', '709', '711', '713', '715', '717', '719', '721', '723', '725', '727', '729', '731', '733', '735', '737', '739', '741', '743', '745', '747', '749', '751', '753', '755', '757', '759', '761', '763', '765', '767', '769', '771', '773', '775', '777', '779', '781', '783', '785', '787', '789', '791', '793', '795', '797', '799', '801', '803', '805', '807', '809', '811', '813', '815', '817', '819', '821', '823', '825', '827', '829', '831', '833', '835', '837', '839',

Additionally, there is this issue: -- this discusses the potential issues around loading the panelizer settings and some solutions, including adding a lazy loader to get the entity but not load up all the settings until say, view time.

It is apparent that we have an issue on our hand. But was it panelizer?

First -- I would suggest watching Ezra Gildesgame's talk on XHprof. It will give you some ideas about how to troubleshoot performance issues.

Secondly, I'd suggest getting a monitoring tool to average your performance over time. This is also possible to do with XHprof, but thats for another post.

At the Association, we use New Relic for server monitoring. While the full version can give you some really detailed results, our version gives us an overview. Here is a snapshot of what was happening when panelizer was being suspected as slow:

When we take a look at the modules that are being executed, it gives us a little more information about what modules are going slow:


If you don't have New Relic, you can still get this data by setting up XHprof and going to the affected page. It should give you similar results. One nice feature of New Relic is that it gives you XHprof (ish) results for past performance problems. Unless you're profiling every page (which is not recommended for production), you won't have a snapshot result of what happened when the site was going slow.

Looking at the New Relic logs and the query, we know three things:

  1. This issue is happening on node_add
  2. This issue is affecting nodes that are related to sessions only. (If you pop in those node ids in the query to
  3. Entityreference module load time correlates to the database slow query time.

So what things could cause multiple session nodes to occur?

  • View of many nodes, like a schedule
  • field or panel on a node/add page that is making a query of entities
  • Session counts (although that would be quite unperformant, loading a node just to get its count.. but I've seen worse things happen)
  • an entity reference field

By looking at the New Relic logs, there isn't any reference to the view module causing a problem. This is also during node_add, which doesn't call any views. While cod_sponsors or products might be an (separate) issue, they their peak loads are not occuring at the same time as the db query. That leaves us with entity reference. This hits as the top module at the same time as the panelizer query is being executed.

What node/add pages are using entity reference for sessions?

Only one. Session Evaluations.

Here we are using entityreference prepopulate, which shows the session thats being evaluated. But, there is a problem with this...

So there is the issue. Why didn't this occur in LA? because there were half as many sessions. Its also why we never saw it in any previous drupalcon, because the sites were singular so performance issues like this wouldn't ever have enough content to show its face.

Conclusion / Take aways

  • While there might be some architecture tweaks that could be done to Panelizer, it was not the key issue. 
  • The issue is the combination of modules, exasperated by the amount of content. Entityreference + Entityreference Prepopulate (Disabled select field) + Panelizer + Two cons worth of content = Problem.
  • Don't assume a module is slow or unperformant from a single query.
  • When an issue is found, don't guess, investigate.
  • XHProf and New Relic are essential for large drupal sites.

A simple tweak to the entity reference field has fixed the problem for now. Before the next con, we'll implement some better methods of showing the title so this doesn't occur again. In fact there is already an issue for it.

Of course, this is just one potential issue - but this method demonstrates that a monitoring tool like New Relic plus performance profiling tools like XHProf can allow you to find unexpected interactions between modules that may result in performance problems at scale. Luckily, our fixes translate into fixes for the whole community. This means not only a better, but a better Drupal product.

Categories: Elsewhere

Out & About On The Third Rock: An Engagement Manager’s guide to site building in Drupal 8 – week 01

Fri, 06/11/2015 - 00:05
More a log than a guide, but you get the idea! Day 0 Many a weeks before Day 1! started putting a backlog together, the site is for an Open Social Transformation project, its open sourcing the materials designed and developed for Peace Through Prosperity’s social transformation programs that have had epic results so far. The […]
Categories: Elsewhere

Axelerant Blog: Drupal Staff Augmentation: Finding Partner Value

Thu, 05/11/2015 - 20:00

If you’re looking to hire for a Drupal project, Drupal staff augmentation may make the most sense for your organization. Drupal migration projects, site builds, support and maintenance, DevOps consultations—these all fall under this umbrella service. Growing your Drupal staff with an external agency is retractable, scalable, affordable, and smart. And it’s time to choose a partner.

What Should You Consider First?

How About What You’re Most Afraid Of.

Failure. If you’ve been in the business long enough you know, you should be considering the ramifications first. It can’t be overstated: if you don’t bring in the talent to do it right, you need the time (and the budget) to do it over.

Signing off on an insourcing deal without looking beyond the pitch, the branding, or a brief preliminary review is never a good idea. With concerns duly noted, it’s time to focus on value.

Your Organization Wants Value, Right?

So What Does Your Organization Value?

A natural next step after defining concerns should be determining values. Drupal staff augmentation means you’re choosing the best Drupal agency to be your extension, a valued partner.

This partnership has to be on respective terms, conditions, and most of all shared values. Discerning the similarities or irreconcilable differences is what’s important here.

Every organization is different but when it comes to values, there’s sure to be overlap. What does your organization value when it comes to staffing? Here are six suggestions to get you thinking:

1. Thought Leadership. Drupal augmentee agencies should cherish and exude thought leadership as much as your organization. These will likely be different areas of thought leadership—you’re in different industries—but the value is the same.

Look for innovation in unique projects. Thought leadership isn’t always that recognizable. While an agency can be respected for forward thinking, it may not be applauded.

Competitive rhetoric dominates most industries, so it’s best to look through agency contributions, portfolios, case studies, and convention session topics.

2. Serious Discipline. Levels of due diligence and focus aren’t things that can be taught easily, right? It’s something you learn to appreciate in yourself and other people. As far as values go, this one is essential.

What’re some signs of this? Work environments that promote discipline. Remote offices and telecommuting practices speak an awful lot about a staff’s discipline. Without this value—it’s more of a virtue—nothing would get done.

3. Real Savings. You want to make a deal, and you want the better half of it. If your prospective partner values savings, so will they. There’s nothing wrong with healthy negotiation. The alternative is scrambling for your business; a reckless disregard for the worth of their services. Your organization has likely turned down bad business before. A staff augmentation partner would do the same.

Your partner should understand this too. You’ll know if they share this value with you if they refuse blatant low balling. Desperation isn’t a sign of fiscal responsibility.

See if there are any big names, big projects—launching or re-launching one of the top websites in the US should count. You can bet these projects played well for the agency financially.

4. Timely Results. The bottom line is this: you want results that are on time and budget. Without results oriented success, you’ve got nothing—literally. This should be significant to all of your staff members and even more so your augmented ones.

There are things to look for. Check to see if your prospect publicly mentions deadlines, agency self-organization, and DevOps practices. These are signs that the agency values timely, results oriented success.

Next, you’re going to have to go beyond this and look into their project management processes. Agile frameworks. This is what you should be looking for.

5. Reputation. Poor standing within respective communities isn’t a good sign for obvious reasons. And the reputation the prospect has based on staff member reviews should be just as valued.

If there are challenges to the provider’s reputation—or yours—this may be indicative of a lack of care to respond to allegations of mismanagement or a hostile work environment.

What do the employees say? If there has been public, verifiable negligence against current or former team members (look at recent Glassdoor reviews and responses), then pass them by.

Public disgruntlement is a serious red flag when it comes to Drupal staff augmentation specifically. You want your staff augmentation team to be well treated, and you don’t need a tarnished reputation for partnering with a problem agency.

6. Likeability. It’s true that surveys show that likability is a key part of getting hired. There are some who believe this doesn’t matter, and that quantified, qualified results are the only things that do.

When it comes to partnerships involving teams, this should matter a whole lot. You’re going to be collaborating, perhaps on a daily basis.

Ask yourself: do I want to work with these people? Don’t go basing everything on first impressions, but consider the whole picture.

Teams should exude a fun, playful atmosphere. What you want are staff members who take their work seriously without taking themselves too seriously.

Drupal staff augmentation is really like hiring new employees. Consider what you’re hiring process is like and what it’s meant to do. When onboarding staff, hiring managers are looking to discover if their values line up with the company.

While it’s probably not smart to build a team of only the like-minded, creating a team with shared values when it comes to production, your industry, and accomplishments makes sense. So it is with Drupal agencies that offer staff augmentation.
Think we might be a match? Tell us what you value.

The post Drupal Staff Augmentation: Finding Partner Value first appeared on Axelerant.

Categories: Elsewhere

Acquia Developer Center Blog: Lessons Learned from an Early Drupal 8 Project

Thu, 05/11/2015 - 17:09
DC Denison

With the official release of Drupal 8.0.0 on the horizon, "real world" Drupal 8 stories are becoming more valuable.

Now that the train is actually approaching the station, we all want to know what it will be like to get on. 

Mediacurrent, a leading Drupal design firm, got their Drupal 8 ticket punched early. They partnered with Acquia to launch a Drupal 8 site for Manhattan Associates, a supply chain management software provider, back in August, 2015, when Drupal 8 was in beta. The site has been on the Drupal 8 frontier ever since. 

So what has the experience been like? 

A "real world Drupal 8" series from Mediacurrent and Acquia has been telling some backstories. 

Tags: acquia drupal planet
Categories: Elsewhere