Fügen Sie der Feldgruppe programmgesteuert Felder hinzu


15

Ich habe das "Field Group" -Modul verwendet und einige Gruppen im Backend erstellt. Jetzt möchte ich der Gruppe programmgesteuert ein Feld hinzufügen. Wie kann ich das machen.

Ich verwende Hook_form_alter. Ich habe festgestellt, dass jedes Feld ein 'und'-Attribut hat, in dem die Feldgruppe aufgeführt ist, zu der es gehört. Wenn Sie jedoch ein' und'-Array erstellen und einen Feldgruppennamen hinzufügen, funktioniert dies nicht .

Wie soll ich das machen


1
Sie können die API field_group verwenden. Kasse hook_field_group_build_pre_render_alter () ( drupal.org/node/1017962 )
codeinthehole

Antworten:


19

Dies ist ein bisschen alt, aber ich wollte das Gleiche tun und konnte im Web keine Antwort finden. Am Ende habe ich es selbst herausgefunden.

Angenommen, Sie haben über die CMS-Schnittstelle eine Feldgruppe mit dem Namen "group_product_fields" erstellt. Sie haben dieser Gruppe einige Felder hinzugefügt.

Jetzt haben Sie ein neues Feld, das programmgesteuert über hook_form_alter in das Formular aufgenommen wird. Sie möchten dieses Feld zu "group_product_fields" hinzufügen. Hier ist ein Beispiel, wie das Feld aussehen könnte:

$form['new_product_field'] = array(
  '#type' => 'textfield',
  '#title' => t('New product field'),
  '#description' => t('Description for this new product field'),
);

Jetzt müssen Sie nur noch das neue Feld zur Feldgruppe hinzufügen. Fügen Sie dazu die folgende Zeile zum hook_form_alter hinzu. Es kann überall darin platziert werden.

$form['#group_children']['new_product_field'] = 'group_product_fields';

Das ist alles. Möglicherweise möchten Sie das Feldgewicht anpassen, damit es wie gewünscht positioniert wird. Aber am Ende ist das wirklich einfach. :)


Dies sollte die akzeptierte Antwort sein, IMO.
m.stenta

6

Zitieren nach Füge einer Feldgruppe programmatisch Felder hinzu :

$groups = field_group_read_groups(array(
  'entity_type' => 'node',
  'bundle'      => 'article',
  'mode'   => 'full'
));
$your_group = $groups['node']['article']['form']['group_your_group'];
$your_group->children[] = 'field_your_new_field';
field_group_group_save($your_group);

3
Ich möchte die Form ändern!
SA Malik

3
Dann verstehe ich nicht, warum Sie das Feldgruppenmodul verwenden möchten? Definieren Sie einfach eine oder mehrere Feldgruppen und verschieben Sie Ihre Felder dorthin. Zum Beispiel: drupal.stackexchange.com/questions/4049/…
Maciej Zgadzaj

Wir können 'mode' => 'form'oder 'mode' => 'default'anstelle von verwenden 'mode' => 'full'oder einfach weglassen mode. Jeder view_mode_name, danke @ Maiq Fash
graceman9

Dies bietet die Möglichkeit, Felddefinitionen neu zu definieren und keinen form_alter durchzuführen - nicht das, was das OP verlangt.
Aaronbauman

1

Ich bin nicht sicher, wie es bei dir funktioniert hat. Da der Name des Arrayschlüssels mit dem Namen des Datenbankfelds übereinstimmen muss. Und sie sind:

| entity_type | varchar (32)
| Bündel | varchar (128)

| mode | varchar (128)

Ich muss folgendes Format verwenden, damit es funktioniert. Lass es mich wissen, wenn ich hier etwas Dummes mache.

$groups = field_group_read_groups(array(
  'entity_type' => 'node',
  'bundle' => 'bundle type',
  'mode' => 'view_mode_name'));

1

Schauen Sie sich hook_field_group_build_pre_render_alter () an.

Dies bietet Ihnen die Möglichkeit, die Struktur Ihrer Gruppen programmgesteuert zu ändern.

Verschieben Sie beispielsweise das Feld " example_field" aus dem Stammformularelement in die Gruppe "group_example":

function EXAMPLE_forms_field_group_build_pre_render_alter(&$form) {
  if (example_condition()) {
    $form['group_example'] = $form['group_example']['example_field'];
    unset($form['example_field']);
    // Further adjustments as necessary
  }
}

0

Suchen Sie zuerst den Namen Ihrer Feldgruppenmaschine im CMS-Bereich und dann in Ihrem Formular alter do

$form['#group_children']['FIELD_MACHINE_NAME'] = 'GROUP_MACHINE_NAME';

Für einen Instanst habe ich eine benutzerdefinierte Feld-Mail in die Feldgruppe aufgenommen User form field group:

$form['#group_children']['mail'] = 'group_user_form_field_group';
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.