Aggiungi i campi al gruppo di campi a livello di codice


15

Ho usato il modulo "Field Group" e creato alcuni gruppi nel backend. Ora voglio aggiungere programmaticamente un campo al gruppo. Come posso fare ciò.

Sto usando Hook_form_alter, ho notato che ogni campo ha un 'und'attribute in cui è elencato il gruppo di campi a cui appartiene, ma se un array crea e' und 'e aggiunge un nome di gruppo di campi ad esso, non funziona .

Come dovrei farlo?


1
Puoi usare l'API field_group. Acquista hook_field_group_build_pre_render_alter () ( drupal.org/node/1017962 )
codeinthehole

Risposte:


20

Questo è un po 'vecchio, ma volevo fare la stessa cosa e non sono riuscito a trovare una risposta sul web. Ho finito per capirlo da solo.

Supponiamo che tu abbia creato un gruppo di campi attraverso l'interfaccia CMS con il nome "group_product_fields". Hai aggiunto alcuni campi a quel gruppo.

Ora hai un nuovo campo che viene incluso nel modulo a livello di codice tramite hook_form_alter. Vuoi aggiungere quel campo a "group_product_fields". Ecco un esempio di ciò che potrebbe essere il campo:

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

Tutto quello che devi fare ora è aggiungere quel nuovo campo al gruppo di campi. Per fare ciò, aggiungi la riga in basso a hook_form_alter. Può essere posizionato ovunque al suo interno.

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

È tutto. È possibile che si desideri regolare il peso del campo affinché venga posizionato come desiderato. Ma alla fine questo è davvero semplice. :)


Questa dovrebbe essere la risposta accettata, IMO.
m.stenta,

6

Citando dopo Aggiungi programmaticamente campi a un gruppo di campi :

$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
Voglio modificare il modulo!
SA Malik,

3
Quindi non vedo perché vuoi usare il modulo Field Group? Basta definire un fieldset (s) e spostare i campi lì. Ad esempio: drupal.stackexchange.com/questions/4049/…
Maciej Zgadzaj

Possiamo usare 'mode' => 'form'o 'mode' => 'default'invece di 'mode' => 'full', o semplicemente omettere del modetutto. Qualsiasi view_mode_name, grazie @Maiq
Fash

Questo fornisce un modo per ridefinire le definizioni dei campi, non per fare un form_alter - non quello che l'OP sta chiedendo.
aaronbauman,

1

Non sono sicuro di come abbia funzionato per te. Perché il nome della chiave dell'array deve corrispondere al nome del campo del database. E loro sono:

| entity_type | varchar (32)
| pacchetto | varchar (128)

| modalità | varchar (128)

Devo usare il seguente formato per farlo funzionare. fammi sapere se sto facendo qualcosa di stupido qui.

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

1

Dai un'occhiata a hook_field_group_build_pre_render_alter ().

Ciò ti offre l'opportunità di cambiare la struttura dei tuoi gruppi a livello di codice.

Ad esempio, spostare il campo "campo_esempio" nel gruppo "esempio_gruppo" dall'elemento del modulo radice:

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

Innanzitutto, trova il nome della macchina del tuo gruppo di campi nel pannello CMS, quindi nel modulo alter do

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

per un istante, ho aggiunto una mail di campo personalizzata nel User form field groupgruppo di campi:

$form['#group_children']['mail'] = 'group_user_form_field_group';
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.