Я портирую модуль из 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()
и ничего себе: я получил ожидаемый массив типов полей.
Но каждый член массива (один тип поля) теперь является объектом (а не дочерним массивом), и искомые данные вложены в защищенные свойства, поэтому я не могу получить к ним доступ.
На этом этапе я застрял. Я подумал, что может существовать некоторый класс, который я мог бы расширить, чтобы перемещаться по этим данным, но без удачи: я даже не мог понять, какой компонент в Drupal 8, где определения типов полей централизованы.
Ответы:
Первый уровень - это массив. Ключи - это идентификаторы плагина. Вы можете перечислить их:
Это результат:
Вы можете выбрать один и сбросить определение плагина.
Если вас интересует особый объект, вы можете копать глубже с помощью api.drupal.org. Но это будет проще, если вы будете искать плагин в основной директории.
Чтобы получить доступ к объекту, найдите его в var_dump и используйте метод:
В данном случае это объект TranslatableMarkup , который имеет метод render для доступа к переведенной строке.
источник
label
,description
иmodule
и отображать их в виде конфигурации , где пользователь может проверить те , для которых он хочет мой модуль ( MMS ) создает клонированных маркеры для соответствующих полей.Каждая строка, которая передается через t (), теперь является объектом. Вы можете получить к ним доступ в виде строк, на самом деле, вы должны это сделать.
Есть только несколько исключений, когда вы не можете просто использовать такой объект как есть, например ключи массива, для которых вам нужно привести их к строке. Все остальное должно просто работать.
PS: Официальная документация по API - http://api.drupal.org/api/drupal/8 . Используйте это для ядра.
Еще один полезный ресурс - записи изменений: 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=&maxreated% 5D =
Изменить: Отвечая на ваш комментарий, я не совсем понимаю, что вы имеете в виду. Вся необходимая информация находится здесь, просто используйте ее.
Опять же, просто игнорируйте, что метка / описание являются объектами. У них есть методы __toString (), которые автоматически вызываются при их печати / использовании.
источник
label
,description
,module
строки каждого поля типа) следует: 1) получить список из ,Drupal::service('plugin.manager.field.field_type')->getDefinitions()
как уже сделано; 2) затем используйте каждый ключ возвращаемого массива (имя типа поля) для вызова определенного класса (найдите, какой и где, что я должен исследовать глубже), который предоставит методы для получения необходимой информации? TIA для этой точности.$definition
это не массив строк в D8, а массив объектов! Я использовал ДПЙ () , чтобы изучить их, и увидел , что каждый из необходимых строк появляется вложенным таким образом:'label' => array(..., 'label' => Drupal\Core\StringTranslation\TranslatableMarkup Object {..., string, ...}, ...)
. Я что-то упускаю из виду?TranslatableMarkup
класс, и о доступностиrender()
метода. Наконец, правильный способ получить мои данныеprint $definition['label']->render();
. Тем не менее, спасибо за вашу другую информацию.Обновленная версия для ответа @Berdir. Используйте в оболочке.
Вывод здесь: https://gist.github.com/sobi3ch/70635cc62defff606242
источник
Google, кажется, находит этот вопрос при поиске этих
Если вы используете консоль Drupal, вы также можете использовать:
На Drupal.org также есть это, которое также может помочь:
Определение и использование определений Content Entity Field
Это не легко найти примеры полезных, хотя
источник