22
jQuery in Drupal: overview, tools, how-tos DrupalCamp Vancouver 2008

JQuery In Drupal

Embed Size (px)

DESCRIPTION

This presentation shows how jQuery is used in Drupal, including an overview of how the timelines of both projects relate to each other. It also focuses on specific functionality such as AJAX, AHAH and Drag&Drop

Citation preview

Page 1: JQuery In Drupal

jQuery in Drupal:overview, tools, how-tos

DrupalCamp Vancouver 2008

Page 2: JQuery In Drupal

Introduction

• jQuery is a JavaScript Framework

• In core since Drupal 5 (version 1.0.1)

• Modular, like Drupal itself

• and, like Drupal, constantly evolving...

Page 3: JQuery In Drupal

Overview / Timeline

Page 4: JQuery In Drupal

jQuery Syntax Refresher

• Selectors– $(‘#myId’), $(‘div.myClass’),

$(‘li:not(.active)’), $(‘a[href^=“mailto”]’)

• Commands– .hide(), .show(), .slideToggle(), .each(), etc

• Utility Functions– $.each(), $.get(), $.browser(), $.noConflict()

• Chaining Example$('div.myClass').not(':first-child').hide().end().filter(':first-child').wrap('<div class="my-wrapper"></div>');

Page 5: JQuery In Drupal

Important Functions

• drupal_add_js– Add a JavaScript file, setting or inline code to the

page– parameters: data, type, scope, defer, cache– Examples:

• drupal_add_js(drupal_get_path(‘module’, ‘mymodule’) .'/myjs.js');

• drupal_add_js(array(‘myjs’=>$mysettings), ‘setting’);• Drupal_add_js(‘var myVar = “foo”;’, ‘inline’);

• Use ‘setting’ type to make your module’s settings available to js

Page 6: JQuery In Drupal

Important Functions

• drupal_get_js()– called from phptemplate.engine (assigned

to scripts variable)– makes a call to drupal_add_js() to get the

$javascript array– $output .= '<script type="text/javascript">

Drupal.extend({ settings: '. drupal_to_js(call_user_func_array('array_merge_recursive', $data)) ." });</script>\n";

Page 7: JQuery In Drupal

Important Functions

• drupal_to_js()– Converts a PHP variable into its JavaScript

equivalent– e.g. convert a PHP array into a JSON object– used in the callback function for an AJAX

path

Page 8: JQuery In Drupal

The Drupal JavaScript Object

drupal.js in D5:

var Drupal = Drupal || {};

drupal.js in D6:

var Drupal = Drupal || { 'settings': {}, 'behaviors': {}, 'themes': {}, 'locale': {} };

Page 9: JQuery In Drupal

Ajaxifying Drupal with jQuery

• Asynchronous JavaScript and XML– retrieve data from the server and load into

the DOM of the current page without refreshing the page

– $(‘#someDiv’).load(‘/serverResource’);– the above corresponds to about 20 lines of

normal js

• jQuery provides different AJAX functions, depending on your needs

Page 10: JQuery In Drupal

Ajaxifying Drupal with jQuery

• jQuery AJAX functions:– $(‘#someDiv’).load(url, parameters,

callback);– $.get(url, parameters, callback)– $.post(url, parameters, callback)– $.ajax(options)

Page 11: JQuery In Drupal

11

Ajaxifying Drupal with jQuery

Page 12: JQuery In Drupal

Ajaxifying Drupal with jQuery

• Basic essentials:– $.get (or another AJAX method)– drupal/path (menu callback)– callback function

• drupal_to_js($var)– to convert your php array into a JSON

array

• Drupal.parseJSON(data)

Page 13: JQuery In Drupal

Ajaxifying Drupal with jQuery

Menu Callback

$items[] = array( 'path' => 'photostories/get/photos', 'type' => MENU_CALLBACK, 'access' => user_access('access content'), 'callback' => 'kflick_get_photos_ajax');

Page 14: JQuery In Drupal

Ajaxifying Drupal with jQuery

Callback Function

function kflick_get_photos_ajax($nid) {

$photo = kflick_get_photo($nid);

$imagefile = theme('image', $photo);

print drupal_to_js(array(

'image' => $imagefile,

)

);

}

Page 15: JQuery In Drupal

Ajaxifying Drupal with jQuery

Drupal.kflick = function() { var imageDetails = function(data) {

var result = Drupal.parseJson(data); $('div.field-type-image div.field-item').html(result['image']); } $('a.kflick_button').click(function(){ $('a.kflick_button').removeClass('active'); $(this).addClass('active'); $.get('/photostories/get/photos/'+ parseInt(this.id, 10), null, imageDetails); return false; });}

if (Drupal.jsEnabled) { $(document).ready(Drupal.kflick);}

Page 16: JQuery In Drupal

Drupal 6: behaviors

• In D6, wrap all your module’s jQuery behaviours in a function assigned to Drupal.behaviors.mymodule

• no need to call it within $(document).ready() as Drupal automatically does it for you

• all behaviors can then be reattached to DOM elements that have come from an AJAX call

Page 17: JQuery In Drupal

Drupal 6: behaviors

Drupal.behaviors.kflick = function(context) { $('div.field-type-image:not(.kflick-processed)', context).addClass(‘kflick-processed’).each(function(){ var imageDetails = function(data) {

var result = Drupal.parseJson(data); $('div.field-type-image div.field-item').html(result['image']); } $('a.kflick_button').click(function(){ $('a.kflick_button').removeClass('active'); $(this).addClass('active'); $.get('/drupal/sandbox/photostories/get/photos/'+ parseInt(this.id, 10), null, imageDetails); return false; }); });}

Page 18: JQuery In Drupal

Drupal 6: behaviors

Drupal.attachBehaviors = function(context) { context = context || document; if (Drupal.jsEnabled) { // Execute all of them.

jQuery.each(Drupal.behaviors, function() {

this(context); }); }};

Page 19: JQuery In Drupal

What is AHAH?

• Asynchronous HTML and HTTP• still uses the XMLHttpRequest object• still uses JavaScript• loads html content retrieved from the

server directly into the DOM - no parsing necessary

• AHAH in Drupal = AHAH Forms• AHAH Forms Framework module• In core as of D6

Page 20: JQuery In Drupal

AHAH in Drupal 6

$form['qt_wrapper']['tabs_more'] = array( '#type' => 'submit', '#value' => t('More tabs'), '#description' => t("Click here to add more tabs."), '#weight' => 1, '#submit' => array('qt_more_tabs_submit'), // If no javascript action. '#ahah' => array( 'path' => 'quicktabs/ahah', 'wrapper' => 'quicktabs-tabs', 'method' => 'replace', 'effect' => 'fade', ), );

Page 21: JQuery In Drupal

Drag & Drop

theme('table', $header, $rows, array('id' => 'my-table'));

$row = array(...);$rows[] = array('data' => $row,'class' => 'draggable',);

drupal_add_tabledrag('my-module-table', 'order', 'sibling', 'my-elements-weight');

$form['my_elements'][$delta]['weight']['#attributes']['class'] = "my-elements-weight";

drupal_add_tabledrag($table_id, $action, $relationship, $group);

Page 22: JQuery In Drupal

Resources

• JavaScript Startup Guideon api.drupal.org

• drupaldojo.com/lesson/ahah• http://jquery.com• Firebug console• Books

– Learning jQuery– jQuery in Action