Estoy transfiriendo un módulo de Drupal 7 a Drupal 8. En la configuración de este módulo, necesito obtener la lista de los tipos de campo existentes actualmente.
En Drupal 7, esto se logró usando la field_info_field_types()
función.
En Drupal 8 (8.0.0-rc3), recibo un error "la función no existe", a pesar de la información indicada en una página de ayuda de referencia de API de Drupal , claramente desactualizada.
Luego investigando encontré una página DrupalContrib , donde la función se declara obsoleta, y proponiendo usarla ahora Drupal::service('plugin.manager.entity.field.field_type')->getDefinitions()
.
Pero usarlo dispara otro error "Servicio desconocido plugin.manager.entity.field.field_type", afortunadamente asociado a la sugerencia "¿Te refieres a plugin.manager.field.field_type?"
Así que intenté usar Drupal::service('plugin.manager.field.field_type')->getDefinitions()
y wow: obtuve la matriz esperada de tipos de campo.
Pero cada miembro de la matriz (un tipo de campo) ahora es un objeto (en lugar de una matriz secundaria), y los datos que estoy buscando están anidados dentro de las propiedades protegidas, por lo que no puedo acceder a ellos.
En esta etapa, estoy atascado. Pensé que podría existir alguna clase que podría expandir para navegar a través de estos datos, pero sin suerte: notablemente ni siquiera pude averiguar cuál es el componente en Drupal 8 donde las definiciones de tipos de campo están centralizadas.
Respuestas:
El primer nivel es una matriz. Las claves son la identificación del complemento. Puedes enumerarlos:
Este es el resultado:
Puede elegir uno y volcar la definición del complemento.
Si está interesado en un objeto especial, puede profundizar más con la ayuda de api.drupal.org. Pero será más fácil si busca el complemento en el directorio principal.
Para acceder a un objeto, ubíquelo en var_dump y use un método:
En este caso, es el objeto TranslatableMarkup , que tiene el método render para acceder a la cadena traducida.
fuente
label
,description
ymodule
y los muestra en una forma de configuración donde el usuario puede comprobar aquellos para los que se quiere mi módulo ( MMS ) crea fichas para los campos relacionados clonados.Cada cadena que se pasa a través de t () es un objeto ahora. Puede acceder a ellos como cadenas, de hecho, debe hacerlo.
Solo hay muy pocas excepciones en las que no puede usar un objeto tal como está, por ejemplo, claves de matriz, para eso, debe convertirlas en una cadena. Cualquier otra cosa debería funcionar.
PD: La documentación oficial de la API es http://api.drupal.org/api/drupal/8 . Use eso para el núcleo.
Otro buen recurso son los registros de cambios: https://www.drupal.org/list-changes/published?keywords_description=field_info_field_types&to_branch=&version=&created_op=%3E%3D&created%5Bvalue%5D=&created%5Bmin%5D=&created%5Bmax% 5D =
Editar: respondiendo a tu comentario, no entiendo lo que quieres decir. Toda la información que necesita está ahí, solo úsela.
Nuevamente, simplemente ignore que la etiqueta / descripción son objetos. Tienen métodos __toString () a los que se llama automáticamente cuando los imprime / usa.
fuente
label
,description
,module
cadenas de cada tipo de campo) que debería: 1) Lista de conseguirDrupal::service('plugin.manager.field.field_type')->getDefinitions()
como lo ha hecho; 2) luego use cada clave de la matriz devuelta (el nombre del tipo de campo) para invocar una clase específica (encuentre cuál y dónde, es lo que debo examinar más a fondo) que proporcionará métodos para obtener la información necesaria. TIA para esta precisión.$definition
que no es una matriz de cadenas en D8, sino una matriz de objetos! Solía dpm () para examinarlos, y vio que cada una de las cuerdas necesarias aparece anidados de esta manera:'label' => array(..., 'label' => Drupal\Core\StringTranslation\TranslatableMarkup Object {..., string, ...}, ...)
. ¿Me estoy perdiendo algo obvio?TranslatableMarkup
clase y la disponibilidad delrender()
método. Finalmente, la forma correcta de obtener mis datos esprint $definition['label']->render();
. Sin embargo, gracias por sus otras informaciones.Versión actualizada para @Berdir respuesta. Uso en concha.
Salida aquí: https://gist.github.com/sobi3ch/70635cc62defff606242
fuente
Google parece encontrar esta pregunta cuando busca estos
Si está utilizando la consola Drupal, también puede usar:
También hay esto en Drupal.org que también puede ayudar:
Definición y uso de definiciones de campo de entidad de contenido
Aunque no es fácil encontrar ejemplos de utilizables
fuente