Làm thế nào để có được danh sách các loại trường?


10

Tôi đang chuyển một mô-đun từ Drupal 7 sang Drupal 8. Trong cài đặt cấu hình của mô-đun này, tôi cần lấy danh sách các loại trường hiện có.

Trong Drupal 7, điều này đã đạt được bằng cách sử dụng field_info_field_types()chức năng.

Trong Drupal 8 (8.0.0-rc3), tôi gặp lỗi "chức năng không tồn tại", mặc dù thông tin được nêu trong trang Trợ giúp Tham khảo API Drupal , đã hết hạn.

Sau đó, điều tra tôi tìm thấy một trang DrupalContrib , nơi hàm được khai báo không dùng nữa và đề xuất sử dụng ngay bây giờ Drupal::service('plugin.manager.entity.field.field_type')->getDefinitions().

Nhưng sử dụng nó gây ra một lỗi khác "Plugin dịch vụ không xác định.manager.entity.field.field_type", may mắn được liên kết với đề xuất "Bạn có nghĩa là plugin.manager.field.field_type?"

Vì vậy, tôi đã thử sử dụng Drupal::service('plugin.manager.field.field_type')->getDefinitions()và wow: Tôi đã nhận được các loại trường dự kiến.

Nhưng mỗi thành viên mảng (một loại trường) hiện là một đối tượng (thay vì mảng con) và dữ liệu tôi đang tìm kiếm được lồng trong các thuộc tính được bảo vệ, vì vậy tôi không thể truy cập chúng.

Ở giai đoạn này, tôi bị mắc kẹt. Tôi đã xem nó có thể tồn tại một số lớp mà tôi có thể mở rộng để điều hướng qua các dữ liệu này, nhưng không có gì may mắn: tôi đáng chú ý thậm chí không thể tìm ra thành phần nào trong Drupal 8 trong đó các định nghĩa kiểu trường được tập trung.


Tốt hơn là bạn nên xem api.drupal.org, đây là bản cập nhật nhiều hơn. Trong thực tế, không có một trang cho chức năng đó .
kiamlaluno

Cảm ơn vì mẹo "nhìn vào api.drupal.org". Mặt khác (và điều này khá liên quan, xin lỗi), nếu tôi dễ dàng hiểu bạn đã chỉnh sửa các chữ viết tắt của tôi (D7 -> Drupal 7), tôi tự hỏi tại sao bạn lại bỏ "Drupal 8" trong tiêu đề? Tôi có xu hướng nghĩ rằng sẽ có một số quy tắc nói rằng đó là đổi màu với thẻ "8". Nhưng với tư cách là một người đọc, tôi sử dụng để tìm cho tôi tiêu đề chắc chắn hơn nhiều so với thẻ: trong mắt tôi, các thẻ chủ yếu giải quyết quá trình tìm kiếm, trong khi đọc tuần tự tôi hiếm khi chú ý đến chúng.
cFreed

Không cần lặp lại các thẻ trong tiêu đề, vì chúng luôn hiển thị ở bất cứ nơi nào một câu hỏi được liệt kê. Người dùng Stack Exchange chú ý đến các thẻ.
kiamlaluno

Câu trả lời:


16

Cấp độ đầu tiên là một mảng. Các khóa là id của plugin. Bạn có thể liệt kê chúng:

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

Đây là kết quả:

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

Bạn có thể chọn một và kết xuất định nghĩa plugin.

var_dump($defs['comment']);

Nếu bạn quan tâm đến một đối tượng đặc biệt, bạn có thể đào sâu hơn với sự trợ giúp của api.drupal.org. Nhưng nó sẽ dễ dàng hơn, nếu bạn tìm kiếm plugin trong thư mục lõi.

Để truy cập một đối tượng, xác định vị trí của nó trong var_dump và sử dụng một phương thức:

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

Trong trường hợp này, nó là đối tượng TranslizableMarkup , có phương thức kết xuất để truy cập chuỗi dịch.


Cảm ơn nhưng đây là những gì tôi đã làm. Ngoài ra, vấn đề của tôi vẫn là: làm thế nào tôi có thể truy cập dữ liệu bên trong các đối tượng này một cách lập trình ?
cFreed

Bạn muốn tìm gì trong định nghĩa trường? Nói chung, bạn tìm kiếm các thuộc tính và phương thức của một đối tượng trong api và sau đó bạn truy cập chúng với `-> '. Định nghĩa trường dễ dàng hơn để tìm kiếm trong nguồn.
4k4

Tôi trích xuất label, descriptionmodulevà hiển thị chúng trong một hình thức cấu hình mà người dùng có thể kiểm tra những cái mà nó muốn mô-đun của tôi ( MMS ) tạo thẻ cho các lĩnh vực có liên quan nhân bản.
cFreed

Tôi thêm một ví dụ.
4k4

Giáo sư! Tôi thấy bình luận cuối cùng của bạn, nhưng không nhận thấy chỉnh sửa của bạn, vì vậy tôi tiếp tục chờ đợi. Tôi sẽ làm thử lời đề nghị của bạn. Cảm ơn.
cFreed

4

Bây giờ mọi chuỗi được truyền qua t () là một đối tượng. Bạn có thể truy cập chúng dưới dạng chuỗi, trên thực tế, bạn nên làm như vậy.

Chỉ có một vài trường hợp ngoại lệ mà bạn không thể sử dụng một đối tượng như vậy, ví dụ như các khóa mảng, đối với những đối tượng đó, bạn cần phải chuyển chúng thành một chuỗi. Bất cứ điều gì khác chỉ nên làm việc.

PS: Tài liệu API chính thức là http://api.drupal.org/api/drupal/8 . Sử dụng nó cho cốt lõi.

Một nguồn tốt khác là hồ sơ thay đổi: https://www.drupal.org/list-changes/published?keywords_description=field_info_field_types&to_branch=&version=&created_op=%3E%3D&created%5Bvalue%5D=c5 5D =

Chỉnh sửa: Trả lời bình luận của bạn, tôi không hiểu ý của bạn là gì. Tất cả thông tin bạn cần là ở ngay đó, chỉ cần sử dụng 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'];
}

Một lần nữa, chỉ cần bỏ qua rằng nhãn / mô tả là các đối tượng. Chúng có các phương thức __toString () được gọi tự động khi bạn in / sử dụng chúng.


Cảm ơn câu trả lời này. Liên kết đề xuất cuối cùng của bạn có vẻ rất hứa hẹn và tôi sẽ điều tra dựa trên thông tin này. Tóm lại nói, tôi sai nếu tôi đoán rằng cho nhu cầu của tôi (chiết xuất label, description, modulechuỗi của mỗi trường-type) Tôi nên: 1) nhận được danh sách từ Drupal::service('plugin.manager.field.field_type')->getDefinitions()như đã được thực hiện; 2) sau đó sử dụng từng khóa của mảng trả về (tên kiểu trường) để gọi một lớp cụ thể (tìm cái nào và ở đâu, cái gì tôi phải kiểm tra sâu hơn) sẽ cung cấp các phương thức để có được các infos cần thiết? TIA cho độ chính xác này.
cFreed

Cập nhật câu trả lời của tôi.
Berdir

Rất tiếc ... không hiểu! Những gì bạn đề xuất trong chỉnh sửa của bạn chỉ đơn thuần là những gì tôi đã làm trong D7. Và nó KHÔNG hoạt động trong D8, vì $definitionkhông phải là một chuỗi các chuỗi trong D8, mà là một mảng các đối tượng! Tôi đã sử dụng dpm () để kiểm tra chúng và thấy rằng mỗi chuỗi cần thiết xuất hiện theo cách này : 'label' => array(..., 'label' => Drupal\Core\StringTranslation\TranslatableMarkup Object {..., string, ...}, ...). Tôi có thiếu một cái gì đó rõ ràng?
cFreed

Chỉ cần phát hiện (gần đây) bản chỉnh sửa cuối cùng của 4k4, hoạt động. Trong thực tế, vấn đề đối với tôi là phải biết tìm TranslatableMarkuplớp ở đâu và tính khả dụng của render()phương thức ,. Cuối cùng, cách chính xác để có được dữ liệu của tôi là print $definition['label']->render();. Tuy nhiên, cảm ơn cho thông tin khác của bạn.
cFreed

Không, một lần nữa, bạn không cần -> render (). sử dụng $ định nghĩa ['nhãn'], nó chỉ hoạt động, tin tôi đi :)
Berdir

1

Phiên bản cập nhật cho câu trả lời @Berdir. Sử dụng trong vỏ.

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

Đầu ra tại đây: https://gist.github.com/sobi3ch/70635cc62defff606242


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.