Hero

Como crear un custom form basado en un Entity en Drupal 7

Febrero 14, 2014

enzo
Drupal
Desarrollo de Modulos

Anteriormente hemos publicado algunos artículos relacionados con los Entity o Entidades en Drupal como son:

http://www.7sabores.com/blog/detectar-si-un-bundle-entity-usa-fieldgroup-drupal-7
http://www.7sabores.com/blog/crear-un-usuario-usando-entity-api-y-profile2-drupal-7
http://www.7sabores.com/blog/obtener-los-fields-un-entity-drupal-7
http://www.7sabores.com/blog/definir-un-valor-defecto-un-entity-reference-drupal-7

Hoy vengo a compartirles como crear un formulario dinámico basado en composición de un entity.

  1. Creación del Formulario

Para crear el formulario primero debemos cargar la entidad e identificar los campos con que cuenta la entidad como se muestra a continuación.

// Get bundle type
$bundle = 'imagen';

$form_state['entity_id'] = "7"; 
$form['#submit'] = array('MYMODULE_process_extra_fields'),
  
// Generate dynamic form fields
$form['extra_fields'] = array(
  '#type' => 'fieldset',
  '#title' => t('Bulk extra fields'),
  '#weight' => 5,
  '#collapsible' => FALSE,
  '#collapsed' => FALSE,
);

//Get fields fro entity file bundle photo
$fields = field_info_instances('file', $bundle);
foreach($fields as $field_id => $field) {
  $form['extra_fields'][$field_id] = array(
    '#type' => 'textfield',
    '#title' => t($field['label']),
    '#size' => 60,
    '#maxlength' => 128,
    '#required' => FALSE,
  );
}

En el código anterior para el Entity File de bundle image obtenemos los fields y creamos elementos de FAPI tipo textfield, la cantidad y los nombres dependerán de los fields agregados al bundle y se define una función para procesar los datos ingresados por el usuario.

Lo anterior generaría un formulario similar a la siguiente imagen:

entity extra fields 2

  1. Procesar el formulario.

Para finalizar solo debemos implementar la función que tomara los datos del usuario y lo almacenara en la entidad deseada.

function MYMODULE_process_extra_fields($form, &$form_state) {
	// Get bundle type
	// Get bundle type
	$bundle = 'image';
	
	$fields = field_info_instances('file', $bundle);
	$entities = entity_load('file', array($form_state['entity_id']));
	$entity_file = array_values($entities)[0];
	
	foreach($fields as $field_id => $field) {
	  $entity_file->$field_id = array(LANGUAGE_NONE => array(0 => array('value' => $form_state['values'][$field_id])));
	}
	
	entity_save('file',$entity_file);
}

Espero que haya sido de su agrado.

Recibe consejos y oportunidades de trabajo 100% remotas y en dólares de weKnow Inc.