Gravity Forms - Как переместить радиовход внутри элемента метки - PullRequest
0 голосов
/ 09 мая 2020

Я использую WordPress Gravity Forms с их Дополнением для викторины , и я хочу отредактировать HTML радиовходов ответов в викторине.

Это то, что формирует Gravity в настоящее время отображается для каждого элемента li ответов викторины:

<li class="gchoice_3_1_1">
    <input name="input_1" type="radio" value="gquiz1c4448d0c" checked="checked" id="choice_3_1_1" tabindex="2">
    <label for="choice_3_1_1" id="label_3_1_1" class="gquiz-correct-choice">Example label text
        <img class="gquiz-indicator" src="https://www.example.com/wp-content/plugins/gravityformsquiz-master/images/tick.png" alt="Correct response">
    </label>
</li>

Это то, чего я хочу достичь (переместите элемент input в поле label):

<li class="gchoice_3_1_1">
    <label for="choice_3_1_1" id="label_3_1_1" class="gquiz-correct-choice">Example label text
        <input name="input_1" type="radio" value="gquiz1c4448d0c" checked="checked" id="choice_3_1_1" tabindex="2">
        <img class="gquiz-indicator" src="https://www.example.com/wp-content/plugins/gravityformsquiz-master/images/tick.png" alt="Correct response">
    </label>
</li>

И это функция PHP, которую я использую внутри дочерних тем functions.php, чтобы попытаться достичь ее:

// move radio input inside label
add_filter("gform_field_choices", "radio_input_inside_label", 10, 2);
function radio_input_inside_label($choices, $field){
    if($field["type"] != "radio")
        return $choices;

    $choices = "";

    if(is_array($field["choices"])){
        $choice_id = 0;
        $count = 1;

        $logic_event = !empty($field["conditionalLogicFields"]) ? "onclick='gf_apply_rules(" . $field["formId"] . "," . GFCommon::json_encode($field["conditionalLogicFields"]) . ");'" : "";

        foreach($field["choices"] as $choice){
            $id = $field["id"] . '_' . $choice_id++;
            $field_value = !empty($choice["value"]) || rgar($field, "enableChoiceValue") ? $choice["value"] : $choice["text"];
            $checked = rgar($choice,"isSelected") ? "checked='checked'" : "";
            $tabindex = GFCommon::get_tabindex();

            $input = sprintf("<input name='input_%d' type='radio' value='%s' %s id='choice_%s' $tabindex $logic_event />", $field["id"], esc_attr($field_value), $checked, $id);
            $choices .= sprintf("<li class='gchoice_$id'><label for='choice_%s'>%s %s</label></li>", $id, $choice["text"], $input);

            $count++;
        }

    }

    return $choices;
}

Эта функция работает для стандартных входов Radio, она перемещается input внутри label. Но это не работает для радиовходов викторины.

Вы видите, что не так?

1 Ответ

0 голосов
/ 11 мая 2020

Я использовал неправильный селектор типа поля.

Если вы хотите переместить радиовход внутри элемента метки для переключателей НОРМАЛЬНЫХ гравитационных форм, то этот код будет работать:

// Gravity Forms Quiz - move radio input inside label
add_filter("gform_field_choices", "radio_input_inside_label", 10, 2);
function radio_input_inside_label($choices, $field){
    if($field["type"] != "radio")
        return $choices;

    $choices = "";

    if(is_array($field["choices"])){
        $choice_id = 0;
        $count = 1;

        $logic_event = !empty($field["conditionalLogicFields"]) ? "onclick='gf_apply_rules(" . $field["formId"] . "," . GFCommon::json_encode($field["conditionalLogicFields"]) . ");'" : "";

        foreach($field["choices"] as $choice){
            $id = $field["id"] . '_' . $choice_id++;
            $field_value = !empty($choice["value"]) || rgar($field, "enableChoiceValue") ? $choice["value"] : $choice["text"];
            $checked = rgar($choice,"isSelected") ? "checked='checked'" : "";
            $tabindex = GFCommon::get_tabindex();

            $input = sprintf("<input name='input_%d' type='radio' value='%s' %s id='choice_%s' $tabindex $logic_event />", $field["id"], esc_attr($field_value), $checked, $id);
            $choices .= sprintf("<li class='gchoice_$id'><label for='choice_%s'>%s %s</label></li>", $id, $input, $choice["text"]);

            $count++;
        }

    }

    return $choices;
}

Но если у вас установлен аддон Gravity Forms Quiz, и вы хотите переместить ТАКИЕ радиовходы внутри метки, то этот код - то, что вам нужно. Единственное отличие состоит в том, что if($field["type"] != "radio") заменяется if($field["type"] != "quiz").

// Gravity Forms Quiz - move radio input inside label
add_filter("gform_field_choices", "radio_input_inside_label", 10, 2);
function radio_input_inside_label($choices, $field){
    if($field["type"] != "quiz") // <--- CHANGE HERE
        return $choices;

    $choices = "";

    if(is_array($field["choices"])){
        $choice_id = 0;
        $count = 1;

        $logic_event = !empty($field["conditionalLogicFields"]) ? "onclick='gf_apply_rules(" . $field["formId"] . "," . GFCommon::json_encode($field["conditionalLogicFields"]) . ");'" : "";

        foreach($field["choices"] as $choice){
            $id = $field["id"] . '_' . $choice_id++;
            $field_value = !empty($choice["value"]) || rgar($field, "enableChoiceValue") ? $choice["value"] : $choice["text"];
            $checked = rgar($choice,"isSelected") ? "checked='checked'" : "";
            $tabindex = GFCommon::get_tabindex();

            $input = sprintf("<input name='input_%d' type='radio' value='%s' %s id='choice_%s' $tabindex $logic_event />", $field["id"], esc_attr($field_value), $checked, $id);
            $choices .= sprintf("<li class='gchoice_$id'><label for='choice_%s'>%s %s</label></li>", $id, $input, $choice["text"]);

            $count++;
        }

    }

    return $choices;
}
...