SlideShare una empresa de Scribd logo
1 de 84
Descargar para leer sin conexión
The Synergy of Drupal Hooks/APIs
Custom Chart Block	

Engr. Ranel O. Padon	

	

Drupal Summer Camp PH 2015
About Me
•  Software Engineer at Kite Systems (Hong Kong-based company)	

–  full-time Drupal developer for CNN Travel (our client)	

•  part-time Python lecturer in University of the Philippines	

•  involved with programming for 9 years (Python, Java, etc)	

•  involved in Drupal for the last 3 years	

•  projects: http://github.com/ranelpadon	

•  plays football/futsal
Coverage/Use Cases
•  Block API: create, enable, display, update, save 	

•  Form API: textarea, select list, checkbox, textfield	

•  variable_get, variable_set, variable_del	

•  EntityFieldQuery API	

•  hook_menu, drupal_get_form, system_settings_form	

•  JSON menu callback: drupal_json_output	

•  Render API: #markup, #attached	

•  drupal_get_path	

•  Extending Drupal Behaviors (attach function) 	

•  Drupal.settings JS object
Drupal Hooks/APIs
•  There is beauty and synergy in Drupal functions.	

	

	

•  Synergy	

	

the interaction of elements that when combined
	

produce a total effect that is greater than 	

	

the sum of the individual elements, contributions,
	

etc.
Drupal Hooks/APIs
•  Individual Drupal functions are boring and 	

	

not that useful, but their combinations 	

	

are interesting and very powerful.
CNN Travel Blocks
•  if you go to the CNN Travel site:	

	

 	

http://travel.cnn.com	

	

you’ll notice that we have so many blocks in the
	

front page	

	

•  blocks add valuable information to the site and
creates more visual interest to your page	

	

•  recently, we’ve implemented a block that features	

	

our partner hotels
CNN Travel Partner Hotels
CNN Travel Partner Hotels
Drupal Learning Milestones
Typical Learning Curve
Learning Curve
In the beginning of any learning, while you're on the long,
flat part of the curve, you put in great amounts of time
and effort, but see little in the way of results. 	

	

Persistent practice helps you move along the learning
curve until you hit that sweet spot—about 80% of the
way into the process—where the curve starts to rise
sharply, and results come easily.	

	

http://bruceelkin.hubpages.com/hub/10-000-Hours--The-Awesome-
Power-of-Practice
Learning Curve
in most field of learning (sports, programming, music,
etc), there are many tutorials/exercises about the basic
skills, but relatively few about the ‘intermediate’ skills	

	

this presentation will try to fill the knowledge gap for
Drupal devs by exposing some of the most useful
functions	

	

partner hotels block is an interesting block and a good
Drupal development exercise since its implementation
involves lots of Drupal hooks/functions
Learning Curve
•  there are 403 hooks in Drupal 7 core alone and
hundreds/thousands of related/utility functions	

•  but you only need a handful of them to be productive	

•  knowing 10-20 of the most useful functions could
boost your productivity	

•  I’ll showcase the value of some of the Drupal
functions/use cases by creating a simpler and related
version of Partner Hotels block
Summer Camp Module
•  summercamp	

•  summercamp.info	

•  summercamp.module
Summer Camp Module
•  Info Files	

•  contains metadata/info about the name	

	

description, version, package/group, etc of	

	

the module
Summer Camp Module
•  Info Files	

•  similar to php.ini file	

•  comments preceded by a semicolon (;)	

•  more details: https://www.drupal.org/node/542202
Summer Camp Module
•  summercamp.info	

•  name and core version	

	

are the minimum info needed
Summer Camp Module
•  summercamp.module	

•  contains PHP/Drupal variables/functions/hooks	

•  more details: https://www.drupal.org/node/1074360
Summer Camp Module
•  summercamp	

•  summercamp.info	

•  summercamp.module	

•  the module could now be enabled in admin/modules page
Implementing a Block
•  Register: hook_block_info()	

•  Display: hook_block_view()	

•  Update: hook_block_configure()	

•  Save: hook_block_save()
Hook_Block_Info
•  summercamp.module	

•  register a new block, enable it, assign to right sidebar
Hook_Block_Info
•  the block will now appear in block admin page
Hook_Block_View
•  summercamp.module	

•  if the currently passed/processed block is our target,	

	

set its Title and Contents
The Rendered Block
•  the block will now show in the right sidebar. J
Hook_Block_Configure
•  to make the block contents editable in Admin UI,	

	

we could use the hook_block_configure().	

•  but we need a persistent storage/table for its contents	

•  we could use the handy Variable table built-in	

	

in Drupal
Variable table
	

there are 29 variables 	

	

by default in	

	

Drupal 7.37	

	

	

	

maintenance_mode is	

	

just inserted for demo	

	

of this presentation
Variable table
•  we could easily manipulate values in 	

	

the Variable table, without using SQL directly:	

	

OPERATION	

 DRUPAL FUNCTION	

Create/Update	
   variable_set()	
  
Read	
   variable_get()	
  
Delete	
   variable_del()
Variable table
•  variable_set(NAME, VALUE )	

•  variable_get(NAME, DEFAULT_VALUE)	

•  variable_del(NAME)
Variable table
•  Variable table is very valuable	

•  There’s an Easter Egg in Drupal.org J	

•  https://www.drupal.org/files/my_tombstone.jpg
Hook_Block_Configure
•  we need a way to edit the block contents
Hook_Block_Configure
•  editing the block contents is now possible, but
changes will still not be saved.
Hook_Block_Save
•  we’ll use the another hook to save the edits
Hook_Block_View
•  and adjust the hook_block_view to make use 	

	

of the saved content
Hook_Block_Save
•  edit the block content, save the changes, 	

	

the rendered block will be updated.
Charts
•  we’ll use the ChartJS since it’s open-source,	

	

simple to use, has clean syntax, and mobile-friendly:	

	

http://www.chartjs.org/
ChartJS Page
•  include the ChartJS script	

•  create a CANVAS element in a page	

•  set the input data	

•  convert the CANVAS element to a chart object	

	

against the input data
ChartJS Page
•  include the ChartJS script	

•  select version from here: 	

•  https://cdnjs.com/libraries/chart.js	

•  latest version:	

•  https://cdnjs.cloudflare.com/ajax/libs/Chart.js/1.0.2/Chart.js
ChartJS Page
•  create a CANVAS element in the page
ChartJS Page
•  set the input data
ChartJS Page
•  convert the CANVAS element to a chart object	

	

against the input data
ChartJS Page
•  convert the CANVAS element to a chart object	

	

against some input data.
ChartJS Page
•  the rendered chart and the hovered value.
ChartJS Page
•  we could add hover effects: highlight and label
Chart Block
•  how do we display a chart in a Drupal block?	

•  we need to satisfy these conditions again:	

•  include the ChartJS script	

•  create a CANVAS element in a page	

•  set the input data	

•  convert the CANVAS element to a chart object	

	

against the input data
Chart Block
•  we’ll focus first on the input data	

•  we need a JSON data from Drupal	

•  we’ll create 3 articles and broadcast them as	

	

JSON objects
Data Source: Create 3 Articles
•  Article 1 	

–  Tags: ‘alpha’	

–  Body: ‘Lorem Ipsum 1’	

	

•  Article 2	

–  Tags: ‘beta’	

–  Body: ‘Lorem Ipsum 2’	

•  Article 3	

–  Tags: ‘alpha’	

–  Body: ‘Lorem Ipsum 3’
EntityFieldQuery API
•  create a helper function to retrieve the articles	

•  we’ll use the powerful and flexible EFQ API
EntityFieldQuery API
•  _get_articles() function callback
Hook_Menu | JSON Output
•  bind the function to a menu	

•  encode the _get_articles() output to JSON 	

•  set the access permission to use
Hook_Menu
•  Make sure to clear the Drupal cache to register 	

	

and activate the newly created menu
•  the JSON data will
now be accessible	

•  you might want to
use Chrome’s
JSON Formatter
Hook_Block_View | #Markup
•  insert a CANVAS element	

•  convert ‘content’ to array structure	

•  insert a ‘#markup’ property/array key	

•  set the block markup
Hook_Block_View | #Attached
•  insert the ChartJS script	

•  attach a new JS file to the ‘content’	

•  set the JS data/src	

•  set the data as external script
Drupal Behaviors | Driver File
•  implement the ChartJS driver file	

•  create a new Drupal behavior, 	

	

define the ‘attach’-mode function	

•  let’s use first the previous, non-Drupal	

	

sample chart codes
•  implement the ChartJS driver file	

•  attach a new JS file to the ‘content’	

•  set the JS data/src	

•  set the data as a local file
Hook_Block_View | #Attached
•  insert the ChartJS driver	

•  attach a new JS file to the ‘content’	

•  set the JS data/src	

•  set the data as a local file
Chart Block
•  the chart will now be rendered in the block J
Drupal Behaviors | Driver File
•  adjust the ChartJS driver	

•  fetch the Articles JSON as the input data	

•  convert the chart renderer to a function	

•  will be used in a JSON function callback
Chart Block | Articles
•  the articles’ JSON data will now be rendered
Injecting JS | #Attach
•  note that the main advantage of #attach compared	

	

to drupal_add_js() is that they are ‘alterable’	

	

since they are inserted as array elements	

•  same justification applies for drupal_add_css()	

•  #attach is also used in Drupal 8.	

•  you could alter the #attached JS/CSS files	

	

using hook_js_alter() and hook_css_alter()
Creating an Admin Page
•  there are times you’ll need to have some admin page	

	

for inputting custom site settings/configurations	

	

•  for instance, you’ll like to control if you would like
to show the chart labels, have an text field entry for
the chart colors or highlight colors, a way to select
the chart type, a way to use other chart script, and
so on.
Creating an Admin Page
•  use case: we want to select the chart type to display	

•  the user could choose to display a Pie or Doughnut
chart
Creating an Admin Page
•  requires a hook_menu that will call a page element
generated using Form API	

•  input site/form data could be saved in the Variable
table using the handy system_settings_form().
Target Menu and Admin Page
Chart Settings Admin Page
Hook_Menu: Paths
Hook_Menu: Labels and Form
_Chart_Admin_Settings Form
Adjust Hook_Block_View
Adjust Drupal Behaviors
Adjust Drupal Behaviors
Dynamic Chart J
Expose other Chart Options
Adjust _Chart_Admin_Settings
Configure Module’s Info
SummerCamp Module Repo
•  I’ve already implemented the repo in GitHub and
added more blocks and features:	

•  https://github.com/ranelpadon/summercamp	

•  showcases ChartJS, Panoramio API, and GitHub’s
Gist API.	

•  implements blocks using theme function and
template file	

•  demonstrates processing JSON data in back-end
and front-end	

•  and more..
https://github.com/ranelpadon/summercamp
Recommendations
•  Drupal Development Tools	

•  Essential and Effective Drupal Tools	

•  http://befused.com/drupal/essential-tools
Recommendations
•  Drupal Development Books	

•  Master Drupal 7 Module Development by Wadman	

•  http://befused.com/master-drupal/	

•  Drupal 7 Module Development	

	

 by Butcher, et al.
Special Thanks
•  CNN Travel (http://travel.cnn.com) for the
ideas and inspiration for this presentation.
There is beauty in Drupal.

Más contenido relacionado

La actualidad más candente

Resume_JiaLIU
Resume_JiaLIUResume_JiaLIU
Resume_JiaLIUJia Liu
 
Adapter Design Pattern
Adapter Design PatternAdapter Design Pattern
Adapter Design Patternguy_davis
 
Learning iOS and hunting NSZombies in 3 weeks
Learning iOS and hunting NSZombies in 3 weeksLearning iOS and hunting NSZombies in 3 weeks
Learning iOS and hunting NSZombies in 3 weeksCalvin Cheng
 
iOS Beginners Lesson 2
iOS Beginners Lesson 2iOS Beginners Lesson 2
iOS Beginners Lesson 2Calvin Cheng
 
[React Native] Lecture 4: Basic Elements and UI Layout by using FlexBox
[React Native] Lecture 4: Basic Elements and UI Layout by using FlexBox[React Native] Lecture 4: Basic Elements and UI Layout by using FlexBox
[React Native] Lecture 4: Basic Elements and UI Layout by using FlexBoxKobkrit Viriyayudhakorn
 
Netflix's Recommendation ML Pipeline Using Apache Spark: Spark Summit East ta...
Netflix's Recommendation ML Pipeline Using Apache Spark: Spark Summit East ta...Netflix's Recommendation ML Pipeline Using Apache Spark: Spark Summit East ta...
Netflix's Recommendation ML Pipeline Using Apache Spark: Spark Summit East ta...Spark Summit
 

La actualidad más candente (11)

Resume_JiaLIU
Resume_JiaLIUResume_JiaLIU
Resume_JiaLIU
 
Java Collections
Java CollectionsJava Collections
Java Collections
 
Adapter Design Pattern
Adapter Design PatternAdapter Design Pattern
Adapter Design Pattern
 
Learning iOS and hunting NSZombies in 3 weeks
Learning iOS and hunting NSZombies in 3 weeksLearning iOS and hunting NSZombies in 3 weeks
Learning iOS and hunting NSZombies in 3 weeks
 
Sling Models Overview
Sling Models OverviewSling Models Overview
Sling Models Overview
 
[2015/2016] Backbone JS
[2015/2016] Backbone JS[2015/2016] Backbone JS
[2015/2016] Backbone JS
 
slingmodels
slingmodelsslingmodels
slingmodels
 
iOS Beginners Lesson 2
iOS Beginners Lesson 2iOS Beginners Lesson 2
iOS Beginners Lesson 2
 
Context at design
Context at designContext at design
Context at design
 
[React Native] Lecture 4: Basic Elements and UI Layout by using FlexBox
[React Native] Lecture 4: Basic Elements and UI Layout by using FlexBox[React Native] Lecture 4: Basic Elements and UI Layout by using FlexBox
[React Native] Lecture 4: Basic Elements and UI Layout by using FlexBox
 
Netflix's Recommendation ML Pipeline Using Apache Spark: Spark Summit East ta...
Netflix's Recommendation ML Pipeline Using Apache Spark: Spark Summit East ta...Netflix's Recommendation ML Pipeline Using Apache Spark: Spark Summit East ta...
Netflix's Recommendation ML Pipeline Using Apache Spark: Spark Summit East ta...
 

Destacado

Manual clips
Manual clipsManual clips
Manual clipsworkhome
 
Introdução a python módulo c
Introdução a python   módulo cIntrodução a python   módulo c
Introdução a python módulo cJader Gabriel
 
デザイナーがTkinterで遊んでみました。
デザイナーがTkinterで遊んでみました。デザイナーがTkinterで遊んでみました。
デザイナーがTkinterで遊んでみました。Chachamaru
 
Creating masterpieces with raphael
Creating masterpieces with raphaelCreating masterpieces with raphael
Creating masterpieces with raphaelPippi Labradoodle
 
Python Programming - III. Controlling the Flow
Python Programming - III. Controlling the FlowPython Programming - III. Controlling the Flow
Python Programming - III. Controlling the FlowRanel Padon
 
Python Programming - VII. Customizing Classes and Operator Overloading
Python Programming - VII. Customizing Classes and Operator OverloadingPython Programming - VII. Customizing Classes and Operator Overloading
Python Programming - VII. Customizing Classes and Operator OverloadingRanel Padon
 
Python Programming - IX. On Randomness
Python Programming - IX. On RandomnessPython Programming - IX. On Randomness
Python Programming - IX. On RandomnessRanel Padon
 
Python Programming - XI. String Manipulation and Regular Expressions
Python Programming - XI. String Manipulation and Regular ExpressionsPython Programming - XI. String Manipulation and Regular Expressions
Python Programming - XI. String Manipulation and Regular ExpressionsRanel Padon
 
Python Programming - VIII. Inheritance and Polymorphism
Python Programming - VIII. Inheritance and PolymorphismPython Programming - VIII. Inheritance and Polymorphism
Python Programming - VIII. Inheritance and PolymorphismRanel Padon
 
Power and Elegance - Leaflet + jQuery
Power and Elegance - Leaflet + jQueryPower and Elegance - Leaflet + jQuery
Power and Elegance - Leaflet + jQueryRanel Padon
 
Python Programming - VI. Classes and Objects
Python Programming - VI. Classes and ObjectsPython Programming - VI. Classes and Objects
Python Programming - VI. Classes and ObjectsRanel Padon
 
Python Programming - V. Sequences (List and Tuples) and Dictionaries
Python Programming - V. Sequences (List and Tuples) and DictionariesPython Programming - V. Sequences (List and Tuples) and Dictionaries
Python Programming - V. Sequences (List and Tuples) and DictionariesRanel Padon
 
Python Programming - XII. File Processing
Python Programming - XII. File ProcessingPython Programming - XII. File Processing
Python Programming - XII. File ProcessingRanel Padon
 
Python Programming - IV. Program Components (Functions, Classes, Modules, Pac...
Python Programming - IV. Program Components (Functions, Classes, Modules, Pac...Python Programming - IV. Program Components (Functions, Classes, Modules, Pac...
Python Programming - IV. Program Components (Functions, Classes, Modules, Pac...Ranel Padon
 

Destacado (20)

Mba
MbaMba
Mba
 
Manual clips
Manual clipsManual clips
Manual clips
 
Introdução a python módulo c
Introdução a python   módulo cIntrodução a python   módulo c
Introdução a python módulo c
 
Import python
Import pythonImport python
Import python
 
デザイナーがTkinterで遊んでみました。
デザイナーがTkinterで遊んでみました。デザイナーがTkinterで遊んでみました。
デザイナーがTkinterで遊んでみました。
 
Python IDE Roundup
Python IDE RoundupPython IDE Roundup
Python IDE Roundup
 
Creating masterpieces with raphael
Creating masterpieces with raphaelCreating masterpieces with raphael
Creating masterpieces with raphael
 
Python Programming - III. Controlling the Flow
Python Programming - III. Controlling the FlowPython Programming - III. Controlling the Flow
Python Programming - III. Controlling the Flow
 
Python Programming - VII. Customizing Classes and Operator Overloading
Python Programming - VII. Customizing Classes and Operator OverloadingPython Programming - VII. Customizing Classes and Operator Overloading
Python Programming - VII. Customizing Classes and Operator Overloading
 
Py S60
Py S60Py S60
Py S60
 
Python Programming - IX. On Randomness
Python Programming - IX. On RandomnessPython Programming - IX. On Randomness
Python Programming - IX. On Randomness
 
Python Programming - XI. String Manipulation and Regular Expressions
Python Programming - XI. String Manipulation and Regular ExpressionsPython Programming - XI. String Manipulation and Regular Expressions
Python Programming - XI. String Manipulation and Regular Expressions
 
Python Programming - VIII. Inheritance and Polymorphism
Python Programming - VIII. Inheritance and PolymorphismPython Programming - VIII. Inheritance and Polymorphism
Python Programming - VIII. Inheritance and Polymorphism
 
Introducción a dr racket
Introducción a dr racketIntroducción a dr racket
Introducción a dr racket
 
Power and Elegance - Leaflet + jQuery
Power and Elegance - Leaflet + jQueryPower and Elegance - Leaflet + jQuery
Power and Elegance - Leaflet + jQuery
 
Python Programming - VI. Classes and Objects
Python Programming - VI. Classes and ObjectsPython Programming - VI. Classes and Objects
Python Programming - VI. Classes and Objects
 
Python Programming - V. Sequences (List and Tuples) and Dictionaries
Python Programming - V. Sequences (List and Tuples) and DictionariesPython Programming - V. Sequences (List and Tuples) and Dictionaries
Python Programming - V. Sequences (List and Tuples) and Dictionaries
 
Python Programming - XII. File Processing
Python Programming - XII. File ProcessingPython Programming - XII. File Processing
Python Programming - XII. File Processing
 
Python Programming - IV. Program Components (Functions, Classes, Modules, Pac...
Python Programming - IV. Program Components (Functions, Classes, Modules, Pac...Python Programming - IV. Program Components (Functions, Classes, Modules, Pac...
Python Programming - IV. Program Components (Functions, Classes, Modules, Pac...
 
An introduction-to-tkinter
An introduction-to-tkinterAn introduction-to-tkinter
An introduction-to-tkinter
 

Similar a The Synergy of Drupal Hooks/APIs (Custom Module Development with ChartJS)

Stencil the time for vanilla web components has arrived
Stencil the time for vanilla web components has arrivedStencil the time for vanilla web components has arrived
Stencil the time for vanilla web components has arrivedGil Fink
 
Drupal Javascript for developers
Drupal Javascript for developersDrupal Javascript for developers
Drupal Javascript for developersDream Production AG
 
SharePoint Framework, Angular and Azure Functions
SharePoint Framework, Angular and Azure FunctionsSharePoint Framework, Angular and Azure Functions
SharePoint Framework, Angular and Azure FunctionsSébastien Levert
 
13th Sep, Drupal 7 advanced training by TCS
13th Sep, Drupal 7 advanced training by TCS 13th Sep, Drupal 7 advanced training by TCS
13th Sep, Drupal 7 advanced training by TCS DrupalMumbai
 
Boosting Your Productivity, with Backbone & RactiveJS
Boosting Your Productivity, with Backbone & RactiveJS Boosting Your Productivity, with Backbone & RactiveJS
Boosting Your Productivity, with Backbone & RactiveJS Gabriel Gottgtroy Zigolis
 
Top 8 Improvements in Drupal 8
Top 8 Improvements in Drupal 8Top 8 Improvements in Drupal 8
Top 8 Improvements in Drupal 8Angela Byron
 
Getting Started with DrupalGap
Getting Started with DrupalGapGetting Started with DrupalGap
Getting Started with DrupalGapAlex S
 
Drupal training-by-ruchiwebsolutions
Drupal training-by-ruchiwebsolutionsDrupal training-by-ruchiwebsolutions
Drupal training-by-ruchiwebsolutionsphp2ranjan
 
Stencil the time for vanilla web components has arrived
Stencil the time for vanilla web components has arrivedStencil the time for vanilla web components has arrived
Stencil the time for vanilla web components has arrivedGil Fink
 
"Paragraphs are more powerful than you can expect" from Vasily Jaremchuk for ...
"Paragraphs are more powerful than you can expect" from Vasily Jaremchuk for ..."Paragraphs are more powerful than you can expect" from Vasily Jaremchuk for ...
"Paragraphs are more powerful than you can expect" from Vasily Jaremchuk for ...DrupalCamp Kyiv
 
Everything You Need to Know About the Top Changes in Drupal 8
Everything You Need to Know About the Top Changes in Drupal 8Everything You Need to Know About the Top Changes in Drupal 8
Everything You Need to Know About the Top Changes in Drupal 8Acquia
 
Convert modules from 6.x to 7.x
Convert modules from 6.x to 7.xConvert modules from 6.x to 7.x
Convert modules from 6.x to 7.xJoão Ventura
 
Angular JS2 Training Session #2
Angular JS2 Training Session #2Angular JS2 Training Session #2
Angular JS2 Training Session #2Paras Mendiratta
 
Drupal 8 - Core and API Changes
Drupal 8 - Core and API ChangesDrupal 8 - Core and API Changes
Drupal 8 - Core and API ChangesShabir Ahmad
 
DrupalGap. How to create native application for mobile devices based on Drupa...
DrupalGap. How to create native application for mobile devices based on Drupa...DrupalGap. How to create native application for mobile devices based on Drupa...
DrupalGap. How to create native application for mobile devices based on Drupa...Alex S
 
DrupalGap. How to create native application for mobile devices based on Drupa...
DrupalGap. How to create native application for mobile devices based on Drupa...DrupalGap. How to create native application for mobile devices based on Drupa...
DrupalGap. How to create native application for mobile devices based on Drupa...DrupalCampDN
 

Similar a The Synergy of Drupal Hooks/APIs (Custom Module Development with ChartJS) (20)

Stencil the time for vanilla web components has arrived
Stencil the time for vanilla web components has arrivedStencil the time for vanilla web components has arrived
Stencil the time for vanilla web components has arrived
 
Drupal Javascript for developers
Drupal Javascript for developersDrupal Javascript for developers
Drupal Javascript for developers
 
SharePoint Framework, Angular and Azure Functions
SharePoint Framework, Angular and Azure FunctionsSharePoint Framework, Angular and Azure Functions
SharePoint Framework, Angular and Azure Functions
 
13th Sep, Drupal 7 advanced training by TCS
13th Sep, Drupal 7 advanced training by TCS 13th Sep, Drupal 7 advanced training by TCS
13th Sep, Drupal 7 advanced training by TCS
 
Boosting Your Productivity, with Backbone & RactiveJS
Boosting Your Productivity, with Backbone & RactiveJS Boosting Your Productivity, with Backbone & RactiveJS
Boosting Your Productivity, with Backbone & RactiveJS
 
Top 8 Improvements in Drupal 8
Top 8 Improvements in Drupal 8Top 8 Improvements in Drupal 8
Top 8 Improvements in Drupal 8
 
Getting Started with DrupalGap
Getting Started with DrupalGapGetting Started with DrupalGap
Getting Started with DrupalGap
 
Fapi
FapiFapi
Fapi
 
JS Essence
JS EssenceJS Essence
JS Essence
 
Drupal training-by-ruchiwebsolutions
Drupal training-by-ruchiwebsolutionsDrupal training-by-ruchiwebsolutions
Drupal training-by-ruchiwebsolutions
 
Stencil the time for vanilla web components has arrived
Stencil the time for vanilla web components has arrivedStencil the time for vanilla web components has arrived
Stencil the time for vanilla web components has arrived
 
"Paragraphs are more powerful than you can expect" from Vasily Jaremchuk for ...
"Paragraphs are more powerful than you can expect" from Vasily Jaremchuk for ..."Paragraphs are more powerful than you can expect" from Vasily Jaremchuk for ...
"Paragraphs are more powerful than you can expect" from Vasily Jaremchuk for ...
 
Everything You Need to Know About the Top Changes in Drupal 8
Everything You Need to Know About the Top Changes in Drupal 8Everything You Need to Know About the Top Changes in Drupal 8
Everything You Need to Know About the Top Changes in Drupal 8
 
Convert modules from 6.x to 7.x
Convert modules from 6.x to 7.xConvert modules from 6.x to 7.x
Convert modules from 6.x to 7.x
 
Introduction to AngularJS
Introduction to AngularJSIntroduction to AngularJS
Introduction to AngularJS
 
Angularjs
AngularjsAngularjs
Angularjs
 
Angular JS2 Training Session #2
Angular JS2 Training Session #2Angular JS2 Training Session #2
Angular JS2 Training Session #2
 
Drupal 8 - Core and API Changes
Drupal 8 - Core and API ChangesDrupal 8 - Core and API Changes
Drupal 8 - Core and API Changes
 
DrupalGap. How to create native application for mobile devices based on Drupa...
DrupalGap. How to create native application for mobile devices based on Drupa...DrupalGap. How to create native application for mobile devices based on Drupa...
DrupalGap. How to create native application for mobile devices based on Drupa...
 
DrupalGap. How to create native application for mobile devices based on Drupa...
DrupalGap. How to create native application for mobile devices based on Drupa...DrupalGap. How to create native application for mobile devices based on Drupa...
DrupalGap. How to create native application for mobile devices based on Drupa...
 

Más de Ranel Padon

Views Unlimited: Unleashing the Power of Drupal's Views Module
Views Unlimited: Unleashing the Power of Drupal's Views ModuleViews Unlimited: Unleashing the Power of Drupal's Views Module
Views Unlimited: Unleashing the Power of Drupal's Views ModuleRanel Padon
 
Python Programming - XIII. GUI Programming
Python Programming - XIII. GUI ProgrammingPython Programming - XIII. GUI Programming
Python Programming - XIII. GUI ProgrammingRanel Padon
 
PyCon PH 2014 - GeoComputation
PyCon PH 2014 - GeoComputationPyCon PH 2014 - GeoComputation
PyCon PH 2014 - GeoComputationRanel Padon
 
Python Programming - X. Exception Handling and Assertions
Python Programming - X. Exception Handling and AssertionsPython Programming - X. Exception Handling and Assertions
Python Programming - X. Exception Handling and AssertionsRanel Padon
 
Python Programming - II. The Basics
Python Programming - II. The BasicsPython Programming - II. The Basics
Python Programming - II. The BasicsRanel Padon
 
Python Programming - I. Introduction
Python Programming - I. IntroductionPython Programming - I. Introduction
Python Programming - I. IntroductionRanel Padon
 
Of Nodes and Maps (Web Mapping with Drupal - Part II)
Of Nodes and Maps (Web Mapping with Drupal - Part II)Of Nodes and Maps (Web Mapping with Drupal - Part II)
Of Nodes and Maps (Web Mapping with Drupal - Part II)Ranel Padon
 
Web Mapping with Drupal
Web Mapping with DrupalWeb Mapping with Drupal
Web Mapping with DrupalRanel Padon
 

Más de Ranel Padon (8)

Views Unlimited: Unleashing the Power of Drupal's Views Module
Views Unlimited: Unleashing the Power of Drupal's Views ModuleViews Unlimited: Unleashing the Power of Drupal's Views Module
Views Unlimited: Unleashing the Power of Drupal's Views Module
 
Python Programming - XIII. GUI Programming
Python Programming - XIII. GUI ProgrammingPython Programming - XIII. GUI Programming
Python Programming - XIII. GUI Programming
 
PyCon PH 2014 - GeoComputation
PyCon PH 2014 - GeoComputationPyCon PH 2014 - GeoComputation
PyCon PH 2014 - GeoComputation
 
Python Programming - X. Exception Handling and Assertions
Python Programming - X. Exception Handling and AssertionsPython Programming - X. Exception Handling and Assertions
Python Programming - X. Exception Handling and Assertions
 
Python Programming - II. The Basics
Python Programming - II. The BasicsPython Programming - II. The Basics
Python Programming - II. The Basics
 
Python Programming - I. Introduction
Python Programming - I. IntroductionPython Programming - I. Introduction
Python Programming - I. Introduction
 
Of Nodes and Maps (Web Mapping with Drupal - Part II)
Of Nodes and Maps (Web Mapping with Drupal - Part II)Of Nodes and Maps (Web Mapping with Drupal - Part II)
Of Nodes and Maps (Web Mapping with Drupal - Part II)
 
Web Mapping with Drupal
Web Mapping with DrupalWeb Mapping with Drupal
Web Mapping with Drupal
 

Último

EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?Igalia
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 

Último (20)

EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 

The Synergy of Drupal Hooks/APIs (Custom Module Development with ChartJS)

  • 1. The Synergy of Drupal Hooks/APIs Custom Chart Block Engr. Ranel O. Padon Drupal Summer Camp PH 2015
  • 2. About Me •  Software Engineer at Kite Systems (Hong Kong-based company) –  full-time Drupal developer for CNN Travel (our client) •  part-time Python lecturer in University of the Philippines •  involved with programming for 9 years (Python, Java, etc) •  involved in Drupal for the last 3 years •  projects: http://github.com/ranelpadon •  plays football/futsal
  • 3. Coverage/Use Cases •  Block API: create, enable, display, update, save •  Form API: textarea, select list, checkbox, textfield •  variable_get, variable_set, variable_del •  EntityFieldQuery API •  hook_menu, drupal_get_form, system_settings_form •  JSON menu callback: drupal_json_output •  Render API: #markup, #attached •  drupal_get_path •  Extending Drupal Behaviors (attach function) •  Drupal.settings JS object
  • 4. Drupal Hooks/APIs •  There is beauty and synergy in Drupal functions. •  Synergy the interaction of elements that when combined produce a total effect that is greater than the sum of the individual elements, contributions, etc.
  • 5. Drupal Hooks/APIs •  Individual Drupal functions are boring and not that useful, but their combinations are interesting and very powerful.
  • 6. CNN Travel Blocks •  if you go to the CNN Travel site: http://travel.cnn.com you’ll notice that we have so many blocks in the front page •  blocks add valuable information to the site and creates more visual interest to your page •  recently, we’ve implemented a block that features our partner hotels
  • 11. Learning Curve In the beginning of any learning, while you're on the long, flat part of the curve, you put in great amounts of time and effort, but see little in the way of results. Persistent practice helps you move along the learning curve until you hit that sweet spot—about 80% of the way into the process—where the curve starts to rise sharply, and results come easily. http://bruceelkin.hubpages.com/hub/10-000-Hours--The-Awesome- Power-of-Practice
  • 12. Learning Curve in most field of learning (sports, programming, music, etc), there are many tutorials/exercises about the basic skills, but relatively few about the ‘intermediate’ skills this presentation will try to fill the knowledge gap for Drupal devs by exposing some of the most useful functions partner hotels block is an interesting block and a good Drupal development exercise since its implementation involves lots of Drupal hooks/functions
  • 13. Learning Curve •  there are 403 hooks in Drupal 7 core alone and hundreds/thousands of related/utility functions •  but you only need a handful of them to be productive •  knowing 10-20 of the most useful functions could boost your productivity •  I’ll showcase the value of some of the Drupal functions/use cases by creating a simpler and related version of Partner Hotels block
  • 14. Summer Camp Module •  summercamp •  summercamp.info •  summercamp.module
  • 15. Summer Camp Module •  Info Files •  contains metadata/info about the name description, version, package/group, etc of the module
  • 16. Summer Camp Module •  Info Files •  similar to php.ini file •  comments preceded by a semicolon (;) •  more details: https://www.drupal.org/node/542202
  • 17. Summer Camp Module •  summercamp.info •  name and core version are the minimum info needed
  • 18. Summer Camp Module •  summercamp.module •  contains PHP/Drupal variables/functions/hooks •  more details: https://www.drupal.org/node/1074360
  • 19. Summer Camp Module •  summercamp •  summercamp.info •  summercamp.module •  the module could now be enabled in admin/modules page
  • 20. Implementing a Block •  Register: hook_block_info() •  Display: hook_block_view() •  Update: hook_block_configure() •  Save: hook_block_save()
  • 21. Hook_Block_Info •  summercamp.module •  register a new block, enable it, assign to right sidebar
  • 22. Hook_Block_Info •  the block will now appear in block admin page
  • 23. Hook_Block_View •  summercamp.module •  if the currently passed/processed block is our target, set its Title and Contents
  • 24. The Rendered Block •  the block will now show in the right sidebar. J
  • 25. Hook_Block_Configure •  to make the block contents editable in Admin UI, we could use the hook_block_configure(). •  but we need a persistent storage/table for its contents •  we could use the handy Variable table built-in in Drupal
  • 26. Variable table there are 29 variables by default in Drupal 7.37 maintenance_mode is just inserted for demo of this presentation
  • 27. Variable table •  we could easily manipulate values in the Variable table, without using SQL directly: OPERATION DRUPAL FUNCTION Create/Update   variable_set()   Read   variable_get()   Delete   variable_del()
  • 28. Variable table •  variable_set(NAME, VALUE ) •  variable_get(NAME, DEFAULT_VALUE) •  variable_del(NAME)
  • 29. Variable table •  Variable table is very valuable •  There’s an Easter Egg in Drupal.org J •  https://www.drupal.org/files/my_tombstone.jpg
  • 30. Hook_Block_Configure •  we need a way to edit the block contents
  • 31. Hook_Block_Configure •  editing the block contents is now possible, but changes will still not be saved.
  • 32. Hook_Block_Save •  we’ll use the another hook to save the edits
  • 33. Hook_Block_View •  and adjust the hook_block_view to make use of the saved content
  • 34. Hook_Block_Save •  edit the block content, save the changes, the rendered block will be updated.
  • 35. Charts •  we’ll use the ChartJS since it’s open-source, simple to use, has clean syntax, and mobile-friendly: http://www.chartjs.org/
  • 36. ChartJS Page •  include the ChartJS script •  create a CANVAS element in a page •  set the input data •  convert the CANVAS element to a chart object against the input data
  • 37. ChartJS Page •  include the ChartJS script •  select version from here: •  https://cdnjs.com/libraries/chart.js •  latest version: •  https://cdnjs.cloudflare.com/ajax/libs/Chart.js/1.0.2/Chart.js
  • 38. ChartJS Page •  create a CANVAS element in the page
  • 39. ChartJS Page •  set the input data
  • 40. ChartJS Page •  convert the CANVAS element to a chart object against the input data
  • 41. ChartJS Page •  convert the CANVAS element to a chart object against some input data.
  • 42. ChartJS Page •  the rendered chart and the hovered value.
  • 43. ChartJS Page •  we could add hover effects: highlight and label
  • 44. Chart Block •  how do we display a chart in a Drupal block? •  we need to satisfy these conditions again: •  include the ChartJS script •  create a CANVAS element in a page •  set the input data •  convert the CANVAS element to a chart object against the input data
  • 45. Chart Block •  we’ll focus first on the input data •  we need a JSON data from Drupal •  we’ll create 3 articles and broadcast them as JSON objects
  • 46. Data Source: Create 3 Articles •  Article 1 –  Tags: ‘alpha’ –  Body: ‘Lorem Ipsum 1’ •  Article 2 –  Tags: ‘beta’ –  Body: ‘Lorem Ipsum 2’ •  Article 3 –  Tags: ‘alpha’ –  Body: ‘Lorem Ipsum 3’
  • 47. EntityFieldQuery API •  create a helper function to retrieve the articles •  we’ll use the powerful and flexible EFQ API
  • 49. Hook_Menu | JSON Output •  bind the function to a menu •  encode the _get_articles() output to JSON •  set the access permission to use
  • 50. Hook_Menu •  Make sure to clear the Drupal cache to register and activate the newly created menu
  • 51. •  the JSON data will now be accessible •  you might want to use Chrome’s JSON Formatter
  • 52. Hook_Block_View | #Markup •  insert a CANVAS element •  convert ‘content’ to array structure •  insert a ‘#markup’ property/array key •  set the block markup
  • 53. Hook_Block_View | #Attached •  insert the ChartJS script •  attach a new JS file to the ‘content’ •  set the JS data/src •  set the data as external script
  • 54. Drupal Behaviors | Driver File •  implement the ChartJS driver file •  create a new Drupal behavior, define the ‘attach’-mode function •  let’s use first the previous, non-Drupal sample chart codes
  • 55. •  implement the ChartJS driver file •  attach a new JS file to the ‘content’ •  set the JS data/src •  set the data as a local file
  • 56. Hook_Block_View | #Attached •  insert the ChartJS driver •  attach a new JS file to the ‘content’ •  set the JS data/src •  set the data as a local file
  • 57. Chart Block •  the chart will now be rendered in the block J
  • 58. Drupal Behaviors | Driver File •  adjust the ChartJS driver •  fetch the Articles JSON as the input data •  convert the chart renderer to a function •  will be used in a JSON function callback
  • 59.
  • 60.
  • 61. Chart Block | Articles •  the articles’ JSON data will now be rendered
  • 62. Injecting JS | #Attach •  note that the main advantage of #attach compared to drupal_add_js() is that they are ‘alterable’ since they are inserted as array elements •  same justification applies for drupal_add_css() •  #attach is also used in Drupal 8. •  you could alter the #attached JS/CSS files using hook_js_alter() and hook_css_alter()
  • 63.
  • 64. Creating an Admin Page •  there are times you’ll need to have some admin page for inputting custom site settings/configurations •  for instance, you’ll like to control if you would like to show the chart labels, have an text field entry for the chart colors or highlight colors, a way to select the chart type, a way to use other chart script, and so on.
  • 65. Creating an Admin Page •  use case: we want to select the chart type to display •  the user could choose to display a Pie or Doughnut chart
  • 66. Creating an Admin Page •  requires a hook_menu that will call a page element generated using Form API •  input site/form data could be saved in the Variable table using the handy system_settings_form().
  • 67. Target Menu and Admin Page
  • 79. SummerCamp Module Repo •  I’ve already implemented the repo in GitHub and added more blocks and features: •  https://github.com/ranelpadon/summercamp •  showcases ChartJS, Panoramio API, and GitHub’s Gist API. •  implements blocks using theme function and template file •  demonstrates processing JSON data in back-end and front-end •  and more..
  • 81. Recommendations •  Drupal Development Tools •  Essential and Effective Drupal Tools •  http://befused.com/drupal/essential-tools
  • 82. Recommendations •  Drupal Development Books •  Master Drupal 7 Module Development by Wadman •  http://befused.com/master-drupal/ •  Drupal 7 Module Development by Butcher, et al.
  • 83. Special Thanks •  CNN Travel (http://travel.cnn.com) for the ideas and inspiration for this presentation.
  • 84. There is beauty in Drupal.