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() ); }