Як отримати список типів полів?


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()та wow: я отримав очікуваний масив типів полів.

Але кожен член масиву (один тип поля) тепер є об'єктом (замість дочірнього масиву), і дані, які я шукаю, вкладені в захищені властивості, тому я не можу отримати доступ до них.

На цьому етапі я застряг. Я вважав, що може існувати якийсь клас, який я міг би розширити для навігації по цих даних, але не пощастило: я, зокрема, не міг навіть зрозуміти, який компонент в Drupal 8, де визначення типів поля централізовано.


Краще подивіться на api.drupal.org, який є більш оновленим. Насправді, для цієї функції немає сторінки .
kiamlaluno

Дякуємо за пораду "подивіться на api.drupal.org". З іншого боку (і це скоріше метарелевантно, вибачте), якщо я легко розумію, що ви редагували мої скорочення (D7 -> Drupal 7), мені цікаво, чому ви виписали "Drupal 8" у назві? Я схильний вважати, що існує якесь правило, яке говорить про те, що воно повторюється тегом "8". Але я, як читач, знаходжу мене набагато впевненішим у назві, ніж тег: у моїх очах теги, по суті, стосуються процесу пошуку, а під час читання я рідко звертаю на них увагу.
cFreed

Немає необхідності повторювати теги в заголовку, оскільки вони завжди видно, де б не було вказано питання. Користувачі стекових бірж звертають увагу на теги.
kiamlaluno

Відповіді:


16

Перший рівень - це масив. Ключі - це ідентифікатор плагіна. Ви можете перелічити їх:

$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

Ви можете вибрати один і скинути визначення плагіна.

var_dump($defs['comment']);

Якщо вас цікавить спеціальний об’єкт, ви можете копати глибше за допомогою api.drupal.org. Але буде простіше, якщо ви шукаєте плагін в основному каталозі.

Щоб отримати доступ до об'єкта, знайдіть його у var_dump та скористайтеся методом:

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

У цьому випадку це об'єкт TranslatableMarkup , який має метод візуалізації для доступу до перекладеної рядка.


Дякую, але це я вже зробив. Крім того, моя проблема залишається: як я можу програмно отримати доступ до даних усередині цих об’єктів?
cFreed

Що ви хочете знайти у визначеннях поля? Як правило, ви шукаєте властивості та методи об’єкта в api, а потім отримуєте доступ до них за допомогою `-> '. Визначення поля простіше шукати в джерелі.
4k4

Витягти label, descriptionі moduleта відображати їх у вигляді конфігурації , де користувач може перевірити ті , для яких він хоче мій модуль ( MMS ) створює клонованих маркери для відповідних полів.
cFreed

Додаю приклад.
4k4

На жаль! Я бачив ваш останній коментар, але не помітив вашого редагування, тому я з нетерпінням чекав. Я спробую вашу пропозицію. Дякую.
cFreed

4

Кожна рядок, що передається через t (), є об'єктом зараз. Ви можете отримати доступ до них як рядки, насправді це потрібно зробити.

Є лише дуже мало винятків, коли ви не можете просто використовувати такий об’єкт, як є, наприклад, клавіші масиву, для них вам потрібно накинути їх на рядок. Все інше повинно просто працювати.

PS: Офіційна документація API - це http://api.drupal.org/api/drupal/8 . Використовуйте це для core.

Ще одним хорошим ресурсом є записи про зміни: https://www.drupal.org/list-changes/published?keywords_description=field_info_field_types&to_branch=&version=&create_op=%3E%3D&create%5Bvalue%5D=&create%5Bmin%5D=&create%5Bmax% 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 (), які автоматично викликаються під час їх друку / використання.


Дякую за цю відповідь. Ваше останнє запропоноване посилання виглядає дуже перспективно, і я буду досліджувати на основі цієї інформації. Коротко сказав, я не маю рації , якщо я думаю , що для моїх потреб (виписок label, description, moduleрядки кожного поля типу) слід: 1) отримати список з , Drupal::service('plugin.manager.field.field_type')->getDefinitions()як вже зроблено; 2) потім використовуйте кожен ключ повернутого масиву (ім'я типу поля) для виклику певного класу (знайдіть який, а де, що я повинен вивчити глибше), який надасть методи для отримання потрібних відомостей? TIA для цієї точності.
cFreed

Оновлено мою відповідь.
Бердір

На жаль ... не розумію! Те, що ви запропонували у своїй редакції, - це лише те, що я зробив у D7. І це не працює у D8, оскільки $definitionце не масив рядків у D8, а масив об’єктів! Я використовував ДПЙ () , щоб вивчити їх, і побачив , що кожен з необхідних рядків з'являється вкладеним таким чином: 'label' => array(..., 'label' => Drupal\Core\StringTranslation\TranslatableMarkup Object {..., string, ...}, ...). Невже я пропускаю щось очевидне?
cFreed

Щойно відкрили (останнім часом) останню редакцію 4k4, яка працює. Насправді проблемою для мене було знати, де знайти TranslatableMarkupклас та доступність render()методу. Нарешті, правильний спосіб отримати мої дані - це print $definition['label']->render();. Тим не менше, дякую за іншу інформацію.
cFreed

Ні, знову ж таки, вам не потрібно -> 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


1

Google, здається, знайшов це питання під час пошуку

Якщо ви використовуєте консоль Drupal, ви також можете використовувати:

drupal plugin:debug field.field_type

На Drupal.org також є це, що також може допомогти:

Визначення та використання визначень поля Entity Content

Нелегко знайти приклади корисних, хоча

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.