【问题标题】:WordPress - Gravity Forms - Create field dynamicallyWordPress - 重力形式 - 动态创建字段
【发布时间】:2020-07-17 12:07:45
【问题描述】:

尝试为我的表单动态创建新字段,因为我正在从 3rd 方 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 );,但这对提交部分没有帮助,尽管它也在后端用新字段更新了我的表单。

有什么想法吗?

【问题讨论】:

  • 需要注意的一点是,临时添加到表单中的字段(未保存在数据库中)也应在创建时设置formId 属性。将字段添加到 $form['fields'] 数组是不够的。没有它,GF 无法“看到”提交的数据,即使它存在于$_POST

标签: wordpress gravity-forms-plugin gravityforms


【解决方案1】:

根据您的用例,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

【讨论】:

  • 感谢您的尝试。我已经更新了我的问题中的代码。因为代码由于某种原因仍然没有更新条目。但是,对于我新创建的字段,我确实得到了以下信息:注意:未定义索引:第 66 行 /public/wp-content/plugins/gravityforms/includes/fields/class-gf-field-singleproduct.php 中的 47.3
  • 另外,请注意,我真的不想为表单保存新字段,以便下次使用。我想创建字段,将其放入表单中只是为了创建当前条目,然后将它们从表单中删除。所以,我不需要表单中的永久字段,只需要临时字段。
  • 您打算如何查看此条目数据?如果没有这些字段,GF 将不知道在管理员中显示什么。
  • 什么意思?如果管理员中没有字段,它不会显示在条目列表中?老实说,这听起来很荒谬。我计划创建字段,更新表单数据,在后端更新表单,保存条目,从后端删除新添加的字段。
  • 另外,不管怎样,正如我所说,上面的代码仍然不起作用,即使我添加了GFAPI::update_form( $form );
猜你喜欢
  • 2020-09-16
  • 2021-04-27
  • 1970-01-01
  • 2017-12-23
  • 2021-06-05
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
相关资源
最近更新 更多