Multiple Entries by List Field

Create multiple by entries based on the rows of a List field.

Instructions

See “Where do I put snippets?” in our documentation for installation instructions.

Code

Filename: gw-multiple-entries-list-field.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
<?php
/**
 * Gravity Wiz // Gravity Forms // Multiple Entries by List Field
 * https://gravitywiz.com/
 *
 * Create multiple entries based on the rows of a List field. All other field data will be duplicated for each entry.
 * List field inputs are mapped to Admin-only fields on the form.
 *
 * Plugin Name:  Gravity Forms - Multiple Entries by List Field
 * Plugin URI:   https://gravitywiz.com/
 * Description:  Create multiple by entries based on the rows of a List field.
 * Author:       Gravity Wiz
 * Version:      0.7
 * Author URI:   https://gravitywiz.com/
 */
class GW_Multiple_Entries_List_Field {

	private $_args = array();

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

		// set our default arguments, parse against the provided arguments, and store for use throughout the class
		$this->_args = wp_parse_args( $args, array(
			'form_id'            => false,
			'field_id'           => false,
			'field_map'          => array(),
			'preserve_list_data' => false,
			'append_list_data'   => false,
			'formatter'          => function( $value, $field_id, $instance ) {
				return $value;
			},
			'send_notifications' => false,
		) );

		// do version check in the init to make sure if GF is going to be loaded, it is already loaded
		add_action( 'init', array( $this, 'init' ) );

	}

	public function init() {

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

		// carry on
		add_filter( 'gform_entry_post_save', array( $this, 'create_multiple_entries' ) );
		add_filter( 'gform_entry_meta', array( $this, 'register_entry_meta' ), 10, 2 );
		add_filter( 'gform_entries_field_value', array( $this, 'display_entry_meta' ), 10, 4 );

	}

	public function create_multiple_entries( $entry ) {

		if ( ! $this->is_applicable_form( $entry['form_id'] ) ) {
			return $entry;
		}

		$data = rgar( $entry, $this->_args['field_id'] );
		if ( empty( $data ) ) {
			return $entry;
		}

		$data          = maybe_unserialize( $data );
		$working_entry = $entry;
		$form          = GFAPI::get_form( $entry['form_id'] );

		if ( ! $this->_args['preserve_list_data'] ) {
			$working_entry[ $this->_args['field_id'] ] = null;
		}

		foreach ( $data as $index => $row ) {

			$row = array_values( $row );

			foreach ( $this->_args['field_map'] as $column => $field_id ) {
				$working_entry[ (string) $field_id ] = $this->_args['formatter']( $row[ $column - 1 ], $field_id, $this );
			}

			// by default, original entry is updated with list field data; if append_list_data is true,
			if ( $index == 0 && ! $this->_args['append_list_data'] ) {

				GFAPI::update_entry( $working_entry );

				gform_add_meta( $working_entry['id'], 'gwmelf_parent_entry', true );
				gform_add_meta( $working_entry['id'], 'gwmelf_group_entry_id', $working_entry['id'] );

				/**
				 * Sync the parent entry with our working entry so when it is passed onto other plugins using this filter,
				 * it is up-to-date and if the entry is updated via this filter (looking at you, GFPaymentAddOn::entry_post_save()),
				 * our changes will be preserved.
				 */
				$entry                          = $working_entry;
				$entry['gwmelf_parent_entry']   = true;
				$entry['gwmelf_group_entry_id'] = $working_entry['id'];

			} else {

				$working_entry['id'] = null;
				$entry_id            = GFAPI::add_entry( $working_entry );

				// group entry ID refers to the parent entry ID that created the group of entries
				gform_add_meta( $entry_id, 'gwmelf_parent_entry', false );
				gform_add_meta( $entry_id, 'gwmelf_group_entry_id', $entry['id'] );

			}

			// send Gravity Forms notifications, if enabled
			if ( $this->_args['send_notifications'] ) {
				GFAPI::send_notifications( $form, $working_entry );
			}
		}

		return $entry;
	}

	public function register_entry_meta( $entry_meta, $form_id ) {

		if ( ! $this->is_applicable_form( $form_id ) ) {
			return $entry_meta;
		}

		$entry_meta['gwmelf_parent_entry'] = array(
			'label'             => __( 'Primary Entry' ),
			'is_numeric'        => false,
			'is_default_column' => true,
		);

		$entry_meta['gwmelf_group_entry_id'] = array(
			'label'             => __( 'Group ID' ),
			'is_numeric'        => true,
			'is_default_column' => true,
		);

		return $entry_meta;
	}

	public function display_entry_meta( $value, $form_id, $field_id, $entry ) {
		switch ( $field_id ) {
			case 'gwmelf_parent_entry':
				$value = (bool) $value && $value !== '&#10008;' ? '&#10004;' : '&#10008;';
				break;
		}
		return $value;
	}

	public function is_applicable_form( $form ) {

		$form_id = isset( $form['id'] ) ? $form['id'] : $form;

		return empty( $this->_args['form_id'] ) || $form_id == $this->_args['form_id'];
	}

}

# Configuration

new GW_Multiple_Entries_List_Field( array(
	'form_id'            => 123,
	'field_id'           => 4,
	'field_map'          => array(
		1 => 5, // column => fieldId
		2 => 6,
		3 => 7,
	),
	'preserve_list_data' => true,
	'append_list_data'   => true,
	'send_notifications' => false,
) );

Comments

  1. Gil Amminadav
    Gil Amminadav May 28, 2024 at 9:45 am

    Where do you specify the target form on which you want to create entries? In the configuration settings here, I only see the parent form ID

    Reply
    1. Samuel Bassah
      Samuel Bassah Staff May 28, 2024 at 11:30 am

      Hi Gil,

      There is a form_id parameter in the configuration to enter the target form ID. If you’re still not seeing it, email us via our support form and include a screenshot of what you see on your end.

    2. Gil Amminadav
      Gil Amminadav July 7, 2024 at 10:13 am

      Sorry just seeing your reply now. In the code above it says: new GW_Multiple_Entries_List_Field( array( ‘form_id’ => 123, ‘field_id’ => 4, ‘field_map’ => array( 1 => 5, // column => fieldId 2 => 6, 3 => 7,

      Is the form_id there for the parent form or the target form?

    3. Samuel Bassah
      Samuel Bassah Staff July 8, 2024 at 7:21 am

      Hi Gil,

      I’m unsure what you’re referring to as the parent form. This snippet is used to create multiple entries on a form, using the content in the list field rows, to create the entries on the same form. I’m guessing your setup may be a different from how the snippet works, so I will be contact you via email so we can take a look at your setup.

      Best,

Leave a Reply

Your email address will not be published. Required fields are marked *

  • Trouble installing this snippet? See our troubleshooting tips.
  • Need to include code? Create a gist and link to it in your comment.
  • Reporting a bug? Provide a URL where this issue can be recreated.

By commenting, I understand that I may receive emails related to Gravity Wiz and can unsubscribe at any time.