spivurno
3/22/2014 - 2:18 PM

Gravity Wiz // Gravity Forms Populate With Entries

Gravity Wiz // Gravity Forms Populate With Entries

<?php
/**
* Gravity Wiz // Gravity Forms Populate With Entries
*
* Populate choice-based fields (i.e. drop downs, radios, checkboxes) with data from Gravity Form entries.
*
* @version	 1.0
* @author    David Smith <david@gravitywiz.com>
* @license   GPL-2.0+
* @link      http://gravitywiz.com/...
* @copyright 2013 Gravity Wiz
*/
class GW_Populate_Entries {

    public function __construct( $args = array() ) {

        // make sure we're running the required minimum version of Gravity Forms
        if( ! property_exists( 'GFCommon', 'version' ) || ! version_compare( GFCommon::$version, '1.8', '>=' ) )
            return;

        // set our default arguments, parse against the provided arguments, and store for use throughout the class
        $this->_args = wp_parse_args( $args, array(
            'target_form_id'  => false,
            'target_field_id' => false, // must be a choice-based field (drop down, radio, checkbox)
            'source_form_id'  => false,
            'value'           => false, // can be a field ID or a 'template' string with merge tag support
            'label'           => false, // can be a field ID or a 'template' string with merge tag support
            'query_args'      => array()
        ) );

        $this->_args['query_args'] = wp_parse_args( $this->_args['query_args'], array(
            'status'        => 'active',
            'order'         => 'asc',
            'order_by'      => 'date_created',
            'nopaging'      => true,
            'offset'        => 0,
            'page_size'     => 20,
            'field_id'      => false,
            'field_value'   => '',
            'field_filters' => array()
        ) );

        if( $this->_args['query_args']['field_id'] ) {
            $this->_args['query_args']['field_filters'] = array(
                array(
                    'key' => $this->_args['query_args']['field_id'],
                    'value' => $this->_args['query_args']['field_value']
                )
            );
        }

        $is_no_paging = $this->_args['query_args']['nopaging'] == true;

        $this->_args['paging'] = array(
            'offset'    => $is_no_paging ? 0 : $this->_args['query_args']['offset'],
            'page_size' => $is_no_paging ? 999 : $this->_args['query_args']['page_size']
        );

        $this->_args['sorting'] = array(
            'key'       => $this->_args['query_args']['order_by'],
            'direction' => $this->_args['query_args']['order']
        );

        // time for hooks
        add_action( "gform_pre_render_{$this->_args['target_form_id']}",            array( $this, 'populate' ) );
        add_action( "gform_admin_pre_render_{$this->_args['target_form_id']}",      array( $this, 'populate' ) );
        add_action( "gform_pre_submission_filter_{$this->_args['target_form_id']}", array( $this, 'populate' ) );

    }

    public function populate( $form ) {

        foreach( $form['fields'] as &$field ) {

            if( $field['id'] != $this->_args['target_field_id'] )
                continue;

            $entries = $this->get_entries_for_population( $this->_args['source_form_id'] );
            $choices = array();

            foreach( $entries as $entry ) {

                $value = $this->get_entry_value( $entry, $this->_args['value'] );
                $label = $this->_args['label'] ? $this->get_entry_value( $entry, $this->_args['label'] ) : $value;

                $choices[] = array(
                    'text' => $label,
                    'value' => $value
                );

            }

            if( empty( $choices ) ) {
                $choices[] = array(
                    'text' => __( 'There are no options available currently.' ),
                    'value' => ''
                );
            }

            $field['choices'] = $choices;

            if( GFFormsModel::get_input_type( $field ) != 'checkbox' )
                continue;

            $field['inputs'] = array();

            foreach( $choices as $id => $choice ) {
                $field['inputs'][] = array(
                    'id' => sprintf( '%d.%d', $field['id'], $id + 1 ),
                    'label' => $choice['text'],
                    'name' => ''
                );
            }

        }

        return $form;
    }

    public function get_entries_for_population( $form_id ) {
        return GFAPI::get_entries( $form_id, $this->_args['query_args'], $this->_args['sorting'], $this->_args['paging'] );
    }

    public function get_entry_value( $entry, $template ) {

        $field_id = intval( $template );
        if( $field_id )
            return rgar( $entry, $field_id );

        $form = GFAPI::get_form( $entry['form_id'] );
        $template = GFCommon::replace_variables( $template, $form, $entry, false, true, false, 'html' );

        return $template;
    }

}

# Configuration

new GW_Populate_Entries( array(
    'target_field_id' => 1,         // the field to be populated with entry data; must be a choice-based field (drop down, radio, checkbox)
    'target_form_id' => 449,        // the form that contains the field to be populated
    'source_form_id' => 414,        // the form from which entry data should be retrieved
    'value' => '{entry_id}',        // specifies the data that should be populated for the choice's 'value'; can be a field ID (i.e. 12) or a 'template' string with merge tag support (i.e. '{entry_id}')
    'label' => '{:1.3} {:1.6} ({entry_id})', // same as 'value' but used to populate the label of the choice
    'query_args' => array(          // specifies which entries should be pulled for display
        'status' => 'trash',
        'field_id' => '1.3',
        'field_value' => 'test',
        'order' => 'asc',
        'order_by' => '1.3',
        'nopaging' => true
    )
) );