Febrero 14, 2014
enzo
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.
- 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:
- 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.