Creating a summary cart table for product purchases in Gravity Forms

Use this snippet to show the users product selections, quantity and prices in Gravity Forms

Recently I had a client who wanted a registration form for their upcoming conference where the guest could select from a bunch of add-on options. At the end of the form, right before the guest is prompted to make their purchase, Gravity Forms allows for only a simple 'total' field. We felt that this was insufficient, so I created a neat little plugin that will summarize all of the Products in your form, and output the guests choices for them to review.

Here it is! Include this as a new file in your theme or plugin.

IMPORTANT: This plugin works ONLY if you’re using pagination on your form. If you are not, simply add pagination in such a way that the final page of your form is your ‘cart review’ page, and make sure you include a Total field, and a payment option field.


if (class_exists('GF_Field'))
{

    class GF_Cart extends GF_Field {

        public $type = 'cart_table';

        public function get_form_editor_field_title() {
            return "Cart Table";
        }

        public function get_form_editor_button() {
            return [
                'group' => 'pricing_fields',
                'text'  => $this->get_form_editor_field_title(),
            ];
        }

        public function get_form_editor_field_settings() {
            return [
                'label_setting',
                'css_class_setting',
                'conditional_logic_field_setting'
            ];
        }

        public function get_field_input( $form, $value = '', $entry = null) {


            if ($this->is_form_editor()) return '<p>Cart Table</p>';


            ob_start();

            ?>
            <table class="table">
                <thead>
                <tr>
                    <td>Item</td>
                    <td>Price</td>
                    <td>Qty</td>
                    <td>Total</td>
                </tr>
                </thead>
                <tbody>
                <?php
                foreach( $form['fields'] as $field )
                {
                    /**
                     *
                     * Here we need some info - what has the customer purchased?
                     *
                     */
                    $selectedValue = [
                        'price' => 0,
                        'qty' => 0
                    ];
                    $formatter = new \NumberFormatter("en-US", \NumberFormatter::CURRENCY );
                    $formatter->setAttribute(\NumberFormatter::FRACTION_DIGITS, 2);

                    // if not a product, continue
                    if( $field->type != 'product' ) continue;

                    // skip if this field was not set.
                    if(  ! ( isset( $_POST['input_' . $field->id ]) ||  isset( $_POST['input_' . $field->id . "_1"]) ) ) continue;

                    $selectionLabel = false;
                    switch( $field->inputType  )
                    {
                        case 'select':
                        case 'radio':

                            $value = $_POST['input_' . $field->id ];
                            $value = explode('|', $value );
                            $selectionLabel = $value[0];
                            $selectedValue['price'] = $value[1];
                            $selectedValue['qty'] = 1;
                            break;
                        case 'calculation':
                        case 'singleproduct':
                            $priceString = $_POST['input_' . $field->id .'_2' ];
                            preg_match('/\d{1,3}(?:[.,]\d{3})*(?:[.,]\d{2})/', $priceString, $matches);

                            $selectedValue['price'] = ( count( $matches ) > 0 )
                                ? array_shift( $matches )
                                : 0;

                            $selectedValue['qty'] = $_POST['input_' . $field->id .'_3' ];

                        break;

                    }

                    ?>
                    <tr id="product-id-<?php echo $field->id; ?>" data-id="<?php echo $field->id; ?>">
                        <th>
                            <?php echo $field->label; ?>
                            <?php echo $selectionLabel ? " - {$selectionLabel}" : ''; ?>
                        </th>
                        <td>
                            <?php
                            echo $formatter->formatCurrency($selectedValue['price'], $formatter->getSymbol(\NumberFormatter::INTL_CURRENCY_SYMBOL) );
                            ?>
                        </td>
                        <td>
                            <?php
                            if( $field->disableQuantity )
                            {
                                echo '1';
                            }
                            else
                            {
                                echo $selectedValue['qty'] ? $selectedValue['qty'] : 'None';
                            }
                            ?>
                        </td>
                        <td>
                            <?php
                            $priceToDisplay = ( $field->disableQuantity )
                                ?  $selectedValue['price']
                                : floatval( $selectedValue['price'] ) * intval( $selectedValue['qty'] );

                            if( $priceToDisplay > 0 )
                            {
                                echo $formatter->formatCurrency( $priceToDisplay, $formatter->getSymbol(\NumberFormatter::INTL_CURRENCY_SYMBOL) );
                            }
                            else
                            {
                                echo '--';
                            }

                            ?>

                        </td>
                    </tr>
                    <?php

                }
                ?>
                </tbody>
            </table>

            <?php
            return ob_get_clean();
        }
    }


    GF_Fields::register( new GF_Cart() );
}

Written by Shawn Wernig

Shawn Wernig

Lead Creative at Eggplant Studios

Shawn Wernig is the lead creative behind Eggplant Studios. While not full time (let's face it, more than full time) designing websites for his clients, Shawn enjoys good beer, double-doubles, and hiding from his phone.