WordPress - Gravity Forms - 动态创建字段
WordPress - Gravity Forms - Create field dynamically
尝试为我的表单动态创建新字段,因为我从第 3 方 API 获得 json。基于此 json,我需要将一些字段添加到我的表单中 - 不是固定数量。所以,我正在这样做,将它连接到 gform_pre_render
:
add_filter( 'gform_pre_process', 'create_products_gforms' );
add_filter( 'gform_admin_pre_render', 'create_products_gforms' );
add_filter( 'gform_pre_render', 'create_products_gforms' );
function create_products_gforms( $form ) {
$helper = new NSHelper();
$state_name = $_POST['input_7'] ?? '';
$code_value = $helper->get_state_code_by_name( $state_name );
// Only fetch products if current form id is 33, state code is defined
// and if there are products for this state.
if ( $form['id'] != 33 || !$code_value ) {
return $form;
}
// Get product list from NetSuit API based on state code
$products_json_data = get_products_data( $code_value );
$products = json_decode( json_decode( $products_json_data ) );
$new_field_id = 0;
foreach( $form['fields'] as $field ) {
if( $field->id > $new_field_id ) {
$new_field_id = $field->id;
}
}
$new_field_id++;
foreach ( $products as $product_object ) {
// Prepare field properties
$props = array(
'id' => $new_field_id,
'type' => 'singleproduct',
'label' => $product_object->onlinedisplayname,
'basePrice' => floatval( $product_object->price ),
'enableCalculation' => true
);
// Create new gravity forms field and add it to the form object
$nf = GF_Fields::create( $props );
// Hack - insert into array at specific position
// Needed to display product fields before other fields
// in the form
array_splice( $form['fields'], 11, 0, array($nf) );
$new_field_id++;
}
GFAPI::update_form( $form );
$form['dynamic_fields_ids'] = $added_fields_ids;
return $form;
}
这有效,即它在前端正确显示了字段。现在,问题在于,一旦提交了表单,除了这些动态添加的字段之外的所有字段都在提交中。但这些都不是。我认为这必须这样做,因为这些字段没有在表单中注册,所以我也尝试了 GFAPI::update_form( $form );
,但这对提交部分没有帮助,尽管它也在后端使用新字段更新了我的表单。
有什么想法吗?
根据您的用例,Milos,我建议使用 gform_form_post_get_meta 过滤器:
https://docs.gravityforms.com/gform_form_post_get_meta/
每次从数据库中获取表单时都会触发,这是保证您的字段存在的最可靠方法。
如果您更喜欢外科手术并坚持使用 gform_pre_render 方法,您将需要在其他几个过滤器上应用相同的功能:
gform_pre_process
gform_admin_pre_render
尝试为我的表单动态创建新字段,因为我从第 3 方 API 获得 json。基于此 json,我需要将一些字段添加到我的表单中 - 不是固定数量。所以,我正在这样做,将它连接到 gform_pre_render
:
add_filter( 'gform_pre_process', 'create_products_gforms' );
add_filter( 'gform_admin_pre_render', 'create_products_gforms' );
add_filter( 'gform_pre_render', 'create_products_gforms' );
function create_products_gforms( $form ) {
$helper = new NSHelper();
$state_name = $_POST['input_7'] ?? '';
$code_value = $helper->get_state_code_by_name( $state_name );
// Only fetch products if current form id is 33, state code is defined
// and if there are products for this state.
if ( $form['id'] != 33 || !$code_value ) {
return $form;
}
// Get product list from NetSuit API based on state code
$products_json_data = get_products_data( $code_value );
$products = json_decode( json_decode( $products_json_data ) );
$new_field_id = 0;
foreach( $form['fields'] as $field ) {
if( $field->id > $new_field_id ) {
$new_field_id = $field->id;
}
}
$new_field_id++;
foreach ( $products as $product_object ) {
// Prepare field properties
$props = array(
'id' => $new_field_id,
'type' => 'singleproduct',
'label' => $product_object->onlinedisplayname,
'basePrice' => floatval( $product_object->price ),
'enableCalculation' => true
);
// Create new gravity forms field and add it to the form object
$nf = GF_Fields::create( $props );
// Hack - insert into array at specific position
// Needed to display product fields before other fields
// in the form
array_splice( $form['fields'], 11, 0, array($nf) );
$new_field_id++;
}
GFAPI::update_form( $form );
$form['dynamic_fields_ids'] = $added_fields_ids;
return $form;
}
这有效,即它在前端正确显示了字段。现在,问题在于,一旦提交了表单,除了这些动态添加的字段之外的所有字段都在提交中。但这些都不是。我认为这必须这样做,因为这些字段没有在表单中注册,所以我也尝试了 GFAPI::update_form( $form );
,但这对提交部分没有帮助,尽管它也在后端使用新字段更新了我的表单。
有什么想法吗?
根据您的用例,Milos,我建议使用 gform_form_post_get_meta 过滤器:
https://docs.gravityforms.com/gform_form_post_get_meta/
每次从数据库中获取表单时都会触发,这是保证您的字段存在的最可靠方法。
如果您更喜欢外科手术并坚持使用 gform_pre_render 方法,您将需要在其他几个过滤器上应用相同的功能:
gform_pre_process
gform_admin_pre_render