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

Planet Drupal - Sat, 2014/11/08 - 6:27pm
/** * 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
Categories:

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

Planet Drupal - Sat, 2014/11/08 - 5:06am

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.

Categories:

Entity Pilot: Working with normalizers in Drupal 8

Planet Drupal - Sat, 2014/11/08 - 5:06am

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.

Categories:

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

Planet Drupal - Sat, 2014/11/08 - 5:06am

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.

Categories:

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

Planet Drupal - Sat, 2014/11/08 - 1:49am
/** * 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:
Categories:

Code Karate: How to setup a Drupal website with Bluehost

Planet Drupal - Fri, 2014/11/07 - 11:57pm

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

Categories:

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

Planet Drupal - Fri, 2014/11/07 - 11:39pm
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.

Categories:

Appnovation Technologies: How to Use Drupal REST Services with AngularJs

Planet Drupal - Fri, 2014/11/07 - 11:20pm

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"});
Categories:

Mediacurrent: Why Drupal is the Right Fit for Higher Ed

Planet Drupal - Fri, 2014/11/07 - 9:35pm

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.

Categories:

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

Planet Drupal - Fri, 2014/11/07 - 8:55pm

 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

Categories:

Deeson: Using PhpStorm's Live Templates for t functions

Planet Drupal - Fri, 2014/11/07 - 6:00pm

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

Shortcuts

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.

Categories:

Drupal.org frontpage posts for the Drupal planet: Drupal 7.33 released

Planet Drupal - Fri, 2014/11/07 - 4:37pm

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.

Changelog

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

None.

Front page news: Planet DrupalDrupal version: Drupal 7.x
Categories:

Code Karate: Drupal 7 Exclude Node Title Module

Planet Drupal - Fri, 2014/11/07 - 1:37pm
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
Categories:

tanay.co.in: Cracking Acquia Certified Developer - Front end Specialist Certification

Planet Drupal - Fri, 2014/11/07 - 2:46am

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:

 

Positioning:

 

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

 

HTML 5:

 

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:

 

Performance:

 

Security:

 

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.

 

Categories:

Wim Leers: Drupal 8's render pipeline

Planet Drupal - Fri, 2014/11/07 - 12:59am

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: 

See http://ghent2014.drupalcamp.be/sessions/drupal-8s-render-pipeline.

Categories:

Mediacurrent: Drupal 8 Theming Update

Planet Drupal - Thu, 2014/11/06 - 10:46pm

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 theme.info.yml file inside the theme directory:

Categories:

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

Planet Drupal - Thu, 2014/11/06 - 7:51pm

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 @site.prod 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?

Categories: