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.
Respostas:
O primeiro nível é uma matriz. As chaves são os IDs do plug-in. Você pode listá-los:
Este é o resultado:
Você pode escolher um e despejar a definição de plug-in.
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:
Nesse caso, é o objeto TranslatableMarkup , que possui o método render para acessar a sequência traduzida.
fonte
label
,description
emodule
e 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.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.
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.
fonte
label
,description
,module
cordas de cada tipo de campo) I deve: 1) obter a lista deDrupal::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.$definition
nã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?TranslatableMarkup
classe e a disponibilidade dorender()
método. Finalmente, a maneira correta de obter meus dados éprint $definition['label']->render();
. No entanto, obrigado por suas outras informações.Versão atualizada para a resposta do @Berdir. Use com casca.
Saída aqui: https://gist.github.com/sobi3ch/70635cc62defff606242
fonte
O Google parece encontrar esta pergunta ao procurar por essas
Se você estiver usando o Drupal Console, também poderá usar:
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
fonte