Come ottenere l'elenco dei tipi di campo?


10

Sto effettuando il porting di un modulo da Drupal 7 a Drupal 8. Nelle impostazioni di configurazione di questo modulo ho bisogno di ottenere l'elenco dei tipi di campo attualmente esistenti.

In Drupal 7, questo è stato ottenuto usando la field_info_field_types()funzione.

In Drupal 8 (8.0.0-rc3), viene visualizzato l'errore "la funzione non esiste", nonostante le informazioni fornite da una pagina della Guida di riferimento dell'API Drupal , chiaramente obsolete .

Quindi, indagando, ho trovato una pagina DrupalContrib , in cui la funzione è dichiarata obsoleta, e proponendo di utilizzare ora Drupal::service('plugin.manager.entity.field.field_type')->getDefinitions().

Ma usandolo si genera un altro errore "Servizio sconosciuto plugin.manager.entity.field.field_type", fortunatamente associato al suggerimento "Intendi plugin.manager.field.field_type?"

Quindi ho provato a usare Drupal::service('plugin.manager.field.field_type')->getDefinitions()e wow: ho ottenuto l'array previsto di tipi di campo.

Ma ogni membro dell'array (un tipo di campo) ora è un oggetto (anziché un array figlio) e i dati che sto cercando sono nidificati all'interno di proprietà protette, quindi non posso accedervi.

In questa fase, sono bloccato. Ho considerato che potrebbe esistere una classe che potrei espandere per navigare attraverso questi dati, ma senza fortuna: in particolare non sono nemmeno riuscito a capire quale sia il componente di Drupal 8 in cui le definizioni dei tipi di campo sono centralizzate.


È meglio guardare api.drupal.org, che è più aggiornamento. In effetti, non esiste una pagina per quella funzione .
kiamlaluno

Grazie per il suggerimento "guarda api.drupal.org". D'altra parte (e questo è piuttosto meta rilevante, scusate), se capisco facilmente che avete modificato le mie abbreviazioni (D7 -> Drupal 7), mi chiedo perché avete lasciato cadere "Drupal 8" nel titolo? Tendo a pensare che ci sarebbe una regola che dice che è ridondante con il tag "8". Ma come lettore mi trovo molto più sicuramente informato dal titolo rispetto al tag: ai miei occhi, i tag affrontano essenzialmente il processo di ricerca, mentre leggendo in sequenza raramente presto attenzione a loro.
Concordato il

Non è necessario ripetere i tag nel titolo, poiché sono sempre visibili ovunque sia elencata una domanda. Gli utenti di Stack Exchange prestano attenzione ai tag.
kiamlaluno

Risposte:


16

Il primo livello è un array. Le chiavi sono l'id del plugin. Puoi elencarli:

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

Questo è il risultato:

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

Puoi sceglierne uno e scaricare la definizione del plugin.

var_dump($defs['comment']);

Se sei interessato a un oggetto speciale, puoi scavare più a fondo con l'aiuto di api.drupal.org. Ma sarà più facile se cerchi il plugin nella directory principale.

Per accedere a un oggetto, individuarlo in var_dump e utilizzare un metodo:

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

In questo caso è l'oggetto TranslatableMarkup , che ha il metodo render per accedere alla stringa tradotta.


Grazie ma questo è quello che ho già fatto. Oltre a ciò, il mio problema rimane: come posso accedere programmaticamente ai dati all'interno di questi oggetti?
Concordato il

Cosa vuoi trovare nelle definizioni dei campi? In generale si cercano le proprietà e i metodi di un oggetto in api e quindi si accede ad essi con `-> '. Le definizioni dei campi sono più facili da consultare nella fonte.
4k4

Estraggo label, descriptione modulee li visualizza in un modulo di configurazione in cui l'utente può controllare quelli per i quali si vuole il mio modulo ( MMS ) crea gettoni per i campi correlati clonati.
Concordato il

Aggiungo un esempio.
4k4

Oops! Ho visto il tuo ultimo commento, ma non ho notato la tua modifica, quindi ho continuato ad aspettare. Proverò il tuo suggerimento. Grazie.
Concordato il

4

Ogni stringa che passa attraverso t () ora è un oggetto. Puoi accedervi come stringhe, infatti, dovresti farlo.

Ci sono solo pochissime eccezioni in cui non puoi semplicemente usare un oggetto così com'è, ad esempio le chiavi dell'array, per quelle, devi lanciarle su una stringa. Qualsiasi altra cosa dovrebbe funzionare.

PS: La documentazione API ufficiale è http://api.drupal.org/api/drupal/8 . Usalo per core.

Un'altra buona risorsa sono i record di modifica: 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=&xreated% 5D =

Modifica: rispondendo al tuo commento, non capisco bene cosa intendi. Tutte le informazioni di cui hai bisogno sono proprio lì, basta usarle.

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

Ancora una volta, basta ignorare che etichetta / descrizione sono oggetti. Hanno metodi __toString () che vengono chiamati automaticamente quando li stampi / li usi.


Grazie per questa risposta Il tuo ultimo link proposto sembra molto promettente e indagherò sulla base di queste informazioni. In breve, ha detto, mi sbaglio se immagino che per le mie esigenze (estratto label, description, modulestringhe di ogni campo di tipo) dovrei: 1) ottenere l'elenco da Drupal::service('plugin.manager.field.field_type')->getDefinitions()come già fatto; 2) quindi utilizzare ciascuna chiave dell'array restituito (il nome del tipo di campo) per invocare una classe specifica (trovare quale, e dove, è ciò che devo esaminare più a fondo) che fornirà i metodi per ottenere le informazioni necessarie? TIA per questa precisione.
Concordato il

Aggiornato la mia risposta.
Berdir,

Oops ... non capisco! Quello che hai proposto nella tua modifica è semplicemente quello che ho fatto in D7. E NON funziona in D8, poiché $definitionnon è un array di stringhe in D8, ma un array di oggetti! Ho usato DPM () per esaminarli, e ho visto che ciascuna delle stringhe necessari appare annidati in questo modo: 'label' => array(..., 'label' => Drupal\Core\StringTranslation\TranslatableMarkup Object {..., string, ...}, ...). Mi sto perdendo qualcosa di ovvio?
Concordato il

Ho appena scoperto (di recente) l'ultima modifica di 4k4, che funziona. In effetti il ​​problema per me era sapere dove trovare la TranslatableMarkupclasse e la disponibilità del render()metodo. Finalmente il modo corretto per ottenere i miei dati è print $definition['label']->render();. Tuttavia, grazie per le altre informazioni.
Concordato il

No, ancora una volta, non è necessario -> render (). usa $ definition ['etichetta'], funziona, fidati di me :)
Berdir,

1

Versione aggiornata per la risposta di @Berdir. Utilizzare in shell.

$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;
}

Uscita qui: https://gist.github.com/sobi3ch/70635cc62defff606242


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.