¿Cómo obtener la lista de tipos de campo?

10

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.

cFreed
fuente
Es mejor que mire api.drupal.org, que es más actualización. De hecho, no hay una página para esa función .
kiamlaluno
Gracias por el consejo "mira api.drupal.org". Por otro lado (y esto es más bien meta relevante, lo siento), si entiendo fácilmente que editó mis abreviaturas (D7 -> Drupal 7), me pregunto por qué dejó "Drupal 8" en el título. Tiendo a pensar que habría alguna regla que diga que es redonda con la etiqueta "8". Pero como lector, utilizo para encontrarme mucho más seguro por el título que por la etiqueta: a mis ojos, las etiquetas abordan esencialmente el proceso de búsqueda, mientras que en la lectura secuencial rara vez les presto atención.
cFreed
No es necesario repetir las etiquetas en el título, ya que siempre son visibles donde se enumera una pregunta. Los usuarios de Stack Exchange prestan atención a las etiquetas.
kiamlaluno

Respuestas:

16

El primer nivel es una matriz. Las claves son la identificación del complemento. Puedes enumerarlos:

$defs = Drupal::service('plugin.manager.field.field_type')->getDefinitions();
foreach ( $defs as $key => $value ) {
   echo $key, "\n";
}

Este es el resultado:

comment
datetime
file
image
link
list_string
list_float
list_integer
path
text_with_summary
text
text_long
email
boolean
created
changed
timestamp
string_long
language
decimal
uri
float
password
string
integer
entity_reference
uuid
map
taxonomy_term_reference

Puede elegir uno y volcar la definición del complemento.

var_dump($defs['comment']);

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:

$defs['comment']['description']->render();

En este caso, es el objeto TranslatableMarkup , que tiene el método render para acceder a la cadena traducida.

4k4
fuente
Gracias pero esto es lo que ya hice. Más allá de eso, mi problema sigue siendo: ¿cómo puedo acceder programáticamente a los datos dentro de estos objetos?
cFreed
¿Qué quieres encontrar en las definiciones de campo? En general, busca las propiedades y métodos de un objeto en la API y luego accede a ellos con `-> '. Las definiciones de campo son más fáciles de buscar en la fuente.
4k4
Extraigo label, descriptiony moduley 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.
cFreed
Añado un ejemplo.
4k4
¡Uy! Vi tu último comentario, pero no noté tu edición, así que seguí esperando. Intentaré tu sugerencia. Gracias.
cFreed
4

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.

$definitions = Drupal::service('plugin.manager.field.field_type')->getDefinitions();
foreach ( $definitions as $field_type => $definition) {
  print $definition['label'];
  print $definition['description'];
  print $definition['provider'];
}

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.

Berdir
fuente
Gracias por esta respuesta Su último enlace propuesto parece muy prometedor e investigaré con base en esta información. En pocas palabras, dijo, estoy equivocado, si supongo que para mis necesidades (extracto label, description, modulecadenas de cada tipo de campo) que debería: 1) Lista de conseguir Drupal::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.
cFreed
Actualicé mi respuesta.
Berdir el
¡Vaya ... no entiendo! Lo que propusiste en tu edición es simplemente lo que hice en D7. ¡Y NO funciona en D8, ya $definitionque 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?
cFreed
Acabo de descubrir (últimamente) la última edición de 4k4, que funciona. De hecho, el problema para mí era saber dónde encontrar la TranslatableMarkupclase y la disponibilidad del render()método. Finalmente, la forma correcta de obtener mis datos es print $definition['label']->render();. Sin embargo, gracias por sus otras informaciones.
cFreed
No, de nuevo, no necesita -> render (). use $ definition ['label'], simplemente funciona, confíe en mí :)
Berdir
1

Versión actualizada para @Berdir respuesta. Uso en concha.

$definitions = Drupal::service('plugin.manager.field.field_type')->getDefinitions();
foreach ( $definitions as $field_type => $definition) {
  print 'Label: '. $definition['label']. PHP_EOL;
  print 'Machine name: '. $field_type. PHP_EOL;
  print 'Descritpion: '. $definition['description']. PHP_EOL;
  print 'Provider: '. $definition['provider']. PHP_EOL . ' ---' . PHP_EOL;
}

Salida aquí: https://gist.github.com/sobi3ch/70635cc62defff606242

sobi3ch
fuente