Hero

Como obtener los fields de un Entity en Drupal 7

Mayo 07, 2013

enzo
Programación
Drupal
Desarrollo de Modulos
Field API

En algunas ocasiones en nuestros módulos personalizados debemos verificar el estado actual de algún Entity en particular, algunos ejemplos de entidades son Node, User, Taxonony, Comments, etc y tal vez de un Bundle en especifico.

Antes de seguir déjenme aclarar el concepto de Bundle:

Entity: Los Entities es una abstracción de un grupo de campos de cierto tipo como los son los Nodos, Usuarios, Taxonomías y Comentarios, al ser entidades podemos agregar, borrar y editar campos dentro de la entidad lo que brinda una gran flexibilidad a Drupal 7

Bundle: Los Bundles se pueden considerar com un subtipo de las entidades que definen una cierta característica, por ejemplo existe el Entity Node y los subtipos Article y Page así como cualquier otro Tipo de Contenido que el usuario haya creado. Algunas entidades como User no cuentan con subtipos.

Volviendo al problema original debemos verificar que campos están definidos en cierto Bundle al momento de ejecutar nuestro módulo personalizado.

  1. Obtener information del Bundle.

$entity = 'entityform';
$bundle ='custom_form_1';

//Obtener campos del bundle.   
$fields =  field_info_instances($entity,$bundle);
foreach($fields as  $field_name => $field_definition) {
  watchdog('debug', '' . print_r($field_definition,true) . '');
  //Agregar alguna condición 
} 

Utilizando el código anterior poder recorrer todos los campos que pertenecen al Bundle custom_form_1 que es forma parte del Entity entityform creado por el módulo EntityForm. La salida del watchdog para un campo tipo taxonony seria como la siguiente:

Array
(
    [label] => Zip Code
    [widget] => Array
        (
            [weight] => 6
            [type] => text_textfield
            [module] => text
            [active] => 1
            [settings] => Array
                (
                    [size] => 10
                )

        )

    [settings] => Array
        (
            [text_processing] => 0
            [user_register_form] => 
            [entity_translation_sync] => 
        )

    [display] => Array
        (
            [default] => Array
                (
                    [label] => above
                    [type] => text_default
                    [settings] => Array
                        (
                        )

                    [module] => text
                    [weight] => 3
                )

        )

    [required] => 0
    [description] => 
    [default_value] => 
    [id] => 161
    [field_id] => 97
    [field_name] => field_zip_code
    [entity_type] => entityform
    [bundle] => find_the_right_school
    [deleted] => 0
)
  1. Obtener informacion sobre Fields.

Adicionalmente si obtener la definición del campo dentro del Bundle no es suficiente, sino que deseamos verificar si el campo es instanciado en algún otro Bundle podríamos cambiar un poco nuestro anterior código como se muestra a continuación.

$entity = 'entityform';
$bundle ='custom_form_1';

//Obtener campos del bundle.   
$fields =  field_info_instances($entity,$bundle);
foreach($fields as  $field_name => $field_definition) {
  $field_info = field_info_field($field_name);
  watchdog('debug', '' . print_r($field_info,true) . '');
  //Agregar alguna condición. 
}

La salida de la definición del mismo campo de taxonomía seria similar al siguiente listado.

Array
(
    [translatable] => 0
    [entity_types] => Array
        (
        )

    [settings] => Array
        (
            [max_length] => 7
            [entity_translation_sync] => 
        )

    [storage] => Array
        (
            [type] => field_sql_storage
            [settings] => Array
                (
                )

            [module] => field_sql_storage
            [active] => 1
            [details] => Array
                (
                    [sql] => Array
                        (
                            [FIELD_LOAD_CURRENT] => Array
                                (
                                    [field_data_field_zip_code] => Array
                                        (
                                            [value] => field_zip_code_value
                                            [format] => field_zip_code_format
                                        )

                                )

                            [FIELD_LOAD_REVISION] => Array
                                (
                                    [field_revision_field_zip_code] => Array
                                        (
                                            [value] => field_zip_code_value
                                            [format] => field_zip_code_format
                                        )

                                )

                        )

                )

        )

    [foreign keys] => Array
        (
            [format] => Array
                (
                    [table] => filter_format
                    [columns] => Array
                        (
                            [format] => format
                        )

                )

        )

    [indexes] => Array
        (
            [format] => Array
                (
                    [0] => format
                )

        )

    [id] => 97
    [field_name] => field_zip_code
    [type] => text
    [module] => text
    [active] => 1
    [locked] => 0
    [cardinality] => 1
    [deleted] => 0
    [columns] => Array
        (
            [value] => Array
                (
                    [type] => varchar
                    [length] => 7
                    [not null] => 
                )

            [format] => Array
                (
                    [type] => varchar
                    [length] => 255
                    [not null] => 
                )

        )

    [bundles] => Array
        (
            [entityform] => Array
                (
                    [0] => find_the_right_school
                )

        )

)

Como se puede apreciar tenemos mas información del field así como si existe alguna relación con otros bundles dentro del mismo Entity o con otros Bundles en otros Entities.

Espero que haya sido de si agrado.

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