Como obter a lista de tipos de campo?

10

Estou portando um módulo do Drupal 7 para o Drupal 8. Nas configurações deste módulo, preciso obter a lista dos tipos de campo existentes no momento.

No Drupal 7, isso foi alcançado usando a field_info_field_types()função

No Drupal 8 (8.0.0-rc3), recebo o erro "a função não existe", apesar das informações declaradas na página de Ajuda de referência da API do Drupal , claramente desatualizadas.

Em seguida, investigando, encontrei uma página DrupalContrib , onde a função é declarada preterida e propondo usar agora Drupal::service('plugin.manager.entity.field.field_type')->getDefinitions().

Mas usá-lo dispara outro erro "Serviço desconhecido plugin.manager.entity.field.field_type", felizmente associado à sugestão "Você quer dizer plugin.manager.field.field_type?"

Então tentei usar Drupal::service('plugin.manager.field.field_type')->getDefinitions()e uau: obtive a matriz esperada de tipos de campo.

Mas cada membro da matriz (um tipo de campo) agora é um objeto (em vez de uma matriz filho), e os dados que estou procurando são aninhados nas propriedades protegidas, portanto, não posso acessá-los.

Nesta fase, eu estou preso. Eu considerei que poderia existir alguma classe que eu pudesse expandir para navegar por esses dados, mas sem sorte: eu não conseguia descobrir qual é o componente no Drupal 8 onde as definições de tipos de campo são centralizadas.

cFreed
fonte
É melhor você olhar para api.drupal.org, que é mais atualizado. De fato, não há uma página para essa função .
kiamlaluno
Obrigado pela dica "veja api.drupal.org". Por outro lado (e isso é bastante meta-relevante, desculpe), se eu entendo facilmente que você editou minhas abreviações (D7 -> Drupal 7), estou me perguntando por que você soltou "Drupal 8" no título? Costumo pensar que haveria alguma regra dizendo que é redondante com a tag "8". Mas, como leitor, costumo encontrar-me com muito mais certeza informado pelo título do que pela etiqueta: aos meus olhos, as etiquetas tratam essencialmente do processo de busca, enquanto na leitura sequencial raramente presto atenção a elas.
amigos estão dizendo sobre cFreed
Não há necessidade de repetir as tags no título, pois elas sempre estão visíveis onde quer que uma pergunta esteja listada. Os usuários do Stack Exchange prestam atenção às tags.
kiamlaluno

Respostas:

16

O primeiro nível é uma matriz. As chaves são os IDs do plug-in. Você pode listá-los:

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

Este é o 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

Você pode escolher um e despejar a definição de plug-in.

var_dump($defs['comment']);

Se você está interessado em um objeto especial, pode se aprofundar com a ajuda de api.drupal.org. Mas será mais fácil se você procurar o plugin no diretório principal.

Para acessar um objeto, localize-o no var_dump e use um método:

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

Nesse caso, é o objeto TranslatableMarkup , que possui o método render para acessar a sequência traduzida.

4k4
fonte
Obrigado, mas é isso que eu já fiz. Além disso, meu problema permanece: como posso acessar programaticamente os dados dentro desses objetos?
CFreed
O que você deseja encontrar nas definições de campo? Em geral, você consulta as propriedades e métodos de um objeto na API e, em seguida, acessa-os com `-> '. As definições de campo são mais fáceis de procurar na fonte.
4k4
I extrair label, descriptione modulee exibi-los em um formulário de configuração onde o usuário pode verificar os para a qual quer meu módulo ( MMS ) cria tokens para os campos relacionados clonados.
precisa
Eu adiciono um exemplo.
4k4
Opa! Vi seu último comentário, mas não percebi sua edição, então continuei esperando. Vou tentar sua sugestão. Obrigado.
precisa
4

Toda string que é passada através de t () é um objeto agora. Você pode acessá-los como strings; na verdade, você deve fazê-lo.

Existem apenas muito poucas exceções em que você não pode simplesmente usar um objeto como está, por exemplo, chaves de matriz, para elas, é necessário convertê-las em uma string. Qualquer outra coisa deve funcionar.

PS: A documentação oficial da API é http://api.drupal.org/api/drupal/8 . Use isso para o núcleo.

Outro bom recurso são os registros de alterações: 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 =

Edit: Respondendo ao seu comentário, não entendo bem o que você quer dizer. Todas as informações que você precisa estão ali, basta usá-las.

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

Novamente, apenas ignore que rótulo / descrição são objetos. Eles possuem métodos __toString () que são chamados automaticamente quando você os imprime / os utiliza.

Berdir
fonte
Obrigado por esta resposta. Seu último link proposto parece muito promissor e investigarei com base nessas informações. Resumidamente disse, estou errado se eu acho que para minhas necessidades (extrato label, description, modulecordas de cada tipo de campo) I deve: 1) obter a lista de Drupal::service('plugin.manager.field.field_type')->getDefinitions()como já feito; 2) use cada chave do array retornado (o nome do tipo de campo) para chamar uma classe específica (encontre qual e onde é o que devo examinar mais detalhadamente) que fornecerá métodos para obter as informações necessárias? TIA para esta precisão.
CFreed
Atualizei minha resposta.
Berdir 9/11/2015
Opa ... não entendo! O que você propôs na sua edição é apenas o que eu fiz no D7. E NÃO funciona no D8, já que $definitionnão é um conjunto de strings no D8, mas um conjunto de objetos! Eu costumava dpm () para examiná-los, e viu que cada uma das cordas necessárias aparece aninhada desta forma: 'label' => array(..., 'label' => Drupal\Core\StringTranslation\TranslatableMarkup Object {..., string, ...}, ...). Estou perdendo algo óbvio?
precisa
Acabei de descobrir (ultimamente) a última edição do 4k4, que funciona. De fato, o problema para mim era saber onde encontrar a TranslatableMarkupclasse e a disponibilidade do render()método. Finalmente, a maneira correta de obter meus dados é print $definition['label']->render();. No entanto, obrigado por suas outras informações.
precisa
Não, novamente, você não precisa -> render (). usar $ definição [ 'label'], ele simplesmente funciona, confie em mim :)
Berdir
1

Versão atualizada para a resposta do @Berdir. Use com casca.

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

Saída aqui: https://gist.github.com/sobi3ch/70635cc62defff606242

sobi3ch
fonte
1

O Google parece encontrar esta pergunta ao procurar por essas

Se você estiver usando o Drupal Console, também poderá usar:

drupal plugin:debug field.field_type

Há também isso no Drupal.org que também pode ajudar:

Definindo e usando definições de campo de entidade de conteúdo

Não é fácil encontrar exemplos de ferramentas úteis

carl-16hands
fonte