Программирование пользовательских полей в ваш тип контента
Иногда, когда вы извлекаете тип контента из пользовательского модуля, вы также можете добавить поля, относящиеся к этому типу контента. Возможность автоматически создавать поля позволяет вам удалять и переустанавливать на нескольких сайтах, не оставляя лишних полей и гарантируя, что вы не забудете добавить их. Есть два способа добавить эти поля в вашу кодовую базу, которые мы рассмотрим.
Предпосылки
- Drupal 8.0.x установлен.
- Имейте пользовательский модуль (имя модуля, используемого в этом примере, является foobar).
- Имейте пользовательский тип контента в модуле (Пожалуйста, следуйте инструкциям на родительской странице. Название типа контента будет Car Brand).
Добавление дополнительных полей к нашему типу контента
Есть два способа сделать этот шаг. Вы можете использовать пользовательский интерфейс для создания полей и экспорта конфигурации в файлы, или вы можете просто написать файлы самостоятельно. Мне нравится использовать первый вариант, просто чтобы убедиться, что вы не пропустите ничего, что будет необходимо, однако поля экспортируются с «field_» в начале, а не «foobar_car_brand_», чтобы связать их с нашим пользовательским типом контента. Мы рассмотрим ручное кодирование полей в вашем пользовательском модуле на этой странице.
Ручное кодирование полей в вашем модуле
Как указывалось ранее, этот метод требует немного больше знаний и точного знания того, что вы хотите, чтобы поле делало и выглядело. Каждое добавляемое поле должно иметь два файла YAML, которые содержат информацию о конфигурации. Они называются следующим образом: field.field.node.car_brand.field_brand_information.yml и field.storage.node.field_brand_information.yml.
Удалить пользовательский тип контента
Если вы уже включили модуль foobar в конце последней страницы, продолжайте и удалите его сейчас.
foobar/config/install/field.storage.node.field_brand_information.yml
Этот файл сообщит Drupal, что он должен создать наше поле.
# field.storage.node.field_brand_information.yml langcode: en status: true dependencies: module: - node - text id: node.field_brand_information field_name: field_brand_information entity_type: node type: text_with_summary settings: { } module: text locked: false cardinality: 1 translatable: true indexes: { } persist_with_no_fields: false custom_storage: false
foobar/config/install/field.field.node.car_brand.field_brand_information.yml
Этот файл сообщит Drupal, что он должен прикрепить наше поле к нашему типу контента.
# field.field.node.car_brand.field_brand_information.yml langcode: en status: true dependencies: config: - field.storage.node.field_brand_information - node.type.car_brand module: - text id: node.car_brand.field_brand_information field_name: field_brand_information entity_type: node bundle: car_brand label: 'Brand Information' description: 'More specific information about the car brand' required: false translatable: false default_value: { } default_value_callback: '' settings: display_summary: false field_type: text_with_summary
foobar/config/install/core.entity_form_display.node.car_brand.default.yml | foobar/config/install/core.entity_view_display.node.car_brand.default.yml
Оба эти файла необходимо обновить с предыдущей страницы, чтобы они включали все новые поля, которые вы добавляете. Я добавил два дополнительных поля с именами «Additional_field_1» и «Additional_field_2», чтобы вы могли видеть, как это будет выглядеть с несколькими полями.
Примечание. Если вы не хотите создавать дополнительные поля, удалите зависимости и информацию для этих полей в следующем коде.
# core.entity_view_display.node.car_brand.default.yml langcode: en status: true dependencies: config: - field.field.node.car_brand.field_brand_information - field.field.node.car_brand.field_additional_field_1 - field.field.node.car_brand.field_additional_field_2 - node.type.car_brand module: - file - text - user _core: default_config_hash: Nfnv6VMugBKl6EOqi_U0I_LQ1ZQpbNDN3a9GXHWUBz4 id: node.car_brand.default targetEntityType: node bundle: car_brand mode: default content: field_brand_information: weight: 101 label: above settings: { } third_party_settings: { } type: text_default field_additional_field_1: weight: 103 label: above settings: link_to_entity: false third_party_settings: { } type: string field_additional_field_2: weight: 102 label: above settings: { } third_party_settings: { } type: file_default links: weight: 100 hidden: { }
# core.entity_form_display.node.car_brand.default.yml langcode: en status: true dependencies: config: - field.field.node.car_brand.field_brand_information - field.field.node.car_brand.field_additional_field_1 - field.field.node.car_brand.field_additional_field_2 - node.type.car_brand module: - file - path - text _core: default_config_hash: qZE-qJ04DTTNggVVQdVOPQmpE_I69GQ_LqB32kXivVg id: node.car_brand.default targetEntityType: node bundle: car_brand mode: default content: created: type: datetime_timestamp weight: 2 settings: { } third_party_settings: { } field_brand_information: weight: 7 settings: rows: 9 summary_rows: 3 placeholder: '' third_party_settings: { } type: text_textarea_with_summary field_additional_field_1: weight: 6 settings: size: 60 placeholder: '' third_party_settings: { } type: string_textfield field_additional_field_2: weight: 8 settings: progress_indicator: throbber third_party_settings: { } type: file_generic path: type: path weight: 5 settings: { } third_party_settings: { } promote: type: boolean_checkbox settings: display_label: true weight: 3 third_party_settings: { } sticky: type: boolean_checkbox settings: display_label: true weight: 4 third_party_settings: { } title: type: string_textfield weight: 0 settings: size: 60 placeholder: '' third_party_settings: { } uid: type: entity_reference_autocomplete weight: 1 settings: match_operator: CONTAINS size: 60 placeholder: '' third_party_settings: { } hidden: { }
Включить пользовательский тип контента
Теперь вы должны включить модуль foobar. Если вы сейчас перейдете на страницу «Создать контент», то увидите, что можете создать новый узел типа контента «Car Brand», и он будет включать наше новое поле с именем «Brand Information».
Мы рассмотрим добавление этих полей через пользовательский интерфейс на следующей странице.
Drupal’s online documentation is © 2000-2020 by the individual contributors and can be used in accordance with the Creative Commons License, Attribution-ShareAlike 2.0. PHP code is distributed under the GNU General Public License.