php 在重力形式中添加税

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php 在重力形式中添加税相关的知识,希望对你有一定的参考价值。

How to Add Tax to Gravity Forms Products

1. Add subtotal merge tag code into functions.php
2. Create your product field and give it a price
3. Create another product field and choose "Calculation" as the Field Type 
4. Check "Disable the quantity field"
5. In the Formula section of the Calculation field, choose Subtotal from the Insert Merge Tag dropdown
6. Multiply by the appropriate amount for the tax you want to add. Ex: {subtotal} * 0.05
7. Add a Total field to your form if desired
<?php

/**
* Calculation Subtotal Merge Tag
*
* Adds a {subtotal} merge tag which calculates the subtotal of the form. This merge tag can only be used
* within the "Formula" setting of Calculation-enabled fields (i.e. Number, Calculated Product).
*
* @author    David Smith <david@gravitywiz.com>
* @license   GPL-2.0+
* @link      http://gravitywiz.com/subtotal-merge-tag-for-calculations/
* @copyright 2013 Gravity Wiz
*/

class GWCalcSubtotal {
 
    public static $merge_tag = '{subtotal}';
 
    function __construct() {
 
        // front-end
        add_filter( 'gform_pre_render', array( $this, 'maybe_replace_subtotal_merge_tag' ) );
        add_filter( 'gform_pre_validation', array( $this, 'maybe_replace_subtotal_merge_tag_submission' ) );
 
        // back-end
        add_filter( 'gform_admin_pre_render', array( $this, 'add_merge_tags' ) );
 
    }
 
    /**
    * Look for {subtotal} merge tag in form fields 'calculationFormula' property. If found, replace with the
    * aggregated subtotal merge tag string.
    *
    * @param mixed $form
    */
    function maybe_replace_subtotal_merge_tag( $form, $filter_tags = false ) {
        
        foreach( $form['fields'] as &$field ) {
            
            if( current_filter() == 'gform_pre_render' && rgar( $field, 'origCalculationFormula' ) )
                $field['calculationFormula'] = $field['origCalculationFormula'];
            
            if( ! self::has_subtotal_merge_tag( $field ) )
                continue;
 
            $subtotal_merge_tags = self::get_subtotal_merge_tag_string( $form, $field, $filter_tags );
            $field['origCalculationFormula'] = $field['calculationFormula'];
            $field['calculationFormula'] = str_replace( self::$merge_tag, $subtotal_merge_tags, $field['calculationFormula'] );
 
        }
 
        return $form;
    }
    
    function maybe_replace_subtotal_merge_tag_submission( $form ) {
        return $this->maybe_replace_subtotal_merge_tag( $form, true );
    }
 
    /**
    * Get all the pricing fields on the form, get their corresponding merge tags and aggregate them into a formula that
    * will yeild the form's subtotal.
    *
    * @param mixed $form
    */
    static function get_subtotal_merge_tag_string( $form, $current_field, $filter_tags = false ) {
        
        $pricing_fields = self::get_pricing_fields( $form );
        $product_tag_groups = array();
        
        foreach( $pricing_fields['products'] as $product ) {
 
            $product_field = rgar( $product, 'product' );
            $option_fields = rgar( $product, 'options' );
            $quantity_field = rgar( $product, 'quantity' );
 
            // do not include current field in subtotal
            if( $product_field['id'] == $current_field['id'] )
                continue;
 
            $product_tags = GFCommon::get_field_merge_tags( $product_field );
            $quantity_tag = 1;
 
            // if a single product type, only get the "price" merge tag
            if( in_array( GFFormsModel::get_input_type( $product_field ), array( 'singleproduct', 'calculation', 'hiddenproduct' ) ) ) {
 
                // single products provide quantity merge tag
                if( empty( $quantity_field ) && ! rgar( $product_field, 'disableQuantity' ) )
                    $quantity_tag = $product_tags[2]['tag'];
 
                $product_tags = array( $product_tags[1] );
            }
 
            // if quantity field is provided for product, get merge tag
            if( ! empty( $quantity_field ) ) {
                $quantity_tag = GFCommon::get_field_merge_tags( $quantity_field );
                $quantity_tag = $quantity_tag[0]['tag'];
            }
            
            if( $filter_tags && ! self::has_valid_quantity( $quantity_tag ) )
                continue;
            
            $product_tags = wp_list_pluck( $product_tags, 'tag' );
            $option_tags = array();
            
            foreach( $option_fields as $option_field ) {
 
                if( is_array( $option_field['inputs'] ) ) {
 
                    $choice_number = 1;
 
                    foreach( $option_field['inputs'] as &$input ) {
 
                        //hack to skip numbers ending in 0. so that 5.1 doesn't conflict with 5.10
                        if( $choice_number % 10 == 0 )
                            $choice_number++;
 
                        $input['id'] = $option_field['id'] . '.' . $choice_number++;
 
                    }
                }
 
                $new_options_tags = GFCommon::get_field_merge_tags( $option_field );
                if( ! is_array( $new_options_tags ) )
                    continue;
 
                if( GFFormsModel::get_input_type( $option_field ) == 'checkbox' )
                    array_shift( $new_options_tags );
 
                $option_tags = array_merge( $option_tags, $new_options_tags );
            }
 
            $option_tags = wp_list_pluck( $option_tags, 'tag' );
 
            $product_tag_groups[] = '( ( ' . implode( ' + ', array_merge( $product_tags, $option_tags ) ) . ' ) * ' . $quantity_tag . ' )';
 
        }
 
        $shipping_tag = 0;
        /* Shipping should not be included in subtotal, correct?
        if( rgar( $pricing_fields, 'shipping' ) ) {
            $shipping_tag = GFCommon::get_field_merge_tags( rgars( $pricing_fields, 'shipping/0' ) );
            $shipping_tag = $shipping_tag[0]['tag'];
        }*/
 
        $pricing_tag_string = '( ( ' . implode( ' + ', $product_tag_groups ) . ' ) + ' . $shipping_tag . ' )';
 
        return $pricing_tag_string;
    }
    
    /**
    * Get all pricing fields from a given form object grouped by product and shipping with options nested under their
    * respective products.
    *
    * @param mixed $form
    */
    static function get_pricing_fields( $form ) {
 
        $product_fields = array();
 
        foreach( $form["fields"] as $field ) {
 
            if( $field["type"] != 'product' )
                continue;
 
            $option_fields = GFCommon::get_product_fields_by_type($form, array("option"), $field['id'] );
 
            // can only have 1 quantity field
            $quantity_field = GFCommon::get_product_fields_by_type( $form, array("quantity"), $field['id'] );
            $quantity_field = rgar( $quantity_field, 0 );
 
            $product_fields[] = array(
                'product' => $field,
                'options' => $option_fields,
                'quantity' => $quantity_field
                );
 
        }
 
        $shipping_field = GFCommon::get_fields_by_type($form, array("shipping"));
 
        return array( "products" => $product_fields, "shipping" => $shipping_field );
    }
    
    static function has_valid_quantity( $quantity_tag ) {
 
        if( is_numeric( $quantity_tag ) ) {
 
            $qty_value = $quantity_tag;
 
        } else {
 
            // extract qty input ID from the merge tag
            preg_match_all( '/{[^{]*?:(\d+(\.\d+)?)(:(.*?))?}/mi', $quantity_tag, $matches, PREG_SET_ORDER );
            $qty_input_id = rgars( $matches, '0/1' );
            $qty_value = rgpost( 'input_' . str_replace( '.', '_', $qty_input_id ) );
 
        }
        
        return intval( $qty_value ) > 0;
    }
    
    function add_merge_tags( $form ) {
 
        $label = __('Subtotal', 'gravityforms');
 
        ?>
 
        <script type="text/javascript">
 
            // for the future (not yet supported for calc field)
            gform.addFilter("gform_merge_tags", "gwcs_add_merge_tags");
            function gwcs_add_merge_tags( mergeTags, elementId, hideAllFields, excludeFieldTypes, isPrepop, option ) {
                mergeTags["pricing"].tags.push({ tag: '<?php echo self::$merge_tag; ?>', label: '<?php echo $label; ?>' });
                return mergeTags;
            }
 
            // hacky, but only temporary
            jQuery(document).ready(function($){
 
                var calcMergeTagSelect = $('#field_calculation_formula_variable_select');
                calcMergeTagSelect.find('optgroup').eq(0).append( '<option value="<?php echo self::$merge_tag; ?>"><?php echo $label; ?></option>' );
 
            });
 
        </script>
 
        <?php
        //return the form object from the php hook
        return $form;
    }
 
    static function has_subtotal_merge_tag( $field ) {
        
        // check if form is passed
        if( isset( $field['fields'] ) ) {
 
            $form = $field;
            foreach( $form['fields'] as $field ) {
                if( self::has_subtotal_merge_tag( $field ) )
                    return true;
            }
 
        } else {
 
            if( isset( $field['calculationFormula'] ) && strpos( $field['calculationFormula'], self::$merge_tag ) !== false )
                return true;
 
        }
 
        return false;
    }
 
}
 
new GWCalcSubtotal();

?>

以上是关于php 在重力形式中添加税的主要内容,如果未能解决你的问题,请参考以下文章

WP重力形式 - 添加范围滑块

php 重力Wiz //重力形式//修改条目中的日期字段格式

php 重力形式 - 禁止多种形式的字段中的字符

php 重力Wiz //重力形式//使用条目填充表单(可选择在提交时更新条目)

php 重力Wiz //重力形式//签到

php 重力Wiz //重力形式//时间敏感选择