Agregar campos al grupo de campos mediante programación


15

He usado el módulo "Grupo de campo" y he creado algunos grupos en el backend. Ahora quiero agregar programáticamente un campo al grupo. Cómo puedo hacer eso.

Estoy usando Hook_form_alter, me he dado cuenta de que cada campo tiene un atributo 'und' en el que se enumera el grupo de campos al que pertenece, pero si crea una matriz 'und' y agrega un nombre de grupo de campo, no funciona .

¿Cómo debería hacerlo?


1
Puede usar la API field_group. Checkout hook_field_group_build_pre_render_alter () ( drupal.org/node/1017962 )
codeinthehole

Respuestas:


20

Esto es un poco viejo, pero quería hacer lo mismo y no pude encontrar una respuesta en la web. Terminé resolviéndolo solo.

Supongamos que creó un grupo de campos a través de la interfaz CMS con el nombre "group_product_fields". Agregaste algunos campos a ese grupo.

Ahora tiene un nuevo campo incluido en el formulario mediante programación a través de hook_form_alter. Desea agregar ese campo a "group_product_fields". Aquí hay un ejemplo de lo que podría ser el campo:

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

Todo lo que necesita hacer ahora es agregar ese nuevo campo al grupo de campos. Para ello, agregue la línea de abajo a hook_form_alter. Se puede colocar en cualquier lugar dentro de él.

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

Eso es todo. Es posible que desee ajustar el peso del campo para que se posicione como desee. Pero al final esto es realmente simple. :)


Esta debería ser la respuesta aceptada, OMI.
m.stenta

6

Citando después de agregar campos mediante programación a un 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
¡Quiero alterar la forma!
SA Malik

3
Entonces no veo por qué quieres usar el módulo de grupo de campo? Simplemente defina un conjunto de campos y mueva sus campos allí. Por ejemplo: drupal.stackexchange.com/questions/4049/…
Maciej Zgadzaj

Podemos usar 'mode' => 'form'o en 'mode' => 'default'lugar de 'mode' => 'full', o simplemente omitir modeen absoluto. Any view_mode_name, gracias @Maiq Fash
graceman9

Esto proporciona una manera de redefinir las definiciones de campo, no hacer un form_alter, no lo que el OP está pidiendo.
aaronbauman

1

No estoy seguro de cómo funcionó para ti. Porque el nombre de la clave de matriz debe coincidir con el nombre del campo de la base de datos. Y estan:

El | tipo_entidad | varchar (32)
| paquete | varchar (128)

El | modo | varchar (128)

Tengo que usar el siguiente formato para que funcione. Avísame si estoy haciendo algo tonto aquí.

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

1

Echa un vistazo a hook_field_group_build_pre_render_alter ().

Esto le brinda la oportunidad de cambiar la estructura de sus grupos mediante programación.

Por ejemplo, mueva el campo "example_field" al grupo "group_example" desde el elemento de formulario raíz:

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

Primero, encuentre el nombre de la máquina del grupo de campo en el panel CMS y luego en su formulario alter do

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

Por un instante, agregué un correo de campo personalizado al User form field groupgrupo de campo:

$form['#group_children']['mail'] = 'group_user_form_field_group';
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.