Getting Started with Calendar
In this chapter we will get a calendar up and running on our demo site. We will cover the necessary modules, how to install them, as well as basic site configurations. We'll also show how simple it is to get a calendar on your site using a views template, and then give a tour of some calendar features.
ResourcesModules Needed:
9m Publication date May 16, 2012 - 9:00am Rules trigger for changing creation date on a scheduled publication. NoCalendar Series Overview
In this series we focus on building calendars with Drupal. We'll be covering topics such as basic configuration for fields and views, using calendar templates, creating blocks and different ways of displaying the calendar, along with customizing the look and feel.
This video assumes that you understand the basics of content, fields, and Views in Drupal. If you need a refresher on these topics, or want to find out more about using the Date module, here are some other tutorial series to review:
020 Steven Jones and The Aegir Project - Modules Unraveled Podcast
This week I talk with Steven Jones of the Aegir Project.
Here are some of the questions I asked him- I’ve only heard of Aegir, but never actually used it. What exactly is it?
- How did you get started with Aegir?
- What kinds of things can Aegir do other than site install?
- How does Aegir integrate with Git?
- What sort of people is Aegir appropriate for?
- How does Aegir compare to other tools like Pantheon or Acquia’s dev cloud?
- What about tools like Puppet or Capistrano?
- How can people get help?
- What’s the future of Aegir?
- @TimeRaider: What are the plans for 7.x release and new Drush support?
- @tgroff: What should distributions do to ensure Aegir compatibility?
Drupal 7.14 API Compatibility Breaking Change
Minor Drupal versions are usually for bug fixes, security updates, and the occasional new feature that doesn't break backwards compatibility. Compatibility changes are reserved for major Drupal releases. There are exceptions such as Drupal 6.2. It was such a big deal there is an update documentation page just for this release. When Drupal 7.14 made an API breaking change without providing documentation or notification to module developers I was quite surprised. The lack of detail made it difficult to track down the changes when I had a broken codebase. Here are the details so others can, hopefully, have an easier time if they run into this problem.
Connecting Facebook with Drupal, the easy way: Part 2
In Part 1: Connecting Facebook with Drupal, the easy way I extolled the wonders of Facebook OAuth and showed off its excellent API with an example of how to map facebook user data to Drupal user objects.
For part 2, I'm going to show you another side of the API. But before we get started, I'd like to give a quick shout-out to Nathan Haug (@quicksketch), author of Facebook OAuth. I'm about to take a lot of text directly from the Nate's well-written README.txt, so don't be confused by the liberally-applied quotation marks.
Writing custom Facebook OAuth Actions
"The Facebook OAuth module provides an API for executing queries against Facebook's vast store of user data." How does this translate into user experience (UX)? In extreme layman's terms, Facebook Oauth allows you to create custom buttons that, when clicked, will 1) grab some good facebook data, and 2) let Drupal interact with it. Sounds like fun, right?
Here are a few examples of things that you could do:
- Create a post to facebook wall link on certain node types
- Import a list of a user's facebook friends and expose it to Views (whoa!)
- Import a user's facebook pictures and ... expose them to the Media module!? (that would be cool)
Hopefully you're starting to see how great this can be! Best of all, you can accomplish all of this without learning Facebook's Javascript SDK! Nate has streamlined the process of asking for facebook permissions, obtaining access tokens, etc. You just need to make a few Drupal hooks and you're off!
A simple example
To create a custom Facebook Oauth action, you'll need to drop a bit of code into a custom module. We'll start by telling Facebook Oauth that we have a new action that it should be aware of. This is done with hook_fboauth_actions().
/**
* Implements hook_fboauth_actions().
*/
function mymodule_fboauth_actions() {
// Give each action a unique key, such as "mymodule_photo_import" for a photo
// import. This function should begin with the name of your module.
$actions['mymodule_photo_import'] = array(
// Give you action a human-readable name. This will be used when showing
// the user a link to start this action.
'title' => t('Import my Facebook photos'),
// Specify the name of your callback function that contains the import.
'callback' => 'mymodule_fboauth_action_photo_import',
// Specify permissions you need to do this action. See the Facebook API for
// a list: http://developers.facebook.com/docs/authentication/permissions/
'permissions' => array(
'user_photos', // Gets access to a user's photos.
),
// Optionally specify a file that contains your callback function. If you
// put your callback function in the .module file, this is unnecessary.
// 'file' => 'mymodule.inc',
// Optionally define a theme function for printing out your link (not
// including the "theme_" prefix). If you use this option, you must register
// this function in hook_theme(). If you don't use this option, the link
// will be output with the theme_fboauth_action() function or the automatic
// suggestion theme_fboauth_action__[action_name]().
// 'theme' => 'mymodule_fboauth_action',
);
return $actions;
}
Next, you'll need to actually create the mymodule_fboauth_action_photo_import() function specified in the above hook. Until now, we've engaged in what Jeff Eaton might refer to as "Wishful Programming," meaning that we make calls to functions that we wish existed. Let's make this function a reality.
/**
* Facebook OAuth action callback; Import a user's Facebook photos.
*/
function mymodule_fboauth_action_photo_import($app_id, $access_token) {
// Query against the Facebook Graph API. See the Facebook API for a list of
// commands: http://developers.facebook.com/docs/reference/api/
$result = fboauth_graph_query('me/photos', $access_token);
foreach ($result['data'] as $photo) {
// Do whatever you like with the photos!
}
// Optionally set a completion or error message.
drupal_set_message(t('Import complete!'));
// Optionally return a path to which the user will be redirected. If not set
// the path in the $_REQUEST['destination'] variable will be used. If there
// is no path at all specified, the user will be redirected to the homepage.
return 'mymodule/import-complete';
}
"Now to get the user to actually execute this action, you need to link to Facebook so that the user can grant the necessary access. You can do this with the utility function fboauth_action_display(). Our example action was keyed as "mymodule_photo_import", so we would print the link like this:"
print fboauth_action_display('mymodule_photo_import');
"Now when the user clicks on the output link, they will have the option of granting access to the requested information. If they approve, your callback function will be executed."
What's going on behind the scenes?
Before I go too much further, it may be good for us to go over exactly how Facebook Oauth is doing its magic. The README.txt does a great job of explaining this:
..in order to use this API it is important to understand the basic concepts of OAuth. In short, the user (and only the user) is capable of granting your site access to query information
against Facebook. The user is also only able to do this on Facebook.com, so any requests to query against Facebook must first redirect the user to Facebook where they can grant access. The full workflow looks like this:
- The user clicks on a link (such as the Facebook Connect button) that sends the user to Facebook. If the link is requesting permissions that the user has not yet granted, the user is prompted to allow access. After the user has granted access, or if the user granted access previously, the user is redirected back to your site.
- When the user is redirected back to your site, Facebook sends along an access "code". Your site then takes this access code and does a server-side request to Facebook's API servers. Facebook's servers return an access "token" to your server. This token is valid for a short amount of time and allows you to access the information to which the user granted you access.
- Your site can now execute queries against the user's Facebook information while the token is valid. Because this token only lasts a short amount of (about 6 hours usually), it's safest to always request access from Facebook before every data import session (by having the user click the link), which will renew the existing token or generate a new one.
Whew! Let it me said this really does happen behind the scenes. If the user has already granted the necessary permissions, they don't even see the redirect. Now let's dive back into the code.
Calling your custom actions programmatically
You may be tempted to ask, "But Matt, what if I don't want to require the user to click a button? Can I just fire my facebook action programmatically?" I'm glad you asked, because yes, you can! There's a fairly simple way to accomplish this.
// Extract the link from a given fboauth action.
$fb_link = fboauth_action_link_properties('my_custom_action');
// Extract the request url from a given fboauth action link, including the query parameters.
$fb_query_url = url($fb_link['href'], array('absolute' => TRUE, 'query' => $fb_link['query']));
// Redirect user to facebook for authorization.
drupal_goto($fb_query_url);
When might you want to do use this method? I had two use cases for this approach:
- Creating a menu callback that will execute an action.
- Creating a $form['submit'][] handler that will execute an action.
Pushing data rather than pulling it
Facebook also offers a rich API for sending data back to Facebook. How can we utilize those features? It's not actually that hard. Let's take a look at how we can accomplish this by leveraging some of Facebook Oauth's built-in ability to communicate with Facebook.
The following snippet uses Facebook's Graph API to post to a user's Facebook wall.
function mymodule_fboauth_action_post_to_wall($app_id, $access_token) {
// Build the data array that we'd like to post to facebook.
// See https://developers.facebook.com/docs/reference/api/user/#posts for valid array keys.
$query = array(
'link' => $awesome_node,
'picture' => url(drupal_get_path('theme', 'my_theme') . '/images/logo.png', array('absolute' => TRUE)),
'name' => t('@name loves Drupal', array('@name' => $user->name)),
'caption' => t('ZOMG'),
'description' => t('This message was endorsed by Grasmash'),
'app_id' => variable_get('fboauth_id', ''),
);
$response = fboauth_graph_query('me/feed', $access_token, $query, 'POST');
if (isset($response->id)) {
drupal_set_message(t("You have posted to your facebook wall. That must have been hard. Take a break. Have drink. You're done."));
}
else {
watchdog('mymodule', 'Error executing fboauth action: @error', array('@error' => (isset($reponse->error) ? $response->error : t('Something went horribly wrong'))));
drupal_set_message(t("Oops! We couldn't post to your facebook wall. Try clicking harder."));
}
// Optionally redirect user.
return '<front>';
}
The Encore
The possibilities don't stop there! Facebook OAuth also provides:
- alter hooks to modify default actions
- save and pre-save hooks for facebook registrations
- the ability to hook into the deauthorization process
How might that help you? Well, I used these hooks to integrate Facebook OAuth with the Invite module, such that Drupal can send invites via facebook and then react to fulfilled (facebook) invitations. I'm sure you'll think of great ways to use it too.
That's all folks! I hope these quick posts have been helpful for you. If you liked the article, mention me on twitter or /msg me on IRC — madmatter23.
7.x, drupal, facebook, oauth, fb, fboauthWebinar: A Drush Aliases Primer
A drush site alias file allows you to streamline advanced drush commands and make running them against both local and remote sites a breeze. With a properly configured alias file and an SSH key you can run frequently used commands that have complex options, with a concise easily remembered "alias" on any site. This will help you be far more productive and you will find yourself using drush itself far more often.
File import improvements for Migrate 2.4
The Migrate module is the leading tool for migrating data from an external application into Drupal. Migrate has been used to bring many world class sites onto Drupal, including The Economist, Martha Stewart and thousands more. The main theme of the upcoming Migrate 2.4 release is improved file handling on Drupal 7.
Commerce Module Tuesday: Commerce AutoSKU
Commerce AutoSKU is a really useful tool for those Drupal Commerce users that don't need or don't care about generating their own SKU identifiers. This module uses the Drupal core capabilities to manage tokens and generate SKU for the products based in other product properties such as title, product id or any other token available in the product context. Additionally, the contributed Token module helps a lot with the selection of the pattern.
The automatic SKU generation can be configured at the product type level and the SKU field can be hide to the administrator users, it also supports case transformation and other settings.
Tags: Drupal 7Commerce Module TuesdayPlanet Drupal var switchTo5x=true;stLight.options({publisher:'dr-2277fa04-9203-1dc3-ced9-ffc8e5c4d194'});Creating handlers for Video Embed Field
Filter/Search on multiple fields with Views 3.x
A common need I run into with a ton of Drupal sites and Views is searching/filtering content based on multiple fields. For example, a lot of people would like to search for content using either the Title or the Body for a particular content type.
There are two primary solutions offered for this situation, but they both have downsides or are overly complex, in my opinion:
- Use the Computed Field module to create yet another field stored in the database, combining the two (or more) fields you want to search, then expose a filter for that field instead of both of the individual fields. (I don't like this because it duplicates content/storage, and involves an extra module to do so).
- Use the Views Filters Populate to invisibly populate a second field that you've added to a views OR group (using Views OR in Views 2.x, or the built-in AND/OR functionality in Views 3.x). (This module is slightly limited in that you can only work with strings, and again, it involves an extra module).
Instead of using an extra module, I simply do the following to achieve a multi-field search:
Measuring Community Participation in Open Source Projects: Data from Drupal.org
A defining aspect of open source software such as Drupal is the collaboration among multiple individuals and organizations on the same software.
So how do you measure the activity of contributors who are working on that software?
For Drupal-based projects, the issue queue and project usage statistics are two good sources of data for measuring participation.
the second rate citizens of drupalcon
Today the Drupal association presented a new initiative for getting more students & grow the talent pool for the Drupal Project. This is done by setting x number the tickets for Drupalcon munich to half price of the 400€ - well that is if you're a student. This raises big problems about the future the event I see as the Heart & Soul of the Drupal Community.
Our Drupal.org Website Is Stepping Up To Drupal 7
There's a new initiative in the wind to upgrade our own Drupal.org site to version 7, and look out, its flying on its own!
Yes, it's been a long time desire ever since Drupal 7 launched, but the momentum and prowess of our amazing community is finally magnetizing into action around the Upgrading Drupal.org to Drupal 7 initiative! It started with a fantastic planning and coding sprint in Portland, OR last month. (see the video) We are now full speed ahead in virtual space and IRC and the issue queues.
Application Process Opens Today For Drupal Community Cultivation Grants
Program Seeks to bolster community education and growth with new process
Building on a successful 2011 pilot program, the Drupal Association is opening a new application process for Drupal Community Cultivation Grants. The grants will assist organizers and leaders within the community that seek to transform, support, and educate Drupal communities around the world. The 2011 program awarded more than $20,000 to 17 projects all over the world in support of camps, training, sprints and a publication.
May 2012 Portland Drupal Meetup
The May Portland Drupal meetup kicked off with a round of introductions and some brief sharing about cool things attendees are doing with Drupal. More than a few people mentioned working on Apache Solr integration and Drupal Commerce. Others mentioned helping with the Drupal.org upgrade to Drupal 7 (the site currently runs on Drupal 6).
Part of the Drupal.org upgrade process has been a shift to Behavior Driven Development (BDD). Melissa and Jonathan have been contributing to that effort and presented on BDD.
Many developers are familiar with Test-driven Development and BDD is an extension of that and a response to its perceived problems. One common complaint about Test-driven Development is that the unit tests, or granular pieces of functionality, can often drive the larger test and lead to overall tests that are misguided. BDD focuses on the end user behavior so that the overall test can drive smaller unit tests.
To do this, BDD starts with a "feature" that explains a basic business or functional need in a single, structured sentence. A basic example of a feature is: "In order to read this blog post, as a visitor to the OpenSourcery website, you need to view this page."
Following the feature is a "scenario" presented in a "Given," "When," "Then" format. Given that you are on the OpenSourcery website homepage, when you click the Blog link and click the "May 2012 Portland Drupal Meetup" link, then you will see the "May 2012 Portland Drupal Meetup" page. Since the behavior is first defined in the feature, it's easy to see how you could have multiple scenarios to accomplish the feature (e.g. clicking a link from the Blog's RSS feed or from the Drupal Planet).
Drupal.org has adopted Behat, a popular and growing BDD framework for PHP. Once you have a scenario written, Behat will generate a scaffold of test code based on your scenario. You can then fill in the scaffold with your actual test code.
You can find more information about the BDD work on Drupal.org by visiting the Doobie project. There's also a Behat project that you can use to apply BDD to your own site. Information about BDD and where it fits into current Drupal testing was presented by Moshe Weitzman at DrupalCon Denver.
Following the presentation, the meetup broke into smaller groups and began writing features and contributing them in the Doobie issue queue, so that others could continue working to write scenarios and tests.
Feeling productive from our feature contributions, we headed over to The Lucky Lab Beer Hall for food, drinks and continued discussions. More information about future Portland area meetups (including the newly formed Drupal Front End meetup and DrupalCon Portland volunteer meetings) can be found on the Portland Drupal Groups page.
How to Display One Value from Two Fields in a Drupal View
There is a situation where one field of a Drupal View needs to pull its content from two fields (aka cck fields) of a node. In my case, they were default author field and a custom field called contributor. This example uses Drupal 7 and Views 3.
Compiling PHP Extensions on OS X Lion with XCode 4.3 and Acquia Dev Desktop
With OS X Lion and the new XCode 4.3, locations have changed and SDKs are no longer available. The current Acquia documentation also no longer works. I have begun compiling extensions using the following trick -
/Applications/acquia-drupal/php5_3/bin/phpize
CFLAGS='-arch i386 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.6.sdk -mmacosx-version-min=10.5' ./configure --with-php-config=/Applications/acquia-drupal/php5_3/bin/php-config
make
Tags:
Disable Omega's 'summed region width' validation
Introducing Doh, a Drupal-Based Meta-Framework
This presentation, by Chris Paul (@cpjeeves) of Exaltation of Larks (@LarksLA), introduces a new kind of Dynamic Object Handler that has all kinds of potential but little direction. Proposed features like dynamic module loading, core function overloading, and database-less bootstrapping are suddenly realized by this interesting new way of approaching jQuery-like PHP programming. Through the use of "magic" PHP methods, all kinds of powerful new techniques become possible.
This presentation was given at the High Performance Drupal meetup at Droplabs on May 1, 2012. If you liked this, be sure to check out the other presentation from this meetup, Using HTTPRL for Parallelization: PHP Multitasking Without Forking With stream_select(), by Mike Carper (@mcarper on Twitter and mikeytown2 on Drupal.org).
Video: http://blip.tv/ladrupal/episode/6128018Comments: http://groups.drupal.org/node/223324#comments
Tags:
Customizing Drupal 6 Quicktab Styles
This is a guest post from Adam, my Co-founder at BEgINr Media
When finished: After you get through this tutorial you will have made a custom Quicktabs style in Drupal 6.
This is how to do it.
Stuff I am assuming:
...you have downloaded the Quicktabs module from Drupal.org and Install it.
...you have a photo editor (Gimp, Photoshop, etc)