Adicionar campos ao grupo de campos programaticamente


15

Eu usei o módulo "Field Group" e criei alguns grupos no back-end. Agora eu quero adicionar programaticamente um campo ao grupo. Como eu posso fazer isso.

Estou usando Hook_form_alter, notei que todos os campos têm um atributo 'und' no qual o grupo de campos ao qual ele pertence está listado, mas se uma matriz create e 'und' e adicionar um nome ao grupo, ele não funcionará. .

Como devo fazer isso?


11
Você pode usar a API field_group. Caixa hook_field_group_build_pre_render_alter () ( drupal.org/node/1017962 )
codeinthehole

Respostas:


19

Isso é um pouco antigo, mas eu queria fazer a mesma coisa e não consegui encontrar uma resposta na web. Acabei descobrindo sozinho.

Vamos supor que você criou um grupo de campos por meio da interface do CMS com o nome "group_product_fields". Você adicionou alguns campos a esse grupo.

Agora você tem um novo campo sendo incluído no formulário de forma programática via hook_form_alter. Você deseja adicionar esse campo a "group_product_fields". Aqui está um exemplo de qual poderia ser o campo:

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

Tudo o que você precisa fazer agora é adicionar esse novo campo ao grupo de campos. Para fazer isso, adicione a linha abaixo ao hook_form_alter. Pode ser colocado em qualquer lugar dentro dele.

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

Isso é tudo. Você pode ajustar o peso do campo para que ele seja posicionado como desejar. Mas no final, isso é realmente simples. :)


Essa deve ser a resposta aceita, IMO.
m.stenta

6

Citação após adicionar programaticamente campos a um grupo de campos :

$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
Eu quero alterar o formulário!
SA Malik

3
Então não vejo por que você deseja usar o módulo Field Group? Basta definir um conjunto de campos e mover seus campos para lá. Por exemplo: drupal.stackexchange.com/questions/4049/…
Maciej Zgadzaj

Podemos usar 'mode' => 'form'ou em 'mode' => 'default'vez de 'mode' => 'full', ou simplesmente omitir mode. Qualquer view_mode_name, graças @Maiq Fash
graceman9

Isso fornece uma maneira de redefinir as definições de campo, não fazer um formulário_alter - não o que o OP está pedindo.
Aaronbauman #

1

Não tenho certeza de como funcionou para você. Como o nome da chave da matriz deve corresponder ao nome do campo do banco de dados. E eles são:

| entity_type | varchar (32)
| pacote | varchar (128)

| modo | varchar (128)

Eu tenho que usar o seguinte formato para fazê-lo funcionar. deixe-me saber se estou fazendo algo bobo aqui.

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

1

Dê uma olhada em hook_field_group_build_pre_render_alter ().

Isso fornece a você a oportunidade de alterar a estrutura de seus grupos programaticamente.

Por exemplo, mova o campo "exemplo_campo" para o grupo "exemplo_grupo" no elemento raiz do formulário:

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

Primeiro, encontre o nome da máquina do grupo de campos no painel CMS e, em seguida, em seu formulário alter do

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

por um instante, adicionamos um email de campo personalizado ao User form field groupgrupo de campos:

$form['#group_children']['mail'] = 'group_user_form_field_group';
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.