Planet Drupal

Subscribe to flux Planet Drupal - aggregated feeds in category Planet Drupal
Mis à jour : il y a 22 min 57 sec

Paul Booker: Sending Push Notifications to users with a given role using Private Messages

sam, 08/11/2014 - 18:27
/** * Implements hook_privatemsg_message_insert. */ function push_notifications_privatemsg_message_insert( $message ) { if ( variable_get( 'push_notifications_privatemsg_integration', 0 ) ) { // Compose the payload. If the body is empty, just use the subject line. // Otherwise, combine subject and body. $payload = (empty($message->body)) ? $message->subject : $message->subject . ' ' . $message->body; $payload = 'From ' . $message->author->name . ': ' . $payload; // Compose an array of recipients. $recipients = array(); foreach ( $message->recipients as $recipient ) { if ( $recipient->type == "role" && $recipient->name != 'authenticated user' ) { $results = db_select('users_roles', 'ur') ->fields('ur', array('uid')) ->condition('ur.rid', $recipient->rid, '=') ->execute() ->fetchCol(); } elseif ( $recipient->type == "role" && $recipient->name == 'authenticated user' ) { $results = db_select('users', 'u') ->fields( 'u' ) ->execute() ->fetchCol(); } if ($recipient->type == "role") { foreach ($results as $result) { $recipients[] = $result; } } else{ $recipients[] = $recipient->uid; } } push_notifications_send_message( $recipients, $payload ); } } Tags: URL: Push Notification does not send Push when Private Message goes to Roles
Catégories: Elsewhere

Entity Pilot: The Entity Pilot exists plugin - dealing with conflicts

sam, 08/11/2014 - 05:06

Any content-staging workflow is going to have conflicts. In the simplest form a conflict exists when trying to import content that already exists. In more complex cases conflict might occur between revisions.

Having a solid API to detect and handle conflicts is key to any content-staging workflow. Read on to find out how Entity Pilot handles conflicts via an extendable plugin system.

Catégories: Elsewhere

Entity Pilot: Working with normalizers in Drupal 8

sam, 08/11/2014 - 05:06

Entity Pilot makes extensive use of normalizers for handling dereferencing incoming content.

Normalizers are a key part of Drupal 8's serialization strategies and represent a flexible extension point for your module to interact with core APIs.

Read on to learn how your code can interact with Drupal's normalizing and denormalizing operations and influence what is output by the REST and Hal modules.

Catégories: Elsewhere

Entity Pilot: Introducing Entity Pilot - Painless content staging for Drupal

sam, 08/11/2014 - 05:06

After nine months of development, we're proud to announce Entity Pilot, a painless content-staging solution for Drupal.

Offering a flexible content deployment model that adapts your preferred workflow, Entity Pilot aims to solve deploying content once and for all.

Read on for details on how it works and our plans for future development.

Catégories: Elsewhere

Paul Booker: Updating push notification page to send out messages to devices belonging to users with a given role

sam, 08/11/2014 - 01:49
/** * Additional handler for push_notifications_mass_push_form_validate form validate. */ function mymodule_push_notifications_mass_push_form_validate($form, &$form_state) { } /** * Additional handler for push_notifications_mass_push_form_submit form submit. */ function mymodule_push_notifications_mass_push_form_submit($form, &$form_state) { $recipients = $form_state['values']['recipients']; $payload = $form_state['values']['payload']; $role = $form_state['values']['role']; $language = (isset($form_state['values']['language'])) ? $form_state['values']['language'] : false; // Send message to all iOS recipients. if (!empty($recipients['ios'])) { // Get all iOS recipients. $tokens_ios = push_notifications_get_tokens_by_role(PUSH_NOTIFICATIONS_TYPE_ID_IOS, $role, $language); if (!empty($tokens_ios)) { // Convert the payload into the correct format for APNS. $payload_apns = array('aps' => $payload); $result = push_notifications_apns_send_message($tokens_ios, $payload_apns); $dsm_type = ($result['success']) ? 'status' : 'error'; drupal_set_message($result['message'], $dsm_type); } else { drupal_set_message(t('No iOS recipients found, potentially for this language.')); } } // Send message to all Android recipients. if (!empty($recipients['android'])) { // Get all Android recipients. $tokens_android = push_notifications_get_tokens_by_role(PUSH_NOTIFICATIONS_TYPE_ID_ANDROID, $role, $language); if (!empty($tokens_android)) { // Determine which method to use for Google push notifications. switch (PUSH_NOTIFICATIONS_GOOGLE_TYPE) { case PUSH_NOTIFICATIONS_GOOGLE_TYPE_C2DM: $result = push_notifications_c2dm_send_message($tokens_android, $payload); break; case PUSH_NOTIFICATIONS_GOOGLE_TYPE_GCM: $result = push_notifications_gcm_send_message($tokens_android, $payload); break; } $dsm_type = ($result['success']) ? 'status' : 'error'; drupal_set_message($result['message'], $dsm_type); } else { drupal_set_message(t('No Android recipients found, potentially for this language.')); } } } /** * Determine all recipients of a given role from a specific device type. * * @param $type_id * Device Type ID. * @param $role * User Role. * @param $language * Language code, optional. * @param $raw * Boolean, set true to retrieve the raw query results. * * @return * Array of results, null if no entries. */ function push_notifications_get_tokens_by_role($type_id = '', $role = FALSE, $language = FALSE, $raw = FALSE) { // Make sure this type_id is supported. $valid_type_ids = array(PUSH_NOTIFICATIONS_TYPE_ID_IOS, PUSH_NOTIFICATIONS_TYPE_ID_ANDROID); if (!in_array($type_id, $valid_type_ids)) { return FALSE; } // Select all tokens for this type id and users of given user role. $query = db_select('push_notifications_tokens', 'pnt'); $query->join('users', 'u', 'pnt.uid = u.uid'); $query->join('users_roles', 'ur', 'u.uid = ur.uid'); $query->fields('pnt', array('token')); $query->condition('pnt.type', $type_id); $query->condition('ur.rid', $role); // If language code is passed, limit the results by language. if ($language) { $query->condition('pnt.language', $language); } $result = $query->execute(); // Return raw result, if needed. if ($raw) { return $result; } // Otherwise, create an array of tokens. else { $tokens = array(); foreach ($result as $record) { $tokens[] = $record->token; } return $tokens; } } /** * Implements hook_form_alter(). */ function mymodule_form_alter(&$form, &$form_state, $form_id) { if ($form_id == 'push_notifications_mass_push_form') { $result = db_select('role', 'r') ->fields('r',array('rid','name')) ->condition('name',array('administrator','anonymous user'),'NOT IN') ->execute() ->fetchAll(); $role = array(); foreach($result as $role){ $roles[$role->rid] = $role->name; } $form['role']['#title'] = "Roles"; $form['role']['#type'] = "select"; $form['role']['#options'] = $roles; $form['role']['#required'] = 1; $form['#validate'][] = 'mymodule_push_notifications_mass_push_form_validate'; unset($form['#submit']); $form['#submit'][] = 'mymodule_push_notifications_mass_push_form_submit'; } } Tags:
Catégories: Elsewhere

Code Karate: How to setup a Drupal website with Bluehost

ven, 07/11/2014 - 23:57

So let me guess: You either have a Drupal website or are going to create one and need a place to

Catégories: Elsewhere

ImageX Media: Speeding up your MySQL dump/restores with Mydumper

ven, 07/11/2014 - 23:39
Why Mydumper?

How many times in your last web development project have you had to load a mysql/mariadb database? If your answer was "too many", and you've been frustrated by how slow the process can be, this article may be for you.

Catégories: Elsewhere

Appnovation Technologies: How to Use Drupal REST Services with AngularJs

ven, 07/11/2014 - 23:20

In a previous post I showed how to use Drupal 8 RESTful services.

var switchTo5x = false;stLight.options({"publisher":"dr-75626d0b-d9b4-2fdb-6d29-1a20f61d683"});
Catégories: Elsewhere

Mediacurrent: Why Drupal is the Right Fit for Higher Ed

ven, 07/11/2014 - 21:35

After speaking to dozens of higher ed institutions over the last several years, I’m convinced now more than ever that open source technology, particularly Drupal, is the best fit for these organizations. I know I’m echoing what many in the Drupal community have observed for a while, but I’d like to describe why Drupal makes so much sense for higher ed.

Catégories: Elsewhere

CMS Quick Start: Publishing Drupal 7 Content to Social Media: Part 1

ven, 07/11/2014 - 20:55

 Streamlined workflows are important for sites of any size. Today it is very common to update your readers via multiple social sites, namely Twitter and Facebook. However, it can be tedious sometimes to update your site, then update Facebook and Twitter separately with the correct links (especially if you publish a lot of content). In this series we are going to explore different ways of pushing content to your social media platforms automatically.

read more

Catégories: Elsewhere

Deeson: Using PhpStorm's Live Templates for t functions

ven, 07/11/2014 - 18:00

At Deeson's PhpStorm is our IDE of choice. Working with PhpStorm's Live Templates can save you some valueable time. In this post I'll show you how to use Live Templates to surround strings in simple t functions in template files.

Live templates

PhpStorm’s Live Templates are chunks of code which can be quickly inserted into a file. Surround Live Templates allow you to select a piece of text and surround it with template.

Drupal's t function

It's Drupal best practice to wrap all strings in a t function - this allow the sting to be translated. In a template file this looks like:

<span><?php print t('This is good Practice'); ?></span>

On most sites there will be hundreds of these strings, so anything that can shave off time will be worthwhile.

Take a look

Here’s an example of Surround Live Templates in action. It’s quick and easy to surround a string with a simple t function.

PhpStorm Live Templates and T function


To show the Surround Live Template list on Macs use Cmd+Alt+J and if you are on a Windows machine use Ctrl+Alt+J.

Setting up Live Templates

To set up a Surround Live Template, go to Preferences > Live Templates and click the plus symbol in the top right of the window.

A Surround Live Template needs to have ‘$SELECTION$’ in it, which is replaced with the selected text. The template also need to be available in the correct contexts.

Here's one I prepared earlier...

Have a go

To set up this T string Surround Live Template, the template text needs to be:

<?php print t('$SELECTION$'); ?>

It needs to be applicable in the ‘HTML’ context.

That’s it! You should now be able to use the template. Let us know if you've got any PhpStorm tips too.

Catégories: Elsewhere frontpage posts for the Drupal planet: Drupal 7.33 released

ven, 07/11/2014 - 16:37

Drupal 7.33, a maintenance release with numerous bug fixes (no security fixes) is now available for download. See the Drupal 7.33 release notes for a full listing.

Download Drupal 7.33

Upgrading your existing Drupal 7 sites is recommended. There are no major new features in this release. For more information about the Drupal 7.x release series, consult the Drupal 7.0 release announcement.

Security information

We have a security announcement mailing list and a history of all security advisories, as well as an RSS feed with the most recent security advisories. We strongly advise Drupal administrators to sign up for the list.

Drupal 7 includes the built-in Update Manager module, which informs you about important updates to your modules and themes.

There are no security fixes in this release of Drupal core.

Bug reports

Drupal 7.x is being maintained, so given enough bug fixes (not just bug reports), more maintenance releases will be made available, according to our monthly release cycle.


Drupal 7.33 contains bug fixes and small API/feature improvements only. The full list of changes between the 7.32 and 7.33 releases can be found by reading the 7.33 release notes. A complete list of all bug fixes in the stable 7.x branch can be found in the git commit log.

Update notes

See the 7.33 release notes for details on important changes in this release.

Known issues


Front page news: Planet DrupalDrupal version: Drupal 7.x
Catégories: Elsewhere

Code Karate: Drupal 7 Exclude Node Title Module

ven, 07/11/2014 - 13:37
Episode Number: 177

Have you ever had to try to hide a title on a page in Drupal? Maybe you created a page to be your front page and don't want the Node title to show up. The Exclude Node Title module makes this situation or any other situation in which you need to hide a node title, as simple as a few clicks of the mouse.

Tags: DrupalDrupal 7Drupal Planet
Catégories: Elsewhere Cracking Acquia Certified Developer - Front end Specialist Certification

ven, 07/11/2014 - 02:46

I had a chance to try the upcoming (Drupal) Acquia Certified Developer - Front end Specialist Certification Exam. Thanks to Acquia Certification Team for allowing me to try it out.


I have been able to clear it with an 83% score. That was way beyond what I was expecting. I expected the exam to focus heavily on advanced CSS and JS and hence was not expecting a good score. But it turned out the exam gives good weightage to Drupal theming and templating and various other concepts in Drupal that gave me a fair chance to score.


The exam evaluates you on the following areas:

  • Fundamental Web Development Concepts

  • Theming Concepts

  • Sub-Theming Concepts

  • Templates

  • Template Functions

  • Layout Configuration

  • Performance

  • Security


The official exam blue print and curriculum is not released by Acquia yet. So I do not have the links here for you. They should be out soon. The exam is scheduled to be released for public on December 1st.


But for any of you taking the exam pre-release, or if you are planning to take the exam immediately after the release, here is some information for you that could help you in your preparation before the official study guide comes out.


Fundamental Web Development Concepts

There were questions about CSS, JS, Jquery. Some of the resources that could help:


CSS Selectors:




Javascript and Jquery: (The below ones are too generic. But I would recommend a full refresher of jquery and javascript if you are a backend developer attempting the certification)


Drupal + Javascript:


Drupal + CSS


Responsive Web Design:


Grid Systems:

  • A fair idea of any one of those CSS grid systems would help




Theming Concepts

You should make yourself thoroughly familiar with all the Theming and Advanced Theming chapters in The Definitive Guide to Drupal 7.



Sub- Theming Concepts


Layout Configuration Templates Template Functions:






This notes is very specific to the Front End Specialist Certification. If you are looking for Acquia Certified Developer examination, check out my previous post on Cracking Acquia Drupal Certification.


Drop in your comments below if you have any additional resources that would help in the exam preparation that I have missed above.


Catégories: Elsewhere

Wim Leers: Drupal 8's render pipeline

ven, 07/11/2014 - 00:59

In Drupal 8, we’ve significantly improved the way pages are rendered. I will explain the entire render pipeline, which will also cover:

  • render caching — blocks and entities are now render cached automatically!
  • cache tags — finally we have the cache invalidation system we’ve always needed!
  • assets — only the necessary assets are loaded anymore, thanks to asset dependencies!
  • bubbling — rather than relying on global statics that broke caching, we now correctly bubble up all attached metadata — no more frustrations!

But I will also explain what is going to be possible in Drupal 8:

  • anonymous page loads: invalidating Varnish/CDNs with perfect precision
  • authenticated page loads: not completely regenerated on every page load, but assembled from render cached parts
  • alternative render strategies, like Big Pipe

Where relevant, I’ll compare with Drupal 7, how you can write Drupal 7 code today that will be easy to upgrade to Drupal 8, and which Drupal 7 backports exist (hint: Big Pipe does exist!).

Slides: Drupal 8's render pipelineConference: DrupalCamp GhentLocation: Ghent, BelgiumDate: Nov 7 2014 - 09:30Duration: 45 minutesExtra information: 


Catégories: Elsewhere

Mediacurrent: Drupal 8 Theming Update

jeu, 06/11/2014 - 22:46

This webinar is an update to Dante Taylor’s TWIG: Getting Started in Drupal 8 presentation from October 2013. The most significant change to Drupal 8 theming is the introduction of the Classy Theme, which was part of the 8.0.0-beta2 release last month. In a nutshell, Classy is a base theme for those who want to have templates with the core classes. Setting Classy as a base is simple—add the following line to the file inside the theme directory:

Catégories: Elsewhere

Midwestern Mac, LLC: Preventing yourself from accidentally breaking production with Drush

jeu, 06/11/2014 - 19:51

For all the sites I maintain, I have at least a local and production environment. Some projects warrant a dev, qa, etc. as well, but for the purposes of this post, let's just assume you often run drush commands on local or development environments during development, and eventually run a similar command on production during a deployment.

What happens if, at some point, you are churning through some Drush commands, using aliases (e.g. drush @site.local break-all-the-things to break things for testing), and you accidentally enter instead of @site.local? Or what if you were doing something potentially disastrous, like deleting a database table locally so you can test a module install file, using drush sqlq to run a query?

Catégories: Elsewhere

Metal Toad: ToadCast 028

jeu, 06/11/2014 - 19:05

For ToadCast 28 we have special guest Chris Bloom!

Catégories: Elsewhere

Blink Reaction: Programmatically Creating a Block in Drupal 8

jeu, 06/11/2014 - 16:20

hook_block_info and hook_block_view are gone in Drupal 8. What's more: the whole paradigm of creating blocks through the hook system is replaced with the Plugin API.

Catégories: Elsewhere

ERPAL: Start an online business with ERPAL Platform

jeu, 06/11/2014 - 10:51

Drupal has everything you need to start a full-featured online business. Drupal is open, free and flexible – and it provides all the components required to integrate content, commerce and community features. With just a few of the 15,000+ modules, it’s possible to build almost any web application you need. With the ERPAL Platform Drupal distribution, Drupal developers and site builders get a pre-configured Drupal installation as a starting point for flexible and open business applications. As one of our first use cases, I want to show how you can use ERPAL Platform to build your complete online business within a single Drupal installation. In this blogpost I’ll cover the overall functionality of this e-commerce use case and in one of the next blogposts I’ll show you in detail how to build your online shop, complete with all the administration features you need to manage your online business.

Business processes first

No matter whether you sell services, projects, or products; no matter whether you sell them online or offline: all business will go through the same basic steps. Starting with the first customer contact to begin the sales process, you’ll mostly be tracking leads that will be transformed into opportunities and become prospects. In the prospect status you’ll create a quote for your customer in which you offer the products and services that the customer requested. After the quote is accepted, it becomes an order (which may be different from the quote). The order confirmation is sent as a receipt to your customer. Now it depends on the payment modalities negotiated before the order as to how and when you can create one or more invoices to get paid. You may get some upfront payment with the submission of the order, after some or all products have been delivered, or once you’ve reached a certain milestone in a project or manufacturing process. So no matter what you deliver to your customer, you get paid either in advance or upon delivery, or a combination of both.

This sales process is always fundamentally the same and it’s the core functionality that ERPAL Platform provides. With Drupal Commerce entities for quotes, orders and invoices, this business process is flexible and can be extended with fields, rules and views. With these features the administrative backend for the general business process is already in place, and you can extend it as you need. Read one of the first ERPAL Platform blog posts for more details about this business process and how it’s implemented in ERPAL Platform

Integrate a Drupal Commerce storefront

Since Drupal Commerce is already integrated into ERPAL Platform, it’s easy to extend the feature set with an e-commerce storefront. At the "frontend" you sell your products to your customers. They can buy any products directly in the web from an online store that’s built on top of your business process platform. If you already know Drupal Commerce, it’s easy to extend ERPAL Platform to expose a storefront to website visitors. In this use case, the ERPAL Platform features will serve a complete administrative backend – visible only to shop administrators – for all your business processes.

Imagine we have three commerce order bundles – order, quote and invoice – to separate these entities. If a user adds a product to her cart, this is an order entity. For an order entity that’s not yet checked out, as a customer you can request a quote, which can be used to compare products and prices with other stores or to show to another party (as PDF). If the customer comes back, she can continue with the order and complete the checkout process. After the checkout is complete, the invoice is created as a separate entity and both the user and the shop administrator can access all these receipts in the same Drupal installation: no synchronization between systems needed. If a payment is made, it’s added to the invoice and changes the balance. That’s it! There you have all you need to process your business in a nutshell. If you build an e-commerce site for a start-up you may want to begin lean and without heavy integration projects. With ERPAL Platform you have all the features in one distribution to start an online business and to continue to grow it in an agile way.

In one of our next blogposts, we’ll present a step-by-step guide for building an online business based on ERPAL Platform.

In our upcomming webinar with the Commerce Guys, we will talk about open integration of Drupal Commerce and give a real use case of an ERPAL Platform project that integrates all online-business process in one platform. 

Catégories: Elsewhere