Benutzerdefiniertes Schwerkraftformularfeld mit mehreren Eingaben

Lesezeit: 13 Minuten

Benutzer-Avatar
Trevor Geene

Ich habe an einer Gravity Forms-Erweiterung für einen Kunden gearbeitet. Das Konzept besteht darin, einen neuen Feldtyp mit 4 Eingaben hinzuzufügen. Ich habe ungefähr 10 verschiedene Variationen ausprobiert, wie Menschen benutzerdefinierte Schwerkraftformularfelder erstellen, aber ich stoße immer wieder auf dasselbe Problem.

Wenn ich beim Erstellen eines benutzerdefinierten Felds nur 1 Eingabe unter der Namenskonvention von verwende input_{field_id} Das Formular wird ordnungsgemäß gespeichert und validiert. Aber im Moment versuche ich, mehr als ein Feld mit den Namen hinzuzufügen input_{field_id}.{i} Genau wie die eingebauten Felder speichert das Formular meine Daten nicht mehr.

<?php if ( ! class_exists( 'GFForms' ) ) { die(); }

class GF_Field_Attendees extends GF_Field {

    public $type="attendees";

    public function get_form_editor_field_title() { return esc_attr__( 'Attendees', 'gravityforms' ); }

    public function get_form_editor_button() {
        return array(
            'group' => 'advanced_fields',
            'text'  => $this->get_form_editor_field_title(),
            'onclick'   => "StartAddField('".$this->type."');",
        );
    }

    public function get_form_editor_field_settings() {
        return array(
            'conditional_logic_field_setting',
            'prepopulate_field_setting',
            'error_message_setting',
            'label_setting',
            'admin_label_setting',
            'rules_setting',
            'duplicate_setting',
            'description_setting',
            'css_class_setting',
        );
    }

    public function is_conditional_logic_supported() { return true; }

    public function get_field_input( $form, $value="", $entry = null ) {
        $form_id    = $form['id'];
        $field_id   = intval( $this->id );

        $first  = esc_attr( GFForms::get( 'input_' . $this->id . '_1', $value ) );
        $last   = esc_attr( GFForms::get( 'input_' . $this->id . '_2', $value ) );
        $email  = esc_attr( GFForms::get( 'input_' . $this->id . '_3', $value ) );
        $phone  = esc_attr( GFForms::get( 'input_' . $this->id . '_4', $value ) );

        $disabled_text = $is_form_editor ? "disabled='disabled'" : '';
        $class_suffix  = $is_entry_detail ? '_admin' : '';

        $first_tabindex = GFCommon::get_tabindex();
        $last_tabindex  = GFCommon::get_tabindex();
        $email_tabindex = GFCommon::get_tabindex();
        $phone_tabindex = GFCommon::get_tabindex();

        $required_attribute     = $this->isRequired ? 'aria-required="true"' : '';
        $invalid_attribute      = $this->failed_validation ? 'aria-invalid="true"' : 'aria-invalid="false"';

        $first_markup = '<span id="input_'.$field_id.'_'.$form_id.'.1_container" class="attendees_first">';
            $first_markup .= '<input type="text" name="input_'.$field_id.'.1" id="input_'.$field_id.'_'.$form_id.'_1" value="'.$first.'" aria-label="First Name" '.$first_tabindex.' '.$disabled_text.' '.$required_attribute.' '.$invalid_attribute.'>';
            $first_markup .= '<label for="input_'.$field_id.'_'.$form_id.'_1">First Name</label>';
        $first_markup .= '</span>';

        $last_markup = '<span id="input_'.$field_id.'_'.$form_id.'.2_container" class="attendees_last">';
            $last_markup .= '<input type="text" name="input_'.$field_id.'.2" id="input_'.$field_id.'_'.$form_id.'_2" value="'.$last.'" aria-label="Last Name" '.$last_tabindex.' '.$disabled_text.' '.$required_attribute.' '.$invalid_attribute.'>';
            $last_markup .= '<label for="input_'.$field_id.'_'.$form_id.'_2">Last Name</label>';
        $last_markup .= '</span>';

        $email_markup = '<span id="input_'.$field_id.'_'.$form_id.'.3_container" class="attendees_email">';
            $email_markup .= '<input type="text" name="input_'.$field_id.'.3" id="input_'.$field_id.'_'.$form_id.'_3" value="'.$email.'" aria-label="Email" '.$email_tabindex.' '.$disabled_text.' '.$required_attribute.' '.$invalid_attribute.'>';
            $email_markup .= '<label for="input_'.$field_id.'_'.$form_id.'_3">Email</label>';
        $email_markup .= '</span>';

        $phone_markup = '<span id="input_'.$field_id.'_'.$form_id.'.4_container" class="attendees_phone">';
            $phone_markup .= '<input type="text" name="input_'.$field_id.'.4" id="input_'.$field_id.'_'.$form_id.'_4" value="'.$phone.'" aria-label="Phone #" '.$phone_tabindex.' '.$disabled_text.' '.$required_attribute.' '.$invalid_attribute.'>';
            $phone_markup .= '<label for="input_'.$field_id.'_'.$form_id.'_4">Phone #</label>';
        $phone_markup .= '</span>';

        $css_class = $this->get_css_class();

        return "<div class="ginput_complex{$class_suffix} ginput_container {$css_class} gfield_trigger_change" id='{$field_id}'>
                    {$first_markup}
                    {$last_markup}
                    {$email_markup}
                    {$phone_markup}
                    <div class="gf_clear gf_clear_complex"></div>
                </div>";
    }

    public function get_css_class() {
        $first_input = GFFormsModel::get_input( $this, $this->id . '_2' );
        $last_input  = GFFormsModel::get_input( $this, $this->id . '_3' );
        $email_input = GFFormsModel::get_input( $this, $this->id . '_4' );
        $phone_input   = GFFormsModel::get_input( $this, $this->id . '_5' );

        $css_class="";
        $visible_input_count = 0;

        if ( $first_input && ! rgar( $first_input, 'isHidden' ) ) {
            $visible_input_count++;
            $css_class .= 'has_first_name ';
        } else {
            $css_class .= 'no_first_name ';
        }

        if ( $last_input && ! rgar( $last_input, 'isHidden' ) ) {
            $visible_input_count++;
            $css_class .= 'has_last_name ';
        } else {
            $css_class .= 'no_last_name ';
        }

        if ( $email_input && ! rgar( $email_input, 'isHidden' ) ) {
            $visible_input_count++;
            $css_class .= 'has_email ';
        } else {
            $css_class .= 'no_email ';
        }

        if ( $phone_input && ! rgar( $phone_input, 'isHidden' ) ) {
            $visible_input_count++;
            $css_class .= 'has_phone ';
        } else {
            $css_class .= 'no_phone ';
        }

        $css_class .= "gf_attendees_has_{$visible_input_count} ginput_container_attendees ";

        return trim( $css_class );
    }

    public function get_value_submission( $field_values, $get_from_post ) {
        if(!$get_from_post) {
            return $field_values;
        }

        return $_POST;
    }
}

GF_Fields::register( new GF_Field_Attendees() );

Ich habe ungefähr 20 Stunden damit verbracht, verschiedene Fixes auszuprobieren und im Internet zu suchen, um das zum Laufen zu bringen, ohne dass ich dafür Glück hatte. Irgendwann konnte ich die Formularfelder mit einer anderen Methode speichern (siehe unten), aber ich konnte das Feld nicht als Pflichtfeld festlegen oder die bedingte Anmeldung dafür verwenden, was ein Muss ist.

$group_title = "Attendees";
$group_name = "attendees";
$group_fields = array(
    'attendee_first' => 'First Name',
    'attendee_last' => 'Last Name',
    'attendee_email' => 'Email',
    'attendee_phone' => 'Phone'
);
$group_values = array();

add_filter('gform_add_field_buttons', add_field);
function add_field($field_group)
{
  global $group_title, $group_name;

  foreach ($field_group as &$group) {

    if ($group['name'] == 'advanced_fields') {
      $group['fields'][] = array (
        'class'     => 'button',
        'value'     => __($group_title, 'gravityforms'),
        'onclick'   => "StartAddField('".$group_name."');",
        'data-type' => $group_name
      );
      break;
    }
  }

  return $field_group;
}

add_filter('gform_field_type_title', add_field_title, 10, 2);
function add_field_title($title, $field_type)
{
  global $group_title, $group_name;

  if ($field_type == $group_name) {
    $title = __($group_title, 'gravityforms');
  }

  return $title;
}

add_filter('gform_field_input', 'render_fields', 10, 5);
function render_fields($input, $field, $value, $entry_id, $form_id)
{
  global $group_name, $group_fields;

  if ($field->type == $group_name)
  {
    $i = 1;
    $input="<div class="ginput_complex ginput_container">";
    foreach ($group_fields as $key => $val) {
        $input .= '<span id="input_'.$field['id'].'_'.$form_id.'_'.$i.'_container" class="name_suffix ">';
            $input .= '<input type="text" name="input_'.$field['id'].'_'.$i.'" id="input_'.$field['id'].'_'.$form_id.'_'.$i.'" value="'.$value[$field['id'].'.'.$i].'" class="'.esc_attr($key).'" aria-label="'.$val.'">';
            $input .= '<label for="input_'.$field['id'].'_'.$form_id.'_'.$i.'">'.$val.'</label>';
        $input .= '</span>';
        $i ++;
        if ($i % 10 == 0) { $i++; }
    }
    $input .= '</div>';
  }

  return $input;
}

add_action('gform_editor_js_set_default_values', set_default_values);
function set_default_values()
{
  global $group_title, $group_name, $group_fields;
  ?>
  case '<?php echo $group_name; ?>' :
    field.label="<?php _e($group_title, "gravityforms'); ?>';
    field.inputs = [
        <?php
        $i = 1;
        foreach ($group_fields as $key => $val) { ?>
            new Input(field.id + 0.<?php echo $i; ?>, '<?php echo esc_js(__($val, 'gravityforms')); ?>'),
        <?php
            $i++;
            if ($i % 10 == 0) { $i++; }
        } ?>
    ];
    break;
  <?php
}

add_filter( 'gform_entry_field_value', 'category_names', 10, 4 );
function category_names( $value, $field, $lead, $form )
{
  global $group_name, $group_values;

  if($field->type == $group_name)
  {
    $array = array();
    $output = "";
    foreach($field->inputs as $input)
    {
      $array[$input['label']] = $value[$input['id']];

      $output .= "<strong>".$input['label'].":</strong> ";
      $output .= $value[$input['id']]."<br>";
    }
    $group_values[] = $array;

    return $output;
  }

  return $value;
}

Wenn mir jemand bei einem der beiden Probleme helfen kann, wäre ich sehr dankbar.

Klassenaktualisierung:

  • Aufgeräumt get_field_input

  • Hinzugefügt get_value_submission

  • Ich habe immer noch keine Antworten auf meine Frage gefunden. Wenn jemand das jemals löst, würde ich gerne davon hören.

    – Trevor Geene

    29. März 2017 um 22:15 Uhr

Nachdem wir einige Tage mit dem Gravity Forms-Supportteam zusammengearbeitet hatten, konnten wir diese Lösung finden. Alles scheint jetzt zu funktionieren. Hoffe, das hilft jemandem in der Zukunft.

class GF_Field_Attendees extends GF_Field {

    public $type="attendees";

    public function get_form_editor_field_title() {
        return esc_attr__( 'Attendees', 'gravityforms' );
    }

    public function get_form_editor_button() {
        return array(
            'group' => 'advanced_fields',
            'text'  => $this->get_form_editor_field_title(),
        );
    }

    public function get_form_editor_field_settings() {
        return array(
            'conditional_logic_field_setting',
            'prepopulate_field_setting',
            'error_message_setting',
            'label_setting',
            'admin_label_setting',
            'rules_setting',
            'duplicate_setting',
            'description_setting',
            'css_class_setting',
        );
    }

    public function is_conditional_logic_supported() {
        return true;
    }

    public function get_field_input( $form, $value="", $entry = null ) {
        $is_entry_detail = $this->is_entry_detail();
        $is_form_editor  = $this->is_form_editor();

        $form_id  = $form['id'];
        $field_id = intval( $this->id );

        $first = $last = $email = $phone="";

        if ( is_array( $value ) ) {
            $first = esc_attr( rgget( $this->id . '.1', $value ) );
            $last  = esc_attr( rgget( $this->id . '.2', $value ) );
            $email = esc_attr( rgget( $this->id . '.3', $value ) );
            $phone = esc_attr( rgget( $this->id . '.4', $value ) );
        }

        $disabled_text = $is_form_editor ? "disabled='disabled'" : '';
        $class_suffix  = $is_entry_detail ? '_admin' : '';

        $first_tabindex = GFCommon::get_tabindex();
        $last_tabindex  = GFCommon::get_tabindex();
        $email_tabindex = GFCommon::get_tabindex();
        $phone_tabindex = GFCommon::get_tabindex();

        $required_attribute = $this->isRequired ? 'aria-required="true"' : '';
        $invalid_attribute  = $this->failed_validation ? 'aria-invalid="true"' : 'aria-invalid="false"';

        $first_markup = '<span id="input_' . $field_id . '_' . $form_id . '.1_container" class="attendees_first">';
        $first_markup .= '<input type="text" name="input_' . $field_id . '.1" id="input_' . $field_id . '_' . $form_id . '_1" value="' . $first . '" aria-label="First Name" ' . $first_tabindex . ' ' . $disabled_text . ' ' . $required_attribute . ' ' . $invalid_attribute . '>';
        $first_markup .= '<label for="input_' . $field_id . '_' . $form_id . '_1">First Name</label>';
        $first_markup .= '</span>';

        $last_markup = '<span id="input_' . $field_id . '_' . $form_id . '.2_container" class="attendees_last">';
        $last_markup .= '<input type="text" name="input_' . $field_id . '.2" id="input_' . $field_id . '_' . $form_id . '_2" value="' . $last . '" aria-label="Last Name" ' . $last_tabindex . ' ' . $disabled_text . ' ' . $required_attribute . ' ' . $invalid_attribute . '>';
        $last_markup .= '<label for="input_' . $field_id . '_' . $form_id . '_2">Last Name</label>';
        $last_markup .= '</span>';

        $email_markup = '<span id="input_' . $field_id . '_' . $form_id . '.3_container" class="attendees_email">';
        $email_markup .= '<input type="text" name="input_' . $field_id . '.3" id="input_' . $field_id . '_' . $form_id . '_3" value="' . $email . '" aria-label="Email" ' . $email_tabindex . ' ' . $disabled_text . ' ' . $required_attribute . ' ' . $invalid_attribute . '>';
        $email_markup .= '<label for="input_' . $field_id . '_' . $form_id . '_3">Email</label>';
        $email_markup .= '</span>';

        $phone_markup = '<span id="input_' . $field_id . '_' . $form_id . '.4_container" class="attendees_phone">';
        $phone_markup .= '<input type="text" name="input_' . $field_id . '.4" id="input_' . $field_id . '_' . $form_id . '_4" value="' . $phone . '" aria-label="Phone #" ' . $phone_tabindex . ' ' . $disabled_text . ' ' . $required_attribute . ' ' . $invalid_attribute . '>';
        $phone_markup .= '<label for="input_' . $field_id . '_' . $form_id . '_4">Phone #</label>';
        $phone_markup .= '</span>';

        $css_class = $this->get_css_class();

        return "<div class="ginput_complex{$class_suffix} ginput_container {$css_class} gfield_trigger_change" id='{$field_id}'>
                    {$first_markup}
                    {$last_markup}
                    {$email_markup}
                    {$phone_markup}
                    <div class="gf_clear gf_clear_complex"></div>
                </div>";
    }

    public function get_css_class() {
        $first_input = GFFormsModel::get_input( $this, $this->id . '.1' );
        $last_input  = GFFormsModel::get_input( $this, $this->id . '.2' );
        $email_input = GFFormsModel::get_input( $this, $this->id . '.3' );
        $phone_input = GFFormsModel::get_input( $this, $this->id . '.4' );

        $css_class="";
        $visible_input_count = 0;

        if ( $first_input && ! rgar( $first_input, 'isHidden' ) ) {
            $visible_input_count ++;
            $css_class .= 'has_first_name ';
        } else {
            $css_class .= 'no_first_name ';
        }

        if ( $last_input && ! rgar( $last_input, 'isHidden' ) ) {
            $visible_input_count ++;
            $css_class .= 'has_last_name ';
        } else {
            $css_class .= 'no_last_name ';
        }

        if ( $email_input && ! rgar( $email_input, 'isHidden' ) ) {
            $visible_input_count ++;
            $css_class .= 'has_email ';
        } else {
            $css_class .= 'no_email ';
        }

        if ( $phone_input && ! rgar( $phone_input, 'isHidden' ) ) {
            $visible_input_count ++;
            $css_class .= 'has_phone ';
        } else {
            $css_class .= 'no_phone ';
        }

        $css_class .= "gf_attendees_has_{$visible_input_count} ginput_container_attendees ";

        return trim( $css_class );
    }

    public function get_form_editor_inline_script_on_page_render() {

        // set the default field label for the field
        $script = sprintf( "function SetDefaultValues_%s(field) {
        field.label="%s";
        field.inputs = [new Input(field.id + '.1', '%s'), new Input(field.id + '.2', '%s'), new Input(field.id + '.3', '%s'), new Input(field.id + '.4', '%s')];
        }", $this->type, $this->get_form_editor_field_title(), 'First Name', 'Last Name', 'Email', 'Phone' ) . PHP_EOL;

        return $script;
    }

    public function get_value_entry_detail( $value, $currency = '', $use_text = false, $format="html", $media="screen" ) {
        if ( is_array( $value ) ) {
            $first = trim( rgget( $this->id . '.1', $value ) );
            $last  = trim( rgget( $this->id . '.2', $value ) );
            $email = trim( rgget( $this->id . '.3', $value ) );
            $phone = trim( rgget( $this->id . '.4', $value ) );

            $return = $first;
            $return .= ! empty( $return ) && ! empty( $last ) ? " $last" : $last;
            $return .= ! empty( $return ) && ! empty( $email ) ? " $email" : $email;
            $return .= ! empty( $return ) && ! empty( $phone ) ? " $phone" : $phone;

        } else {
            $return = '';
        }

        if ( $format === 'html' ) {
            $return = esc_html( $return );
        }

        return $return;
    }

}

GF_Fields::register( new GF_Field_Attendees() );

  • Danke für das Teilen

    – Chris

    6. April 2018 um 1:25 Uhr

  • Du glorreiches Biest, das ist genau das, was ich brauchte. Ich musste bestimmte Felder erforderlich machen und andere nicht. Ich habe gerade eine ähnliche Validierung wie die verwendet name aufstellen: pastebin.com/raw/HjdDytLJ

    – Xhynk

    15. Juni 2019 um 1:18 Uhr

  • Danke für das Teilen. Schade, dass die offizielle Dokumentation so schlecht ist.

    – Marek Maurizio

    5. August um 7:08

1374870cookie-checkBenutzerdefiniertes Schwerkraftformularfeld mit mehreren Eingaben

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy