SlideShare a Scribd company logo
Extending Gravity
Forms
A CODE DEEP DIVE
Paul Bearne @pbearne
Sr. Web Developer @ metronews.ca
Plugin author of Author Avatars List ( http://wordpress.org/plugins/author-avatars/ )
WP Site Verification tool ( http://wordpress.org/plugins/wp-site-verification-tool/ )
Agenda
Gravity forms demo
Options overload demo
Options overload code
Metro AR demo
AR from code
Class overload demo
Class overload code
DEMO
GRAVITY FORMS
add_filter( 'gform_pre_render', array( $this, ‘overload_gform_select_with_basecamp_user_list’), 10 );
public function overload_gform_select_with_basecamp_user_list( $form ){
$new_user_choices = null;
// check we have a basecamp class
$this->create_basecamp();
// lets get all basecamp users for this project
$message = $this->basecamp->getPeople(); // whole account
if( null == $message ){
return $form;
}
// loop basecamp users
foreach( $message as $basecamp_user ){
$isSelected = ($this->current_user->user_email == $basecamp_user->email_address)?true:false;
$new_user_choices[] = array(
"text"=>esc_html( $basecamp_user->name ),
"value"=>absint( $basecamp_user->id ),
"isSelected"=>( bool )$isSelected,
"price"=>""
);
}
// loop all field and look for users
foreach( $form['fields'] as &$field ){
if( in_array( $field['inputName'], $this->basecamp_user_fields ) ){
$field['choices'] = $new_user_choices;
}
}
return $form;
}
add_filter( 'gform_pre_render', 'overload_gform_select_with_user_list', 10 );
function overload_gform_select_with_user_list( $form ){
$new_user_choices = null;
// create an array of new option values
$new_user_choices[] = array( 'text‘=>'admin', 'value'=>1, 'isSelected'=>false, 'price'=>'' );
$new_user_choices[] = array( 'text'=>'Paul Bearne', 'value'=>2, 'isSelected'=>true, 'price'=>'' );
$new_user_choices[] = array( 'text'=>'Username', 'value'=>3, 'isSelected'=>false, 'price'=>'' );
// loop all fields and look for Parameter Name
foreach( $form['fields'] as &$field ){
if( in_array( $field['inputName'], 'Parameter_Name') ){
$field['choices'] = $new_user_choices;
}
}
return $form;
}
DEMO
METRO AR FORM
<?php
require_once 'external-web-services/PostNewTarget.php';
class mec_send_to_external_api
{
private $form_id;// id of the gravity form being used
function __construct()
{
// store the form id in options
$options = get_option('basecamp_form_options');
$this->form_id = ( isset( $options['ar'] ) )?$options['ar']:1;
add_action('gform_after_submission_'.$this->form_id, array( $this, mec_send_to_external_api'
), 10, 2 );
);
}
public function mec_send_to_external_api( $entry, $form ){
// map the gravity form fields to nice names
$target_name = $entry[8];
$target_short_title = $entry[14];
$target_french_short_title = $entry[15];
$target_long_title = $entry[16];
$target_french_long_title = $entry[17];
$target_image_url = $entry[2];
$target_opacity = ( float )$entry[9];
$target_overlay_type = $entry[10];
$overlay_web_url = $entry[1];
$overlay_web_internal_links = explode( ',', '' );
$overlay_web_external_links = explode( ',', '' );
$overlay_web_interactive = true;
$overlay_video_url = ( 0 < strlen( $entry[12] ) )?$entry[12]:$entry[3];
$overlay_image_url = $entry[7];
$overlay_gallery = json_decode( $entry[5] );
$overlay_gallery_caption = '';
$overlay_opacity = ( float )$entry[11];
// which overtype are we loading
switch ( $target_overlay_type ) {
case 'gallery':
$src_urls = null;
if( empty( $overlay_gallery ) ){
wp_die( "No Images in upload for gallery", 'Upload failed' );
}
$overlay_gallery = array_reverse($overlay_gallery,true);
foreach ($overlay_gallery as $key => $image_url) {
$images = null;
$resizes = make_image_resizes( parse_url( $image_url, PHP_URL_PATH ) );
$folder_URL = implode( '/',( explode( '/', $image_url, -1 ) ) );
if(false == $resizes){
wp_die( "image resize failed", 'Upload failed' );
}
foreach ($resizes as $row) {
$images[ $row['width'] ] = $folder_URL.'/'.$row['file'] ;
}
$images["src"] = $image_url ;
$images["caption"] = $overlay_gallery_caption ;
$src_urls[] = $images;
}
$type = array("images" => $src_urls );
break;
case 'video':
$type["src"] = $overlay_video_url ;
break;
case 'image':
$resizes = make_image_resizes( parse_url( $overlay_image_url, PHP_URL_PATH ) );
$folder_URL = implode( '/',( explode( '/', $overlay_image_url, -1 ) ) );
foreach ($resizes as $row) {
$type[ $row['width'] ] = $folder_URL.$row['file'] ;
}
$type["src"] = $overlay_image_url ;
break;
case 'web':
$type["src"] = $overlay_web_url ;
$type["force_internal"] = $overlay_web_internal_links;
$type["force_external"] = $overlay_web_external_links;
$type["interactive_while_tracking"] = $overlay_web_interactive;
break;
default:
$type = array(); // just in case
break;
}
$metadata = array( $target_overlay_type => $type );
$metadata['tracking_opacity'] = $target_opacity;
$metadata['centered_opacity'] = $overlay_opacity;
$metadata['title'] = $target_short_title;
$metadata['title_fr'] = $target_french_short_title;
$metadata['title_long'] = $target_long_title;
$metadata['title_long_fr'] = $target_french_long_title;
$response_text = "";
$date = new DateTime( "now", new DateTimeZone( "GMT" ) );
$external = new PostNewTarget();
$external->targetName = $target_name.$date->format( " Y-m-d-H:i:s" );
$external->imageLocation = $target_image_url;
$external->application_metadata = json_encode( $metadata );
$response = $external->push();
$response_text = $response->getBody();
}
}
$mec_send_to_external_api = new mec_send_to_external_api();
<?php
// note the 2 at the end it tell the add action to pass 2 values to the function
add_action('gform_after_submission_1', 'send_to_external_api', 10, 2 );
}
function send_to_external_api( $entry, $form ){
// 2 option radio button note the 18.1
$do_publish = ( isset( $entry['18.1'] ) && true == $entry['18.1'] )? false : true;
// esc text
$metadata['target_name'] = esc_html( $entry[8] );
// alsway cast numbers
$metadata['overlay_opacity'] = ( float )$entry[11];
// how to test for a value and switch
$metadata['video_url'] = ( 0 < strlen( $entry[12] ) )?$entry[12]:$entry[3];
// URL end up commara seperated
$metadata['_web_links'] = explode( ',', '' );
//file upload is a json srting so needs to decoding
$metadata['gallery'] = json_decode( $entry[5] );
// if you need to switch on a value been there just look for it in array
// works for selects / radio button and check boxs as you set the return values
$metadata['value_set'] = ( in_array( 'look_for_me', $entry, true ) )?true:false;
// encode value so we can send them
$args['body'] = json_encode( $metadata );
$url = 'http://somerandomserver.com/api';
//http://codex.wordpress.org/HTTP_API
//http://codex.wordpress.org/Function_Reference/wp_remote_post
wp_remote_post( $url, $args );
}
<?php
// 175 id of form
// 1 the id of form element
// send 4 values to function
add_filter("gform_field_validation_175_1", "custom_validation", 10, 4);
function custom_validation($result, $value, $form, $field){
// check have been passed is_valid as an array object
// perform a test
if(array_key_exists( "is_valid", $result ) && intval($value) > 10){
// make it invalid
$result["is_valid"] = false;
// and nice message
$result["message"] = "Please enter a value less than 10";
}
// return the update array
return $result;
}
https://github.com/rocketgenius/simpleaddon/blob/master/simpleaddon.php
https://github.com/rocketgenius/simpleaddon
<?php
/*
Plugin Name: Gravity Forms Simple Add-On
Plugin URI: http://www.gravityforms.com
Description: A simple add-on to demonstrate the use of the Add-On Framework
Version: 1.1
Author: Rocketgenius
Author URI: http://www.rocketgenius.com
------------------------------------------------------------------------
Copyright 2012-2013 Rocketgenius Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
if (class_exists("GFForms")) {
GFForms::include_addon_framework();
class GFSimpleAddOn extends GFAddOn {
protected $_version = "1.1";
protected $_min_gravityforms_version = "1.7.9999";
protected $_slug = "simpleaddon";
protected $_path = "asimpleaddon/asimpleaddon.php";
protected $_full_path = __FILE__;
protected $_title = "Gravity Forms Simple Add-On";
protected $_short_title = "Simple Add-On";
public function init(){
parent::init();
add_filter("gform_submit_button", array($this, "form_submit_button"), 10, 2);
}
// Add the text in the plugin settings to the bottom of the form if enabled for this form
function form_submit_button($button, $form){
$settings = $this->get_form_settings($form);
if(isset($settings["enabled"]) && true == $settings["enabled"]){
$text = $this->get_plugin_setting("mytextbox");
$button = "<div>{$text}</div>" . $button;
}
return $button;
}
public function plugin_page() {
?>
This page appears in the Forms menu
<?php
}
public function form_settings_fields($form) {
return array(
array(
"title" => "Simple Form Settings",
"fields" => array(
array(
"label" => "My checkbox",
"type" => "checkbox",
"name" => "enabled",
"tooltip" => "This is the tooltip",
"choices" => array(
array(
"label" => "Enabled",
"name" => "enabled"
)
)
),……….
public function settings_my_custom_field_type(){
?>
<div>
My custom field contains a few settings:
</div>
<?php
$this->settings_text(
array(
"label" => "A textbox sub-field",
"name" => "subtext",
"default_value" => "change me"
)
);
$this->settings_checkbox(
array(
"label" => "A checkbox sub-field",
"choices" => array(
array(
"label" => "Activate",
"name" => "subcheck",
"default_value" => true
)
)
)
);
}
public function plugin_settings_fields() {
return array(
array(
"title" => "Simple Add-On Settings",
"fields" => array(
array(
"name" => "mytextbox",
"tooltip" => "This is the tooltip",
"label" => "This is the label",
"type" => "text",
"class" => "small"
)
)
)
);
}
public function scripts() {
$scripts = array(
array("handle" => "my_script_js",
"src" => $this->get_base_url() . "/js/my_script.js",
"version" => $this->_version,
"deps" => array("jquery"),
"strings" => array(
'first' => __("First Choice", "simpleaddon"),
'second' => __("Second Choice", "simpleaddon"),
'third' => __("Third Choice", "simpleaddon")
),
"enqueue" => array(
array(
"admin_page" => array("form_settings"),
"tab" => "simpleaddon"
)
)
),
);
return array_merge(parent::scripts(), $scripts);
}
public function styles() {
$styles = array(
array("handle" => "my_styles_css",
"src" => $this->get_base_url() . "/css/my_styles.css",
"version" => $this->_version,
"enqueue" => array(
array("field_types" => array("poll"))
)
)
);
return array_merge(parent::styles(), $styles);
}
}
new GFSimpleAddOn();
}
Questions?
The Add-On frameworkis gearedtowards developersbuildingGravity Forms Add-Ons.It has a setof classesthatcan be extended and makethe taskof creatingan Add-On muchsimplerthan before.
The followingdocumentationpage shouldgive you a good overviewand it also linksto a coupleof sampleAdd-Onsthatyou can download from Git Hub to see thingsin action.
http://www.gravityhelp.com/documentation/page/Add-On_Framework
The WebAPI allows remoteprogramaticaccessto Gravity Form.It can be usedfor example,to implementa mobileapp,or anytimeyou needto performoperationson yourGravity Forms sitefrom a remotesite.
The followingdocumentationpage shouldgive you a good overview:
http://www.gravityhelp.com/documentation/page/Web_API
gform_pre_render–
http://www.gravityhelp.com/documentation/page/Gform_pre_render
gform_field_validation- Allows customvalidationto be doneon a specificfield.
http://www.gravityhelp.com/documentation/page/Gform_field_validation
gform_after_submission- Allows tasksto be performedaftera successfulsubmission.
http://www.gravityhelp.com/documentation/page/Gform_after_submission
Slides@ http://www.slideshare.net/pbearne
Email: pbearne@gmail.com

More Related Content

What's hot (20)

PDF
Business Rules with Brick
brian d foy
 
PDF
Php Enums
Ayesh Karunaratne
 
KEY
Unit testing with zend framework PHPBenelux
Michelangelo van Dam
 
PDF
WordPress: From Antispambot to Zeroize
Yoav Farhi
 
PPTX
Hacking Your Way To Better Security - Dutch PHP Conference 2016
Colin O'Dell
 
PDF
購物車程式架構簡介
Jace Ju
 
KEY
Symfony2 Building on Alpha / Beta technology
Daniel Knell
 
PDF
Unit testing with zend framework tek11
Michelangelo van Dam
 
PPTX
14. CodeIgniter adaugarea inregistrarilor
Razvan Raducanu, PhD
 
ODP
Symfony2, creare bundle e valore per il cliente
Leonardo Proietti
 
PPTX
Goodbye hook_menu() - Routing and Menus in Drupal 8
Exove
 
PPT
Slimme Joomla! Templating Tips en Truuks
ThemePartner
 
PDF
Apostrophe
tompunk
 
PDF
Forget about Index.php and build you applications around HTTP - PHPers Cracow
Kacper Gunia
 
PDF
The state of Symfony2 - SymfonyDay 2010
Fabien Potencier
 
PDF
PhpBB meets Symfony2
Fabien Potencier
 
KEY
Unit testing zend framework apps
Michelangelo van Dam
 
PPTX
Modules and injector
Eyal Vardi
 
ODP
Rich domain model with symfony 2.5 and doctrine 2.5
Leonardo Proietti
 
PDF
Symfony2 - OSIDays 2010
Fabien Potencier
 
Business Rules with Brick
brian d foy
 
Unit testing with zend framework PHPBenelux
Michelangelo van Dam
 
WordPress: From Antispambot to Zeroize
Yoav Farhi
 
Hacking Your Way To Better Security - Dutch PHP Conference 2016
Colin O'Dell
 
購物車程式架構簡介
Jace Ju
 
Symfony2 Building on Alpha / Beta technology
Daniel Knell
 
Unit testing with zend framework tek11
Michelangelo van Dam
 
14. CodeIgniter adaugarea inregistrarilor
Razvan Raducanu, PhD
 
Symfony2, creare bundle e valore per il cliente
Leonardo Proietti
 
Goodbye hook_menu() - Routing and Menus in Drupal 8
Exove
 
Slimme Joomla! Templating Tips en Truuks
ThemePartner
 
Apostrophe
tompunk
 
Forget about Index.php and build you applications around HTTP - PHPers Cracow
Kacper Gunia
 
The state of Symfony2 - SymfonyDay 2010
Fabien Potencier
 
PhpBB meets Symfony2
Fabien Potencier
 
Unit testing zend framework apps
Michelangelo van Dam
 
Modules and injector
Eyal Vardi
 
Rich domain model with symfony 2.5 and doctrine 2.5
Leonardo Proietti
 
Symfony2 - OSIDays 2010
Fabien Potencier
 

Similar to WordPress overloading Gravityforms using hooks, filters and extending classes (20)

PDF
Get More Out of Gravity Forms
Mandi Wise
 
PDF
Fork forms library
YoniWeb
 
PPTX
Colorado Springs WordPress Meetup - Gravity Forms
Press Avenue
 
PDF
Taking Care of The REST - Creating your own RESTful API Server using Restler 2.0
Arul Kumaran
 
KEY
CakePHP REST Plugin
Kevin van Zonneveld
 
PDF
HTML::FormFu talk for Sydney PM
Dean Hamstead
 
PDF
Rapidly prototyping web applications using BackPress
Nathaniel Taintor
 
PDF
Introduction to php web programming - get and post
baabtra.com - No. 1 supplier of quality freshers
 
KEY
Writing extensible Word press-plugins
AllenSnook
 
PPTX
WordPress - Custom Page Settings + Salesforce API Integration
Khoi Nguyen
 
PPTX
Cakefest 2010: API Development
Andrew Curioso
 
PDF
Advanced symfony Techniques
Kris Wallsmith
 
PDF
WordPress REST API hacking
Jeroen van Dijk
 
PDF
I will design advanced form by gravity form, wordpress form
BachuBanarjee
 
PDF
REST API with CakePHP
Anuchit Chalothorn
 
PDF
Teaming up WordPress API with Backbone.js in Titanium
Jeroen van Dijk
 
PDF
Creating native apps with WordPress
Marko Heijnen
 
PPTX
Day02 a pi.
ABDEL RAHMAN KARIM
 
PDF
PHP Web Development
gaplabs
 
PPTX
10 useful WordPress functions (and maybe more)
Giustino Borzacchiello
 
Get More Out of Gravity Forms
Mandi Wise
 
Fork forms library
YoniWeb
 
Colorado Springs WordPress Meetup - Gravity Forms
Press Avenue
 
Taking Care of The REST - Creating your own RESTful API Server using Restler 2.0
Arul Kumaran
 
CakePHP REST Plugin
Kevin van Zonneveld
 
HTML::FormFu talk for Sydney PM
Dean Hamstead
 
Rapidly prototyping web applications using BackPress
Nathaniel Taintor
 
Introduction to php web programming - get and post
baabtra.com - No. 1 supplier of quality freshers
 
Writing extensible Word press-plugins
AllenSnook
 
WordPress - Custom Page Settings + Salesforce API Integration
Khoi Nguyen
 
Cakefest 2010: API Development
Andrew Curioso
 
Advanced symfony Techniques
Kris Wallsmith
 
WordPress REST API hacking
Jeroen van Dijk
 
I will design advanced form by gravity form, wordpress form
BachuBanarjee
 
REST API with CakePHP
Anuchit Chalothorn
 
Teaming up WordPress API with Backbone.js in Titanium
Jeroen van Dijk
 
Creating native apps with WordPress
Marko Heijnen
 
Day02 a pi.
ABDEL RAHMAN KARIM
 
PHP Web Development
gaplabs
 
10 useful WordPress functions (and maybe more)
Giustino Borzacchiello
 
Ad

More from Paul Bearne (10)

PPTX
Childthemes ottawa-word camp-1919
Paul Bearne
 
PPTX
WP json api
Paul Bearne
 
PPTX
Vagrant WordCamp Hamilton
Paul Bearne
 
PPTX
Using WordPress as your application stack
Paul Bearne
 
PPTX
Unit tests with vagrant
Paul Bearne
 
PPTX
How To Set a Vagrant Development System
Paul Bearne
 
PPTX
HirshHorn theme: how I created it
Paul Bearne
 
PPTX
WortdPress Child themes: Why and How
Paul Bearne
 
PPTX
Daughter Themes
Paul Bearne
 
PPT
Author Avatars List demo slides
Paul Bearne
 
Childthemes ottawa-word camp-1919
Paul Bearne
 
WP json api
Paul Bearne
 
Vagrant WordCamp Hamilton
Paul Bearne
 
Using WordPress as your application stack
Paul Bearne
 
Unit tests with vagrant
Paul Bearne
 
How To Set a Vagrant Development System
Paul Bearne
 
HirshHorn theme: how I created it
Paul Bearne
 
WortdPress Child themes: Why and How
Paul Bearne
 
Daughter Themes
Paul Bearne
 
Author Avatars List demo slides
Paul Bearne
 
Ad

Recently uploaded (20)

PPTX
Get Started with Maestro: Agent, Robot, and Human in Action – Session 5 of 5
klpathrudu
 
PPTX
Milwaukee Marketo User Group - Summer Road Trip: Mapping and Personalizing Yo...
bbedford2
 
PDF
ERP Consulting Services and Solutions by Contetra Pvt Ltd
jayjani123
 
PDF
Open Chain Q2 Steering Committee Meeting - 2025-06-25
Shane Coughlan
 
PDF
IObit Driver Booster Pro 12.4.0.585 Crack Free Download
henryc1122g
 
PDF
Generic or Specific? Making sensible software design decisions
Bert Jan Schrijver
 
PDF
How to Hire AI Developers_ Step-by-Step Guide in 2025.pdf
DianApps Technologies
 
PDF
Download Canva Pro 2025 PC Crack Full Latest Version
bashirkhan333g
 
PDF
AI + DevOps = Smart Automation with devseccops.ai.pdf
Devseccops.ai
 
PDF
Top Agile Project Management Tools for Teams in 2025
Orangescrum
 
PPTX
Agentic Automation: Build & Deploy Your First UiPath Agent
klpathrudu
 
PDF
Odoo CRM vs Zoho CRM: Honest Comparison 2025
Odiware Technologies Private Limited
 
PDF
Technical-Careers-Roadmap-in-Software-Market.pdf
Hussein Ali
 
PPTX
Agentic Automation Journey Series Day 2 – Prompt Engineering for UiPath Agents
klpathrudu
 
PPTX
ChiSquare Procedure in IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
PDF
MiniTool Partition Wizard Free Crack + Full Free Download 2025
bashirkhan333g
 
PPTX
AEM User Group: India Chapter Kickoff Meeting
jennaf3
 
PDF
Empower Your Tech Vision- Why Businesses Prefer to Hire Remote Developers fro...
logixshapers59
 
PDF
IDM Crack with Internet Download Manager 6.42 Build 43 with Patch Latest 2025
bashirkhan333g
 
PDF
[Solution] Why Choose the VeryPDF DRM Protector Custom-Built Solution for You...
Lingwen1998
 
Get Started with Maestro: Agent, Robot, and Human in Action – Session 5 of 5
klpathrudu
 
Milwaukee Marketo User Group - Summer Road Trip: Mapping and Personalizing Yo...
bbedford2
 
ERP Consulting Services and Solutions by Contetra Pvt Ltd
jayjani123
 
Open Chain Q2 Steering Committee Meeting - 2025-06-25
Shane Coughlan
 
IObit Driver Booster Pro 12.4.0.585 Crack Free Download
henryc1122g
 
Generic or Specific? Making sensible software design decisions
Bert Jan Schrijver
 
How to Hire AI Developers_ Step-by-Step Guide in 2025.pdf
DianApps Technologies
 
Download Canva Pro 2025 PC Crack Full Latest Version
bashirkhan333g
 
AI + DevOps = Smart Automation with devseccops.ai.pdf
Devseccops.ai
 
Top Agile Project Management Tools for Teams in 2025
Orangescrum
 
Agentic Automation: Build & Deploy Your First UiPath Agent
klpathrudu
 
Odoo CRM vs Zoho CRM: Honest Comparison 2025
Odiware Technologies Private Limited
 
Technical-Careers-Roadmap-in-Software-Market.pdf
Hussein Ali
 
Agentic Automation Journey Series Day 2 – Prompt Engineering for UiPath Agents
klpathrudu
 
ChiSquare Procedure in IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
MiniTool Partition Wizard Free Crack + Full Free Download 2025
bashirkhan333g
 
AEM User Group: India Chapter Kickoff Meeting
jennaf3
 
Empower Your Tech Vision- Why Businesses Prefer to Hire Remote Developers fro...
logixshapers59
 
IDM Crack with Internet Download Manager 6.42 Build 43 with Patch Latest 2025
bashirkhan333g
 
[Solution] Why Choose the VeryPDF DRM Protector Custom-Built Solution for You...
Lingwen1998
 

WordPress overloading Gravityforms using hooks, filters and extending classes

  • 2. Paul Bearne @pbearne Sr. Web Developer @ metronews.ca Plugin author of Author Avatars List ( http://wordpress.org/plugins/author-avatars/ ) WP Site Verification tool ( http://wordpress.org/plugins/wp-site-verification-tool/ )
  • 3. Agenda Gravity forms demo Options overload demo Options overload code Metro AR demo AR from code Class overload demo Class overload code
  • 5. add_filter( 'gform_pre_render', array( $this, ‘overload_gform_select_with_basecamp_user_list’), 10 ); public function overload_gform_select_with_basecamp_user_list( $form ){ $new_user_choices = null; // check we have a basecamp class $this->create_basecamp(); // lets get all basecamp users for this project $message = $this->basecamp->getPeople(); // whole account if( null == $message ){ return $form; } // loop basecamp users foreach( $message as $basecamp_user ){ $isSelected = ($this->current_user->user_email == $basecamp_user->email_address)?true:false; $new_user_choices[] = array( "text"=>esc_html( $basecamp_user->name ), "value"=>absint( $basecamp_user->id ), "isSelected"=>( bool )$isSelected, "price"=>"" ); } // loop all field and look for users foreach( $form['fields'] as &$field ){ if( in_array( $field['inputName'], $this->basecamp_user_fields ) ){ $field['choices'] = $new_user_choices; } } return $form; }
  • 6. add_filter( 'gform_pre_render', 'overload_gform_select_with_user_list', 10 ); function overload_gform_select_with_user_list( $form ){ $new_user_choices = null; // create an array of new option values $new_user_choices[] = array( 'text‘=>'admin', 'value'=>1, 'isSelected'=>false, 'price'=>'' ); $new_user_choices[] = array( 'text'=>'Paul Bearne', 'value'=>2, 'isSelected'=>true, 'price'=>'' ); $new_user_choices[] = array( 'text'=>'Username', 'value'=>3, 'isSelected'=>false, 'price'=>'' ); // loop all fields and look for Parameter Name foreach( $form['fields'] as &$field ){ if( in_array( $field['inputName'], 'Parameter_Name') ){ $field['choices'] = $new_user_choices; } } return $form; }
  • 8. <?php require_once 'external-web-services/PostNewTarget.php'; class mec_send_to_external_api { private $form_id;// id of the gravity form being used function __construct() { // store the form id in options $options = get_option('basecamp_form_options'); $this->form_id = ( isset( $options['ar'] ) )?$options['ar']:1; add_action('gform_after_submission_'.$this->form_id, array( $this, mec_send_to_external_api' ), 10, 2 ); ); } public function mec_send_to_external_api( $entry, $form ){ // map the gravity form fields to nice names $target_name = $entry[8]; $target_short_title = $entry[14]; $target_french_short_title = $entry[15]; $target_long_title = $entry[16]; $target_french_long_title = $entry[17]; $target_image_url = $entry[2]; $target_opacity = ( float )$entry[9]; $target_overlay_type = $entry[10]; $overlay_web_url = $entry[1]; $overlay_web_internal_links = explode( ',', '' ); $overlay_web_external_links = explode( ',', '' ); $overlay_web_interactive = true; $overlay_video_url = ( 0 < strlen( $entry[12] ) )?$entry[12]:$entry[3]; $overlay_image_url = $entry[7]; $overlay_gallery = json_decode( $entry[5] ); $overlay_gallery_caption = ''; $overlay_opacity = ( float )$entry[11]; // which overtype are we loading switch ( $target_overlay_type ) { case 'gallery': $src_urls = null; if( empty( $overlay_gallery ) ){ wp_die( "No Images in upload for gallery", 'Upload failed' ); } $overlay_gallery = array_reverse($overlay_gallery,true); foreach ($overlay_gallery as $key => $image_url) { $images = null; $resizes = make_image_resizes( parse_url( $image_url, PHP_URL_PATH ) ); $folder_URL = implode( '/',( explode( '/', $image_url, -1 ) ) ); if(false == $resizes){ wp_die( "image resize failed", 'Upload failed' ); } foreach ($resizes as $row) { $images[ $row['width'] ] = $folder_URL.'/'.$row['file'] ; } $images["src"] = $image_url ; $images["caption"] = $overlay_gallery_caption ; $src_urls[] = $images; } $type = array("images" => $src_urls ); break; case 'video': $type["src"] = $overlay_video_url ; break;
  • 9. case 'image': $resizes = make_image_resizes( parse_url( $overlay_image_url, PHP_URL_PATH ) ); $folder_URL = implode( '/',( explode( '/', $overlay_image_url, -1 ) ) ); foreach ($resizes as $row) { $type[ $row['width'] ] = $folder_URL.$row['file'] ; } $type["src"] = $overlay_image_url ; break; case 'web': $type["src"] = $overlay_web_url ; $type["force_internal"] = $overlay_web_internal_links; $type["force_external"] = $overlay_web_external_links; $type["interactive_while_tracking"] = $overlay_web_interactive; break; default: $type = array(); // just in case break; } $metadata = array( $target_overlay_type => $type ); $metadata['tracking_opacity'] = $target_opacity; $metadata['centered_opacity'] = $overlay_opacity; $metadata['title'] = $target_short_title; $metadata['title_fr'] = $target_french_short_title; $metadata['title_long'] = $target_long_title; $metadata['title_long_fr'] = $target_french_long_title; $response_text = ""; $date = new DateTime( "now", new DateTimeZone( "GMT" ) ); $external = new PostNewTarget(); $external->targetName = $target_name.$date->format( " Y-m-d-H:i:s" ); $external->imageLocation = $target_image_url; $external->application_metadata = json_encode( $metadata ); $response = $external->push(); $response_text = $response->getBody(); } } $mec_send_to_external_api = new mec_send_to_external_api();
  • 10. <?php // note the 2 at the end it tell the add action to pass 2 values to the function add_action('gform_after_submission_1', 'send_to_external_api', 10, 2 ); } function send_to_external_api( $entry, $form ){ // 2 option radio button note the 18.1 $do_publish = ( isset( $entry['18.1'] ) && true == $entry['18.1'] )? false : true; // esc text $metadata['target_name'] = esc_html( $entry[8] ); // alsway cast numbers $metadata['overlay_opacity'] = ( float )$entry[11]; // how to test for a value and switch $metadata['video_url'] = ( 0 < strlen( $entry[12] ) )?$entry[12]:$entry[3]; // URL end up commara seperated $metadata['_web_links'] = explode( ',', '' ); //file upload is a json srting so needs to decoding $metadata['gallery'] = json_decode( $entry[5] ); // if you need to switch on a value been there just look for it in array // works for selects / radio button and check boxs as you set the return values $metadata['value_set'] = ( in_array( 'look_for_me', $entry, true ) )?true:false; // encode value so we can send them $args['body'] = json_encode( $metadata ); $url = 'http://somerandomserver.com/api'; //http://codex.wordpress.org/HTTP_API //http://codex.wordpress.org/Function_Reference/wp_remote_post wp_remote_post( $url, $args ); }
  • 11. <?php // 175 id of form // 1 the id of form element // send 4 values to function add_filter("gform_field_validation_175_1", "custom_validation", 10, 4); function custom_validation($result, $value, $form, $field){ // check have been passed is_valid as an array object // perform a test if(array_key_exists( "is_valid", $result ) && intval($value) > 10){ // make it invalid $result["is_valid"] = false; // and nice message $result["message"] = "Please enter a value less than 10"; } // return the update array return $result; }
  • 12. https://github.com/rocketgenius/simpleaddon/blob/master/simpleaddon.php https://github.com/rocketgenius/simpleaddon <?php /* Plugin Name: Gravity Forms Simple Add-On Plugin URI: http://www.gravityforms.com Description: A simple add-on to demonstrate the use of the Add-On Framework Version: 1.1 Author: Rocketgenius Author URI: http://www.rocketgenius.com ------------------------------------------------------------------------ Copyright 2012-2013 Rocketgenius Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
  • 13. if (class_exists("GFForms")) { GFForms::include_addon_framework(); class GFSimpleAddOn extends GFAddOn { protected $_version = "1.1"; protected $_min_gravityforms_version = "1.7.9999"; protected $_slug = "simpleaddon"; protected $_path = "asimpleaddon/asimpleaddon.php"; protected $_full_path = __FILE__; protected $_title = "Gravity Forms Simple Add-On"; protected $_short_title = "Simple Add-On"; public function init(){ parent::init(); add_filter("gform_submit_button", array($this, "form_submit_button"), 10, 2); } // Add the text in the plugin settings to the bottom of the form if enabled for this form function form_submit_button($button, $form){ $settings = $this->get_form_settings($form); if(isset($settings["enabled"]) && true == $settings["enabled"]){ $text = $this->get_plugin_setting("mytextbox"); $button = "<div>{$text}</div>" . $button; } return $button; }
  • 14. public function plugin_page() { ?> This page appears in the Forms menu <?php } public function form_settings_fields($form) { return array( array( "title" => "Simple Form Settings", "fields" => array( array( "label" => "My checkbox", "type" => "checkbox", "name" => "enabled", "tooltip" => "This is the tooltip", "choices" => array( array( "label" => "Enabled", "name" => "enabled" ) ) ),……….
  • 15. public function settings_my_custom_field_type(){ ?> <div> My custom field contains a few settings: </div> <?php $this->settings_text( array( "label" => "A textbox sub-field", "name" => "subtext", "default_value" => "change me" ) ); $this->settings_checkbox( array( "label" => "A checkbox sub-field", "choices" => array( array( "label" => "Activate", "name" => "subcheck", "default_value" => true ) ) ) ); }
  • 16. public function plugin_settings_fields() { return array( array( "title" => "Simple Add-On Settings", "fields" => array( array( "name" => "mytextbox", "tooltip" => "This is the tooltip", "label" => "This is the label", "type" => "text", "class" => "small" ) ) ) ); }
  • 17. public function scripts() { $scripts = array( array("handle" => "my_script_js", "src" => $this->get_base_url() . "/js/my_script.js", "version" => $this->_version, "deps" => array("jquery"), "strings" => array( 'first' => __("First Choice", "simpleaddon"), 'second' => __("Second Choice", "simpleaddon"), 'third' => __("Third Choice", "simpleaddon") ), "enqueue" => array( array( "admin_page" => array("form_settings"), "tab" => "simpleaddon" ) ) ), ); return array_merge(parent::scripts(), $scripts); }
  • 18. public function styles() { $styles = array( array("handle" => "my_styles_css", "src" => $this->get_base_url() . "/css/my_styles.css", "version" => $this->_version, "enqueue" => array( array("field_types" => array("poll")) ) ) ); return array_merge(parent::styles(), $styles); } } new GFSimpleAddOn(); }
  • 20. The Add-On frameworkis gearedtowards developersbuildingGravity Forms Add-Ons.It has a setof classesthatcan be extended and makethe taskof creatingan Add-On muchsimplerthan before. The followingdocumentationpage shouldgive you a good overviewand it also linksto a coupleof sampleAdd-Onsthatyou can download from Git Hub to see thingsin action. http://www.gravityhelp.com/documentation/page/Add-On_Framework The WebAPI allows remoteprogramaticaccessto Gravity Form.It can be usedfor example,to implementa mobileapp,or anytimeyou needto performoperationson yourGravity Forms sitefrom a remotesite. The followingdocumentationpage shouldgive you a good overview: http://www.gravityhelp.com/documentation/page/Web_API gform_pre_render– http://www.gravityhelp.com/documentation/page/Gform_pre_render gform_field_validation- Allows customvalidationto be doneon a specificfield. http://www.gravityhelp.com/documentation/page/Gform_field_validation gform_after_submission- Allows tasksto be performedaftera successfulsubmission. http://www.gravityhelp.com/documentation/page/Gform_after_submission