WordPress - Gravity Forms - Создайте поле динамически - PullRequest
0 голосов
/ 05 апреля 2020

Попытка динамически создать новые поля для моей формы, поскольку я получаю json от стороннего API. Исходя из этого 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;
}

Это работает, ie, он показывает поля на внешнем интерфейсе. Теперь проблема заключается в том, что после отправки формы все поля, кроме этих динамически добавленных, находятся в отправке. Но это не так. Я предположил, что это связано с тем, что эти поля не зарегистрированы в форме, поэтому я также попытался GFAPI::update_form( $form );, но это не помогло с отправкой части, хотя и обновляет мою форму с новыми полями в бэкэнде.

Есть идеи?

1 Ответ

1 голос
/ 07 апреля 2020

Исходя из вашего варианта использования, Милош, я бы предложил использовать фильтр gform_form_post_get_meta:

https://docs.gravityforms.com/gform_form_post_get_meta/

Это будет срабатывать каждый раз при получении формы из базы данных, и самый надежный способ гарантировать ваши поля будут присутствовать.

Если вы предпочитаете быть более хирургическим и придерживаться подхода gform_pre_render, вы захотите применить ту же функцию на пару другие фильтры:

gform_pre_process
gform_admin_pre_render

...