How to create content type, fields and view while installing custom module in Drupal 9 using configuration manager.
Here we are going to discuss how to move your content type and view in to custom module so that it will create content types , fields and view swhile installing module.
Normally developers creates content types , fields , views and view configurations in Admin UI, SO while sharing same changes to other environment or publishing in drupal.org it will be difficult to manually creating these configurations and fields.
Assuming we have content type Job application, this content type has below fields.
Now go to extend page, in module listing page you can see configuration manager, click on configure.
So in synchronize page you can see below export and import option
In export tab select single item.
Select configuration type as content type and configuration name select Job application.
So you can see below yml code generated.
uuid: 7278cb1f-3c5f-40bb-9828-0a60fc878bad langcode: en status: true dependencies: module: - menu_ui third_party_settings: menu_ui: available_menus: - main parent: 'main:' name: 'Job application' type: job_application description: '' help: '' new_revision: true preview_mode: 1 display_submitted: true
We are using this yml in our module as mentioned in page Filename: node.type.job_application.yml
Remove uuid from above and create a file node.type.job_application.yml in custom module path dn_careerdemo\config\install
Here dn_careerdemo is the sample module that we have.
Here in order to create new content type we are changing all job_application to job_applications, so file created will be node.type.job_applications.yml
Also content of file will be as below.
langcode: en status: true dependencies: module: - menu_ui - dn_careerdemo enforced: module: - dn_careerdemo third_party_settings: menu_ui: available_menus: - main parent: 'main:' name: 'Job applications' type: job_applications description: '' help: '' new_revision: true preview_mode: 1 display_submitted: true
We have included below dependency to our own module in order to remove content type and its fields during uninstall of this module.
Same way for each field, select respective fields as below. Here we are exporting application status filed.
So create file field.field.node.job_applications.field_application_status.yml in path /dn_careerdemo\config\install
Copy below content in file and update content type to job_applications.
langcode: en status: true dependencies: config: - field.storage.node.field_application_status - node.type.job_applications module: - options - tmgmt_content third_party_settings: tmgmt_content: excluded: false id: node.job_applications.field_application_status field_name: field_application_status entity_type: node bundle: job_applications label: 'Application status' description: '' required: false translatable: false default_value: { } default_value_callback: '' settings: { } field_type: list_string
Same way create yml file for all fields and place in path.
\config\install\
If you have a view of job_applications , same way you can export view. Here I have exported below view,
langcode: en status: true dependencies: config: - node.type.job_applications module: - node - user id: job_applications label: 'Job Applications' module: views description: '' tag: '' base_table: node_field_data base_field: nid display: default: display_plugin: default id: default display_title: Master position: 0 display_options: access: type: perm options: perm: 'access content' cache: type: tag options: { } query: type: views_query options: disable_sql_rewrite: false distinct: false replica: false query_comment: '' query_tags: { } exposed_form: type: basic options: submit_button: Apply reset_button: false reset_button_label: Reset exposed_sorts_label: 'Sort by' expose_sort_order: true sort_asc_label: Asc sort_desc_label: Desc pager: type: some options: items_per_page: 5 offset: 0 style: type: default row: type: fields fields: title: id: title table: node_field_data field: title settings: link_to_entity: true plugin_id: field relationship: none group_type: group admin_label: '' label: '' exclude: false alter: alter_text: false text: '' make_link: false path: '' absolute: false external: false replace_spaces: false path_case: none trim_whitespace: false alt: '' rel: '' link_class: '' prefix: '' suffix: '' target: '' nl2br: false max_length: 0 word_boundary: true ellipsis: true more_link: false more_link_text: '' more_link_path: '' strip_tags: false trim: false preserve_tags: '' html: false element_type: '' element_class: '' element_label_type: '' element_label_class: '' element_label_colon: true element_wrapper_type: '' element_wrapper_class: '' element_default_classes: true empty: '' hide_empty: false empty_zero: false hide_alter_empty: true click_sort_column: value type: string group_column: value group_columns: { } group_rows: true delta_limit: 0 delta_offset: 0 delta_reversed: false delta_first_last: false multi_type: separator separator: ', ' field_api_classes: false filters: status: value: '1' table: node_field_data field: status plugin_id: boolean entity_type: node entity_field: status id: status expose: operator: '' operator_limit_selection: false operator_list: { } group: 1 type: id: type table: node_field_data field: type value: job_application: job_applications entity_type: node entity_field: type plugin_id: bundle expose: operator_limit_selection: false operator_list: { } sorts: created: id: created table: node_field_data field: created order: DESC entity_type: node entity_field: created plugin_id: date relationship: none group_type: group admin_label: '' exposed: false expose: label: '' granularity: second title: 'Job Applications' header: { } footer: { } empty: { } relationships: { } arguments: uid: id: uid table: node_field_data field: uid relationship: none group_type: group admin_label: '' default_action: ignore exception: value: all title_enable: false title: All title_enable: false title: '' default_argument_type: fixed default_argument_options: argument: '' default_argument_skip_url: false summary_options: base_path: '' count: true items_per_page: 25 override: false summary: sort_order: asc number_of_records: 0 format: default_summary specify_validation: false validate: type: none fail: 'not found' validate_options: { } break_phrase: false not: false entity_type: node entity_field: uid plugin_id: numeric display_extenders: { } cache_metadata: max-age: -1 contexts: - 'languages:language_content' - 'languages:language_interface' - url - 'user.node_grants:view' - user.permissions tags: { } block_1: display_plugin: block id: block_1 display_title: Block position: 1 display_options: display_extenders: metatag_display_extender: { } block_description: 'Job Block' cache_metadata: max-age: -1 contexts: - 'languages:language_content' - 'languages:language_interface' - url - 'user.node_grants:view' - user.permissions tags: { }
Place above in in file \config\install\views.view.job_applications
Now you can place your custom module in any Drupal 9 instance, upon installation of the module , job applications content type will be created with all fields and also job application view also will be created with all its configuration.
During unintsall of the same module, all these content type and field will be removed.