Gravity Forms: динамическое создание набора полей - PullRequest
1 голос
/ 28 мая 2020

Я хочу разрешить пользователям выбирать настраиваемый тип сообщения из раскрывающегося поля и добавлять к нему дополнительные данные.

Например: пользователь может выбрать mov ie из списка. Для этого mov ie он может добавить количество копий и до тех пор, пока он не захочет их одолжить.

Итак, у меня всего три поля:

  1. Выпадающее поле с фильмами
  2. Числовое поле
  3. Поле даты

Теперь я хочу добавить этот набор полей для каждого mov ie в WordPress (настраиваемый тип сообщения). Поскольку я не знаю, сколько фильмов у нас есть в WordPress, я хочу генерировать поля динамически.

К счастью, я установил поле Repeater (beta) из Gravity Forms. С помощью этого поля пользователь может добавлять / удалять фильмы по своему усмотрению.

Демо и документы: https://docs.gravityforms.com/repeater-fields/

Проблема в том, что мне нужно заполнить первое поле (раскрывающийся список) с CPT фильмов в WordPress.

Вот мой текущий код для создания поля повторителя в форме:

// Adjust your form ID
add_filter( 'gform_form_post_get_meta_5', 'add_my_field' );
function add_my_field( $form ) {
    $movie_sku = GF_Fields::create( array(
        'type'   => 'text',
        'id'     => 1002, // The Field ID must be unique on the form
        'formId' => $form['id'],
        'required' => true,
        'label'  => 'Movie',
        'class'  => 'col-md-4',
        'pageNumber'  => 1, // Ensure this is correct
    ) );
    $movie_amount = GF_Fields::create( array(
        'type'   => 'text',
        'id'     => 1007, // The Field ID must be unique on the form
        'formId' => $form['id'],
        'required' => true,
        'label'  => 'Amount',
        'pageNumber'  => 1, // Ensure this is correct
    ) );
    $movie_date = GF_Fields::create( array(
        'type'   => 'text',
        'id'     => 1001, // The Field ID must be unique on the form
        'formId' => $form['id'],
        'required' => true,
        'label'  => 'Date',
        'pageNumber'  => 1, // Ensure this is correct
    ) );


    $movie = GF_Fields::create( array(
        'type'             => 'repeater',
        'required'          => true,
        'id'               => 1000, // The Field ID must be unique on the form
        'formId'           => $form['id'],
        'label'            => 'Add movie',
        'addButtonText'    => 'Add Another movie',
        'removeButtonText'=> 'Remove movie',
        'pageNumber'       => 1, // Ensure this is correct
        'fields'           => array( $movie_sku,$movie_amount, $movie_date), // Add the fields here.
    ) );

    $form['fields'][] = $movie;

    return $form;
}

// Remove the field before the form is saved. Adjust your form ID
add_filter( 'gform_form_update_meta_5', 'remove_my_field', 10, 3 );
function remove_my_field( $form_meta, $form_id, $meta_name ) {

    if ( $meta_name == 'display_meta' ) {
        // Remove the Repeater field: ID 1000
        $form_meta['fields'] = wp_list_filter( $form_meta['fields'], array( 'id' => 1000 ), 'NOT' );
    }

    return $form_meta;
}

А вот мой код для заполнения поля фильмы (пользовательский тип сообщения) в WordPress:

add_filter( 'gform_pre_render_5', 'populate_posts' );
add_filter( 'gform_pre_validation_5', 'populate_posts' );
add_filter( 'gform_pre_submission_filter_5', 'populate_posts' );
add_filter( 'gform_admin_pre_render_5', 'populate_posts' );
function populate_posts( $form ) {

    foreach ( $form['fields'] as &$field ) {

        if ( $field->type != 'select' || strpos( $field->cssClass, 'populate-movie' ) === false ) {
            continue;
        }

        // you can add additional parameters here to alter the posts that are retrieved
        // more info: http://codex.wordpress.org/Template_Tags/get_posts

        $args = array(
        'orderby'       =>  'title',
        'order'         =>  'ASC',
        'numberposts'   => -1,
        'post_type'     => 'movie',
        'post_status'   => array('publish'),

        );

        $posts = get_posts( $args );

        $choices = array();

        foreach ( $posts as $post ) {

            $choices[] = array(
                'text'  => $post->post_title,
                'value' => $post->post_title
            );
        }

        // update 'Select a Post' to whatever you'd like the instructive option to be
        $field->placeholder = 'Select movie';
        $field->choices = $choices;

    }

    return $form;
}

Но как я могу объединить эти две функции и динамически заполнить раскрывающееся поле с фильмами?

1 Ответ

1 голос
/ 28 мая 2020

Думаю, я нашел решение:

Перед первой GF_Fields::create Мне нужно скопировать следующий код из моей второй функции:

$args = array(
        'orderby'       =>  'title',
        'order'         =>  'ASC',
        'numberposts'   => -1,
        'post_type'     => 'movie',
        'post_status'   => array('publish'),

        );

        $posts = get_posts( $args );

        $choices = array();

        foreach ( $posts as $post ) {

            $choices[] = array(
                'text'  => $post->post_title,
                'value' => $post->post_title
            );
        }

Затем мне нужно отредактировать первую GF_Fields::create вот так:

$movie_sku = GF_Fields::create( array(
    'type'   => 'select',
    'id'     => 1002, // The Field ID must be unique on the form
    'formId' => $form['id'],
    'required' => true,
    'label'  => 'Movie',
    'choices'  => $choices,
    'pageNumber'  => 1, // Ensure this is correct
) );

Новая часть - это 'choices' => $choices,, который получает данные из приведенного выше кода. И, конечно же, мне пришлось изменить тип ввода, чтобы выбрать: 'type' => 'select',.

...