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

PDF
Gravity Forms Hooks & Filters
KEY
Who Needs Ruby When You've Got CodeIgniter
PDF
Refactoring using Codeception
PDF
CGI::Prototype (NPW 2006)
KEY
Data::FormValidator Simplified
KEY
Keeping It Simple
PPTX
Amp Up Your Admin
PDF
November Camp - Spec BDD with PHPSpec 2
Gravity Forms Hooks & Filters
Who Needs Ruby When You've Got CodeIgniter
Refactoring using Codeception
CGI::Prototype (NPW 2006)
Data::FormValidator Simplified
Keeping It Simple
Amp Up Your Admin
November Camp - Spec BDD with PHPSpec 2

What's hot (20)

PDF
Business Rules with Brick
PDF
KEY
Unit testing with zend framework PHPBenelux
PDF
WordPress: From Antispambot to Zeroize
PPTX
Hacking Your Way To Better Security - Dutch PHP Conference 2016
PDF
購物車程式架構簡介
KEY
Symfony2 Building on Alpha / Beta technology
PDF
Unit testing with zend framework tek11
PPTX
14. CodeIgniter adaugarea inregistrarilor
ODP
Symfony2, creare bundle e valore per il cliente
PPTX
Goodbye hook_menu() - Routing and Menus in Drupal 8
PPT
Slimme Joomla! Templating Tips en Truuks
PDF
Apostrophe
PDF
Forget about Index.php and build you applications around HTTP - PHPers Cracow
PDF
The state of Symfony2 - SymfonyDay 2010
PDF
PhpBB meets Symfony2
KEY
Unit testing zend framework apps
PPTX
Modules and injector
ODP
Rich domain model with symfony 2.5 and doctrine 2.5
PDF
Symfony2 - OSIDays 2010
Business Rules with Brick
Unit testing with zend framework PHPBenelux
WordPress: From Antispambot to Zeroize
Hacking Your Way To Better Security - Dutch PHP Conference 2016
購物車程式架構簡介
Symfony2 Building on Alpha / Beta technology
Unit testing with zend framework tek11
14. CodeIgniter adaugarea inregistrarilor
Symfony2, creare bundle e valore per il cliente
Goodbye hook_menu() - Routing and Menus in Drupal 8
Slimme Joomla! Templating Tips en Truuks
Apostrophe
Forget about Index.php and build you applications around HTTP - PHPers Cracow
The state of Symfony2 - SymfonyDay 2010
PhpBB meets Symfony2
Unit testing zend framework apps
Modules and injector
Rich domain model with symfony 2.5 and doctrine 2.5
Symfony2 - OSIDays 2010
Ad

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

PDF
Virtual Madness @ Etsy
PDF
Как получить чёрный пояс по WordPress? v2.0
PDF
Как получить чёрный пояс по WordPress?
PDF
WordPress REST API hacking
PDF
WordPress REST API hacking
PPTX
Tidy Up Your Code
PPTX
10 Things Every Plugin Developer Should Know (WordCamp Atlanta 2013)
PDF
jQuery secrets
ZIP
First Steps in Drupal Code Driven Development
PDF
Building Large jQuery Applications
PDF
Silex Cheat Sheet
PDF
Silex Cheat Sheet
PDF
Unit testing after Zend Framework 1.8
PDF
Avinash Kundaliya: Javascript and WordPress
PDF
Doctrine For Beginners
PDF
4Developers 2015: Be pragmatic, be SOLID - Krzysztof Menżyk
PDF
Be pragmatic, be SOLID
PDF
Curso Symfony - Clase 4
PDF
Add loop shortcode
PDF
מ-antispambot ועד zeroise – עשר פונקציות וורדפרס שאתם כנראה לא מכירים
Virtual Madness @ Etsy
Как получить чёрный пояс по WordPress? v2.0
Как получить чёрный пояс по WordPress?
WordPress REST API hacking
WordPress REST API hacking
Tidy Up Your Code
10 Things Every Plugin Developer Should Know (WordCamp Atlanta 2013)
jQuery secrets
First Steps in Drupal Code Driven Development
Building Large jQuery Applications
Silex Cheat Sheet
Silex Cheat Sheet
Unit testing after Zend Framework 1.8
Avinash Kundaliya: Javascript and WordPress
Doctrine For Beginners
4Developers 2015: Be pragmatic, be SOLID - Krzysztof Menżyk
Be pragmatic, be SOLID
Curso Symfony - Clase 4
Add loop shortcode
מ-antispambot ועד zeroise – עשר פונקציות וורדפרס שאתם כנראה לא מכירים
Ad

More from Paul Bearne (10)

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

Recently uploaded (20)

PDF
medical staffing services at VALiNTRY
PPTX
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
PPTX
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
PDF
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
PPTX
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
PPTX
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
PDF
How Creative Agencies Leverage Project Management Software.pdf
PDF
Digital Strategies for Manufacturing Companies
PDF
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
PDF
System and Network Administraation Chapter 3
PDF
Which alternative to Crystal Reports is best for small or large businesses.pdf
PDF
PTS Company Brochure 2025 (1).pdf.......
PDF
wealthsignaloriginal-com-DS-text-... (1).pdf
PDF
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
PDF
Navsoft: AI-Powered Business Solutions & Custom Software Development
PDF
AI in Product Development-omnex systems
PPTX
Introduction to Artificial Intelligence
PDF
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
PDF
Audit Checklist Design Aligning with ISO, IATF, and Industry Standards — Omne...
PDF
Upgrade and Innovation Strategies for SAP ERP Customers
medical staffing services at VALiNTRY
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
How Creative Agencies Leverage Project Management Software.pdf
Digital Strategies for Manufacturing Companies
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
System and Network Administraation Chapter 3
Which alternative to Crystal Reports is best for small or large businesses.pdf
PTS Company Brochure 2025 (1).pdf.......
wealthsignaloriginal-com-DS-text-... (1).pdf
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
Navsoft: AI-Powered Business Solutions & Custom Software Development
AI in Product Development-omnex systems
Introduction to Artificial Intelligence
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
Audit Checklist Design Aligning with ISO, IATF, and Industry Standards — Omne...
Upgrade and Innovation Strategies for SAP ERP Customers

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