フィールドタイプのリストを取得する方法


10

モジュールをDrupal 7からDrupal 8に移植します。このモジュールの構成設定で、現在存在するフィールドタイプのリストを取得する必要があります。

Drupal 7では、これはfield_info_field_types()関数を使用して実現されました。

Drupal 8(8.0.0-rc3)では、Drupal APIリファレンスのヘルプページに記載されている情報が明らかに古くなっているにもかかわらず、「関数が存在しません」というエラーが表示されます。

次に調査したところ、DrupalContribページが見つかりました。このページでは、関数が非推奨であると宣言されており、現在使用することを提案していますDrupal::service('plugin.manager.entity.field.field_type')->getDefinitions()

しかし、それを使用すると、別のエラー「不明なサービスplugin.manager.entity.field.field_type」が発生します。これは、「plugin.manager.field.field_type?」という提案に幸運にも関連付けられています。

だから私は使ってみましたDrupal::service('plugin.manager.field.field_type')->getDefinitions()。フィールドタイプの予想される配列を取得しました。

しかし、各配列メンバー(1つのフィールド型)は(子配列ではなく)オブジェクトになり、探しているデータは保護されたプロパティ内にネストされているため、アクセスできません。

この段階では、行き詰まっています。これらのデータをナビゲートするために拡張できるクラスが存在する可能性があると考えましたが、運が悪かったのです。特に、フィールドタイプの定義が一元化されているDrupal 8のコンポーネントがどれであるかもわかりませんでした。


より更新されたapi.drupal.orgを確認することをお勧めします。実際、その関数のページはありません
kiamlaluno

ヒント「api.drupal.orgを見てください」をありがとう。一方、これはメタ関連で、申し訳ありませんが、私の略語(D7-> Drupal 7)を編集したことを簡単に理解できたとしたら、なぜタイトルに「Drupal 8」を落としたのでしょうか。「8」タグの付いたリダンダントであるというルールがあると思いがちです。しかし、読者として、私はタグよりもタイトルによってより確実に私に気づかされるのを見つけるために使用します。目で見ると、タグは本質的に検索プロセスに対処します。
cFreed、2015年

質問がリストされている場所には常に表示されるため、タイトルでタグを繰り返す必要はありません。Stack Exchangeユーザーはタグに注意を払います。
kiamlaluno

回答:


16

最初のレベルは配列です。キーはプラグインIDです。あなたはそれらをリストすることができます:

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

これが結果です:

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

1つを選択してプラグイン定義をダンプできます。

var_dump($defs['comment']);

特別なオブジェクトに興味がある場合は、api.drupal.orgを利用して詳細を調べることができます。しかし、コアディレクトリでプラグインを検索すると、より簡単になります。

オブジェクトにアクセスするには、var_dumpでオブジェクトを見つけて、メソッドを使用します。

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

この場合、翻訳された文字列にアクセスするためのrenderメソッドを持つオブジェクトはTranslatableMarkupです。


おかげで、これは私がすでにやったことです。それを超えて、私の問題は残っています:これらのオブジェクト内のデータプログラムでアクセスするにはどうすればよいですか?
cFreed、2015年

フィールド定義で何を見つけたいですか?一般に、apiでオブジェクトのプロパティとメソッドを検索し、 `-> 'を使用してそれらにアクセスします。フィールド定義は、ソースで検索する方が簡単です。
4k4 2015年

私が抽出しlabeldescriptionそしてmodule、ユーザーはそれが私のモジュール(望んでいるものを確認することができ、構成形式でそれらを表示するMMSは)関連分野のためにクローン化されたトークンを作成します。
cFreed、2015年

例を追加します。
4k4 2015年

おっと!あなたの最後のコメントを見ましたが、あなたの編集に気づかなかったので、私は待ち続けました。私はあなたの提案を試みます。ありがとう。
cFreed 2015年

4

現在、t()を介して渡されるすべての文字列はオブジェクトです。それらには文字列としてアクセスできますが、実際にはアクセスする必要があります。

配列キーなど、このようなオブジェクトをそのまま使用できない例外はごくわずかですが、それらは文字列にキャストする必要があります。他は何でもうまくいくはずです。

PS:公式のAPIドキュメントはhttp://api.drupal.org/api/drupal/8です。コアに使用します。

もう1つの優れたリソースは、変更レコードです。 5D =

編集:あなたのコメントに応答して、私はあなたの意味がよくわかりません。必要なすべての情報がそこにあります。使用してください。

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

ここでも、ラベル/説明がオブジェクトであることを無視してください。それらには、印刷/使用時に自動的に呼び出される__toString()メソッドがあります。


この回答をありがとう。あなたの最後に提案されたリンクは非常に有望に見えます、そして私はこの情報に基づいて調査します。簡単に言えば、私は私のニーズのためにそれを推測する場合、私は間違っている、と述べた(エキスlabeldescriptionmodule各フィールド型の文字列)私は必要があります:1)からリストを取得しDrupal::service('plugin.manager.field.field_type')->getDefinitions()、既に行わ等。2)次に、必要な情報を取得するためのメソッドを提供する特定のクラスを呼び出すために、返された配列(フィールドタイプ名)の各キーを使用します(どのクラスを、どこで調べなければならないかを調べます)。この精度のTIA。
cFreed、2015年

私の答えを更新しました。
Berdir 2015年

おっと…理解できません!あなたが編集で提案したのは、私がD7でやったことだけです。また、D8 $definitionの文字列の配列ではなく、オブジェクトの配列であるため、D8では機能しません。dpm()を使用してそれらを調べたところ、必要な各文字列が次のようにネストされていることがわかりました'label' => array(..., 'label' => Drupal\Core\StringTranslation\TranslatableMarkup Object {..., string, ...}, ...)。私は明白な何かを見逃していますか?
cFreed、2015年

(最近)機能する4k4の最後の編集を発見しました。実際、私にとっての問題は、TranslatableMarkupクラスの場所とrender()メソッドの可用性を知ることでした。最後に、私のデータを取得する正しい方法はprint $definition['label']->render();です。それにもかかわらず、あなたの他の情報をありがとう。
cFreed 2015年

いいえ、繰り返しますが、-> render()必要ありませ。$ definition ['label']を使用してください。機能します。信頼してください:)
Berdir

1

@Berdir回答の更新バージョン。シェルで使用します。

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

ここに出力:https : //gist.github.com/sobi3ch/70635cc62defff606242


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.