Alan türlerinin listesi nasıl alınır?


10

Drupal 7'den Drupal 8'e bir modül taşıyorum. Bu modülün yapılandırma ayarlarında şu anda var olan alan türlerinin listesini almam gerekiyor.

Drupal 7'de bu field_info_field_types()fonksiyon kullanılarak başarıldı .

Drupal 8'de (8.0.0-rc3), Drupal API Referans Yardımı sayfasında belirtilen bilgilere rağmen, güncelliğini yitirmiş bir "işlev yok" hatası alıyorum .

Daha sonra araştırmak , fonksiyonun kullanımdan kaldırıldığı bildirilen bir DrupalContrib sayfası buldum ve şimdi kullanmayı önerdimDrupal::service('plugin.manager.entity.field.field_type')->getDefinitions() .

Ama bunu kullanarak başka bir hata "Bilinmeyen hizmet plugin.manager.entity.field.field_type", neyse ki "plugin.manager.field.field_type?"

Ben Drupal::service('plugin.manager.field.field_type')->getDefinitions()ve wow kullanmayı denedim : Beklenen alan türleri dizi var.

Ancak her dizi üyesi (bir alan türü) artık bir nesne (alt dizi yerine) ve aradığım veriler korumalı özellikler içinde iç içe geçmiş, bu yüzden onlara erişemiyorum.

Bu aşamada takıldım. Bu verilerde gezinmek için genişletebileceğim bazı sınıflar olabileceğini düşündüm, ancak hiç şans olmadan: Özellikle alan türleri tanımlarının merkezileştirildiği Drupal 8'de hangi bileşen olduğunu bile anlayamadım.


Daha fazla güncelleme olan api.drupal.org'a bakmanız daha iyi. Aslında, bu işlev için bir sayfa yoktur .
kiamlaluno

"Api.drupal.org'a bak" için bahşiş için teşekkürler. Öte yandan (ve bu oldukça meta alakalı, üzgünüm), kısaltmalarımı (D7 -> Drupal 7) düzenlediğinizi kolayca anlarsam, neden başlıkta "Drupal 8" i bıraktığınızı merak ediyorum? Ben "8" etiketi ile redondant olduğunu söyleyen bir kural olacağını düşünüyorum eğilimindedir. Ancak bir okuyucu olarak, başlıktan etikete göre çok daha emin bir şekilde beni bilgilendirmek için kullanıyorum: gözlerimde, etiketler temel olarak arama sürecini ele alırken, sıralı olarak okurken nadiren onlara dikkat ediyorum.
cFreed

Etiketleri bir sorunun tekrarlanmasına gerek yoktur, çünkü bunlar bir sorunun listelendiği her yerde görünür. Stack Exchange kullanıcıları etiketlere dikkat eder.
kiamlaluno

Yanıtlar:


16

İlk seviye bir dizidir. Anahtarlar eklenti kimlikleri. Bunları listeleyebilirsiniz:

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

Sonuç budur:

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

Bir tane seçebilir ve eklenti tanımını dökebilirsiniz.

var_dump($defs['comment']);

Özel bir nesneyle ilgileniyorsanız, api.drupal.org'un yardımıyla daha derine inebilirsiniz. Ancak çekirdek dizinde eklentiyi ararsanız daha kolay olacaktır.

Bir nesneye erişmek için var_dump içinde bulun ve bir yöntem kullanın:

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

Bu durumda , çevrilen dizeye erişmek için render yöntemine sahip TranslatableMarkup nesnesidir .


Teşekkürler ama zaten bunu yaptım. Bunun ötesinde, sorunum devam ediyor: bu nesnelerin içindeki verilere programlı olarak nasıl erişebilirim ?
cFreed

Alan tanımlarında ne bulmak istiyorsunuz? Genel olarak api'deki bir nesnenin özelliklerini ve yöntemlerini ararsınız ve sonra bunlara `` -> '' ile erişirsiniz. Alan tanımlarını kaynağında aramak daha kolaydır.
4k4

Ben ayıklamak label, descriptionve modulekullanıcı bu benim modülü (istediği için olanları kontrol edebilirsiniz nerede bir yapılandırma şeklinde bunları görüntülemek MMS ilgili alanlar için belirteçleri klonlanmış oluşturur).
cFreed

Bir örnek ekliyorum.
4k4

Hata! Son yorumunuzu gördüm, ancak düzenlemenizi fark etmedim, bu yüzden beklemeye devam ettim. Önerinizi deneyeceğim. Teşekkürler.
cFreed

4

T () 'den geçen her dize şimdi bir nesnedir. Onlara dize olarak erişebilirsiniz, aslında bunu yapmalısınız.

Böyle bir nesneyi olduğu gibi kullanamayacağınız çok az istisna vardır, örneğin dizi anahtarları, bunlar için bunları bir dizeye yayınlamanız gerekir. Başka her şey işe yaramalı.

Not: Resmi API belgeleri http://api.drupal.org/api/drupal/8'dir . Bunu çekirdek için kullanın.

Başka bir iyi kaynak değişiklik kayıtlarıdır: 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=creatif% 5D =

Edit: Yorumunuza cevap, ben ne demek istediğini anlamıyorum. İhtiyacınız olan tüm bilgiler burada, sadece kullanın.

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

Yine, etiket / açıklamanın nesne olduğunu görmezden gelin. Bunları yazdırdığınızda / kullandığınızda otomatik olarak çağrılan __toString () yöntemleri vardır.


Bu cevap için teşekkürler. Son önerilen bağlantınız çok umut verici görünüyor ve bu bilgilere dayanarak araştırma yapacağım. Kısaca benim ihtiyaçları için tahmin eğer yanlış mıyım dedim (özü label, description, moduleher bir alan tipi dizeleri) Ben olmalıdır: 1) den listesini almak Drupal::service('plugin.manager.field.field_type')->getDefinitions()zaten bitmiş gibi; 2) daha sonra, gerekli bilgileri almak için yöntemler sağlayacak belirli bir sınıfı çağırmak için döndürülen dizinin (alan türü adı) her bir anahtarını kullanın (hangisini ve nerede daha derin incelemek zorundayım)? Bu hassasiyet için TIA.
cFreed

Cevabım güncellendi.
Berdir

Hata! Anlamıyorum! Düzenlemenizde önerdiğiniz şey D7'de yaptığım şeydi. Ve D8'de çalışmaz, çünkü D8'de $definitionbir dizi dizisi değil, bir nesne dizisidir! Ben gerekli dizelerin her bu şekilde iç içe görünür onları incelemek için dpm () kullanılan ve testere: 'label' => array(..., 'label' => Drupal\Core\StringTranslation\TranslatableMarkup Object {..., string, ...}, ...). Açık bir şey mi kaçırıyorum?
cFreed

Yeni (son zamanlarda) 4k4'ün son düzenlemesini keşfetti. Aslında benim için sorun, TranslatableMarkupsınıfın nerede bulunacağını ve render()yöntemin kullanılabilirliğini bilmekti . Son olarak verilerimi almanın doğru yolu print $definition['label']->render();. Yine de, diğer bilgileriniz için teşekkürler.
cFreed

Hayır, yine, sen do not ) (> render - gerekir. $ definition ['label'] kullanın, işe yarıyor, bana güvenin :)
Berdir

1

@Berdir yanıtı için güncellenmiş sürüm. Kabukta kullanın.

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

Buradan çıktı: https://gist.github.com/sobi3ch/70635cc62defff606242


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.