重力形式查找列表总和

时间:2016-03-08 16:16:13

标签: javascript php wordpress pdf-generation gravity-forms-plugin

我正在尝试计算Gravity Forms中列表列的总和, 不幸的是,这不是主插件中包含的功能,所以我必须找到一个不同的源来完成这个。我能够找到一个应该完成此任务的脚本,可以在这里找到, jsFiddle

function calculateLFColumnTotal(formId, columnClass, totalFieldId, currency) {
var columnTotal = 0,
    preField = '#field_' + formId + '_' + totalFieldId,
    totalField = jQuery('#input_' + formId + '_' + totalFieldId),
    cellValue;
currency = (currency && typeof gf_global !== 'undefined');
jQuery(columnClass).each(function () {
    cellValue = jQuery(this).val();
    cellValue = (currency) ? gformToNumber(cellValue) : cellValue;
    columnTotal += parseFloat(cellValue) || 0;
});x
if (jQuery(preField).hasClass('gfield_price')) {
    columnTotal = gformFormatMoney(columnTotal);
    if (jQuery(preField + ' input').length > 1) {
        totalField.html(columnTotal);
        totalField = jQuery('input[name="input_' + totalFieldId + '.2"]');
    }
} else {
    columnTotal = (currency) ? gformFormatMoney(columnTotal) : columnTotal;
}
totalField.val(columnTotal).change();
gformCalculateTotalPrice(formId);
}
    function listFieldColumnTotal(formId, fieldId, column, totalFieldId,       currency) {
var listField = '#field_' + formId + '_' + fieldId,
    columnClass = '.gfield_list_' + fieldId + '_cell' + column + ' input';
jQuery(listField).on('blur', columnClass, function () {
    if (currency && typeof gf_global !== 'undefined') {
        gformFormatPricingField(this);
    }
    calculateLFColumnTotal(formId, columnClass, totalFieldId, currency);
});
jQuery(listField).on('click', '.add_list_item', function () {
    jQuery(listField + ' .delete_list_item').removeProp('onclick');
});
jQuery(listField).on('click', '.delete_list_item', function () {
    gformDeleteListItem(this, 0);
    calculateLFColumnTotal(formId, columnClass, totalFieldId, currency);
});
}
 listFieldColumnTotal( 140, 1, 3, 3, true );

但是,我不确定哪些元素应该更改,哪些应该保留原样。如果有人有这方面的经验,并能指导我朝着正确的方向发展,那就太棒了。

2 个答案:

答案 0 :(得分:1)

这里有点晚了,但我偶然发现了这个脚本并决定使用它来创建用户定义的价格字段数量。客户希望能够输入多个发票金额并显示总金额,并且我能够使用以下方法实现此工作:

  1. 剧本的神奇之处在于最后一行:

    listFieldColumnTotal( 140, 1, 3, 3, true );
    
  2. 元素在函数中描述,但按如下顺序描述:

    • 表格ID(例如gform_wrapper_ 6
    • 列表容器的ID(例如#field_6_ 7
    • 我们要用作列表容器下方的动态值的列项(例如.gfield_list_7_cell 2
    • 结果输入容器的ID(例如field_6_ 18
    • 定义是否使用货币(我没有尝试将此值设置为" false",但我认为它的工作方式相同

    因此,这将导致我们的最终声明将如下所示:

        listFieldColumnTotal( 6, 7, 2, 18, true );
    
    1. 我使用gform_pre_render过滤器将脚本附加到表单。为此,我们将上述脚本集成到functions.php文件中:
    2. 
      
          add_filter( 'gform_pre_render', 'realtimePriceListUpdate' );
      	function realtimePriceListUpdate( $form ) {
      	?>
      
      		<script type="text/javascript">
      
      			jQuery(document).ready(function(){
      
      				function calculateLFColumnTotal(formId, columnClass, totalFieldId, currency) {
      				    var columnTotal = 0,
      				        preField = '#field_' + formId + '_' + totalFieldId,
      				        totalField = jQuery('#input_' + formId + '_' + totalFieldId),
      				        cellValue;
      				    currency = (currency && typeof gf_global !== 'undefined');
      				    jQuery(columnClass).each(function () {
      				        cellValue = jQuery(this).val();
      				        cellValue = (currency) ? gformToNumber(cellValue) : cellValue;
      				        columnTotal += parseFloat(cellValue) || 0;
      				    });
      				    if (jQuery(preField).hasClass('gfield_price')) {
      				        columnTotal = gformFormatMoney(columnTotal);
      				        if (jQuery(preField + ' input').length > 1) {
      				            totalField.html(columnTotal);
      				            totalField = jQuery('input[name="input_' + totalFieldId + '.2"]');
      
      				        }
      				    } else {
      				        columnTotal = (currency) ? gformFormatMoney(columnTotal) : columnTotal;
      				    }
      
      					totalField.val(columnTotal);
      		    		gformCalculateTotalPrice(formId);
      
      				}
      
      				function listFieldColumnTotal(formId, fieldId, column, totalFieldId, currency) {
      				    var listField = '#field_' + formId + '_' + fieldId,
      				        columnClass = '.gfield_list_' + fieldId + '_cell' + column + ' input';
      				    
      				    jQuery(listField).on('focusout', columnClass, function () {
      
      				        if (currency && typeof gf_global !== 'undefined') {
      				            gformFormatPricingField(this);
      				        }
      				        calculateLFColumnTotal(formId, columnClass, totalFieldId, currency);
      
      				    });
      
      				    jQuery(listField).on('click', '.add_list_item', function () {
      				        jQuery(listField + ' .delete_list_item').removeProp('onclick');
      				    });
      
      				    jQuery(listField).on('click', '.delete_list_item', function () {
      				        gformDeleteListItem(this, 0);
      				        calculateLFColumnTotal(formId, columnClass, totalFieldId, currency);
      				    });
      
      				}
      
      			 	listFieldColumnTotal( 6, 7, 2, 18, true );
      
      			});	
      
      		</script>
      
      		<?php
      
      		return $form;
      
      	}
      &#13;
      &#13;
      &#13;

      1. 最后,我们无法使用&#34;总计&#34;由Gravity表格提供的字段。我们必须制作一个&#34;产品&#34;字段,这是我们从步骤1中获取id的字段(结果输入容器的id)。此外,我们必须启用&#34;允许字段动态填充&#34; “产品”字段的“高级”选项卡中的选项。或者,我们可以将产品的字段类型更改为&#34;隐藏&#34;,因为我们不想显示总计和产品字段。 Here's a screenshot of the fields required for this list calculation script

答案 1 :(得分:0)

您是否尝试过List Field Calculations插件?

它扩展了数字字段计算选项以包括列表字段列。

您可以获取字段的总数和字段中的行数,然后配置您自己的计算,例如'第3列的总和'。计算将自动填充数字字段。