Làm cách nào để thêm các trường tùy chỉnh và cài đặt hiển thị cho các loại nội dung tích hợp thông qua cài đặt mô-đun tùy chỉnh?


7

Tôi khá mới với Drupal, tôi đến từ sự phát triển của Wordpress và tôi đang cố gắng "dịch" một số bổ trợ của mình sang các mô-đun trong Drupal 8.

Tôi đang theo tài liệu cố gắng thêm một trường mới, nói "giá" vào một nút. Tất cả các tài liệu tôi tìm thấy có liên quan đến việc thêm một trường vào một nút tùy chỉnh, nhưng trong trường hợp của tôi, tôi muốn thêm các trường đó vào các nút được xác định trước thông thường.

Câu hỏi đầu tiên xuất hiện trong đầu tôi là, tôi có thể tạo trường tùy chỉnh bằng các tệp cấu hình YML hoặc mã phải không?

Tôi đã tạo trường bằng YML và nó được công nhận bởi drupal; vấn đề là chúng không xuất hiện trên các nút (tôi phải kích hoạt thủ công).

Tôi đã tạo trên module / config / install /:

  • core.entity_form_display.node.article.default
  • core.entity_view_display.node.article.default

Tôi thêm trường của mình, nhưng tất nhiên khi tôi cố gắng kích hoạt mô-đun thì nó không thích vì chúng đã được Drupal định nghĩa.

Có cách nào để "mở rộng" những tập tin cốt lõi đó không? điều đó có thể với YML hoặc mã không?

Tôi đã theo dõi https://www.drupal.org/docs/8/api/entity-api/programming-custom-fields-into-your-content-type . Tôi đã tạo các tệp YML trên / config / install và thực tế trường được tạo, vấn đề là tôi không biết cách "mở rộng" chế độ xem và biểu mẫu hiển thị vì chúng không liên quan đến loại nút tùy chỉnh, nếu không thì chúng nên được liên kết với các loại nút dựng sẵn và tôi không thể xác định lại các tệp đó (core.entity_form_display.node.article.default core.entity_view_display.node.article.default) vì chúng đã tồn tại trên lõi.

Theo dõi nhận xét này, tôi đã tạo các tệp sau:

/config/install/field.field.node.article.field_price.yml

langcode: en
status: true
dependencies:
  config:
    - field.storage.node.field_price
    - node.type.article
id: node.article.field_price
field_name: field_price
entity_type: node
bundle: article
label: Price
description: 'Premium Price'
required: false
translatable: false
default_value: {  }
default_value_callback: ''
settings:
  min: 1
  max: 9999
  prefix: ''
  suffix: ''
field_type: integer

/config/install/field.st Storage.node.field_price.yml

langcode: en
status: true
dependencies:
  module:
    - node
id: node.field_price
field_name: field_price
entity_type: node
type: integer
settings:
  unsigned: false
  size: normal
module: core
locked: false
cardinality: 1
translatable: true
indexes: {  }
persist_with_no_fields: false
custom_storage: false

Ngoài ra tôi đã tạo FieldFormatter và FieldWidget. (Tôi không chắc chắn nếu đúng.)

Những gì tôi phát hiện ra là mô-đun đang tạo ra trường Giá. Nếu tôi đi đến / admin / cấu trúc / loại / quản lý / bài viết / màn hình, tôi thấy giá của tôi ở đó, nhưng nó là dưới Disabled .

nhập mô tả hình ảnh ở đây

Tôi cảm thấy mình thật gần gũi, nhưng đồng thời cũng lạc lõng.

Tôi còn thiếu gì để làm cho lĩnh vực đó hoạt động?


Hook_entity_type_alter sẽ làm những gì bạn cần? Như tên của nó, cái móc này cho phép bạn thay đổi định nghĩa của một loại thực thể hiện có.
Kevin Nowachot

1
Nếu bạn tìm thấy một giải pháp cho mình xin vui lòng thêm nó trong một câu trả lời và đánh dấu nó được chấp nhận. Điều này sẽ giúp những người khác tìm ra giải pháp là tốt và để thấy rằng câu hỏi này đã được giải quyết đầy đủ. Vui lòng không kết hợp câu trả lời vào câu hỏi.
leymannx

Làm cho nó hoạt động bằng cách sử dụng tệp core.entity_form_display.node. <Modulename> .default.yml với nội dung sau:
user2594712

Câu trả lời:


7

Đối với người mới bắt đầu, tôi khuyên bạn nên sử dụng giao diện người dùng thuận tiện của Drupal ở phía sau. Tạo người dùng quản trị, đăng nhập, bắt đầu thêm các trường, thay đổi hiển thị, sắp xếp lại - tất cả được thực hiện bằng cách nhấp qua giao diện.

Ví dụ: bạn có thể thêm các trường tùy chỉnh vào loại nội dung Bài viết hiện có tại https://example.com/admin/structure/types/manage/article/fields . Có một nút Add fields. Nhấn vào đó và khám phá . Không có sự khác biệt trong việc thêm các trường vào một loại nội dung tích hợp.

Như những người khác đã nói trước YML là để xuất và nhập cấu hình, khi triển khai một trang web. Như bạn sẽ làm với tư cách là nhà phát triển nâng cao: Bạn có trang đó cục bộ trên máy tính của mình, thêm một số trường bằng cách nhấp qua back-end, xuất cấu hình của chúng, đẩy nó vào repo Git, sau đó trên trang trực tiếp của bạn, kéo từ kho lưu trữ của bạn, nhập các tệp cấu hình và nhận các trường tương tự ở đó mà không cần phải nhấp lại bất cứ thứ gì.


Thêm các trường từ một mô-đun tùy chỉnh có thể đạt được bằng cách cung cấp YML nhất định trong /config/installthư mục mô-đun của bạn . Cũng không có sự khác biệt giữa các loại nội dung tích hợp hoặc các loại nội dung tùy chỉnh. Nó được mô tả khá tốt trên DO tại https://www.drupal.org/docs/8/api/entity-api/programming-custom-fields-into-your-content-type . Ngoại trừ việc bạn sẽ phải thay đổi cách đặt tên và đặc biệt là thay đổi giá trị của bundle: car_brand(loại nội dung) mà bạn muốn các trường của mình được thêm vào.

Ngoài ra, bạn có thể cần phải cài đặt và gỡ cài đặt mô-đun này khá thường xuyên trong quá trình phát triển. Làm quen với drushcác lệnh, ví dụ drush dre module_nameđể thực hiện điều đó trong Terminal / Console (bạn cần phải cài đặt mô-đun Devel để sử dụng drush dre). Vì lợi ích của riêng bạn, tôi hy vọng bạn đã làm việc với HĐH dựa trên UNIX (Linux hoặc OSX). Có thể bạn luôn có sẵn một bản sao lưu cơ sở dữ liệu mới, bạn có thể nhập lại drush sql-cli < database.sqlkhi bạn muốn bắt đầu lại trong quá trình phát triển.


Chỉ để tham khảo tôi dán mã câu trả lời đã xóa ở đây OP ban đầu đã đặt câu hỏi của anh ấy. Để cuối cùng làm cho các trường có sẵn trong loại nội dung OP đã đưa ra điều này. Tôi đoán chắc rằng anh ta đã đặt nó vào *.installtập tin của mô-đun gọi hook_install()hoặc hook_update_N(). Có thể các chức năng không dùng nữa, nhưng tôi nghĩ bạn sẽ có ý tưởng.

$entity_type         = 'node';
$bundle              = 'article';
$field['field_name'] = 'field_price'; // your field id

entity_get_form_display($entity_type, $bundle, 'default')
  ->setComponent($field['field_name'], array())
  ->save();

entity_get_display($entity_type, $bundle, 'default')
  ->setComponent($field['field_name'], array())
  ->save();

1
cảm ơn leymannx, nhưng những gì tôi đang tìm kiếm là thực hiện điều đó mà không cần tương tác, chỉ cần cài đặt mô-đun của tôi, vì vậy thực sự tôi đang tìm cách lập trình để thực hiện điều đó trên mô-đun của mình. Là có một cách?
Manuel Rodriguez

@ManuelRodriguez Tất nhiên là có! Tôi sẽ mở rộng câu trả lời của tôi.
leymannx

cảm ơn rất nhiều @leymannx đó là tài liệu tôi đã theo dõi. Tôi đã tạo các tệp YML trên / config / install và thực tế trường được tạo, vấn đề là tôi không biết cách "mở rộng" chế độ xem và biểu mẫu hiển thị vì chúng không liên quan đến loại nút tùy chỉnh (tôi có thể tạo chúng) nếu không thì chúng phải được liên kết với các loại nút dựng sẵn và tôi không thể xác định lại các tệp đó (core.entity_form_display.node.article.default core.entity_view_display.node.article.default) vì chúng đã tồn tại trên lõi. BTW, cảm ơn vì tiền boa :)
Manuel Rodriguez

@ManuelRodriguez Cảm ơn bình luận của bạn. Điều đó làm cho câu hỏi rõ ràng hơn rất nhiều. Có lẽ bạn có thể bao gồm nhận xét cuối cùng vào câu hỏi của bạn.
leymannx

2
Để sử dụng drush dre, bạn cần cài đặt mô-đun Devel drupal.org/project/devel
Adrian Cid Almaguer

4

Các tệp YML cấu hình của Drupal chủ yếu dành cho nhập / xuất, để làm cho cấu hình có thể di động giữa các phiên bản của cùng một trang và để cho phép kiểm soát phiên bản. Chúng không thực sự được dự định là một công cụ phát triển và tôi sẽ không bao giờ khuyên bạn nên viết chúng bằng tay, ngay cả khi bạn là một nhà phát triển Drupal có kinh nghiệm.

Bất kể loại nút được xác định như thế nào, bạn sẽ có thể thêm các trường vào chúng thông qua giao diện người dùng quản trị viên. Tôi khuyên bạn nên làm theo cách đó và sử dụng hệ thống xuất cấu hình (trong giao diện người dùng quản trị hoặc sử dụng Drush trên dòng lệnh) để tạo cấu hình YML có chứa tất cả dữ liệu cần thiết.


1
Cảm ơn câu trả lời, nhưng trong trường hợp này tôi muốn mô-đun của mình khi cài đặt để có thể tạo các trường vào các nút, tôi không muốn người dùng tạo trường hoặc tự quản lý trường. Điều đó có thể không?
Manuel Rodriguez

Ah tôi thấy. Trong trường hợp đó tôi nghĩ rằng YML không đủ, bởi vì bạn cần một số logic để kiểm tra xem loại nút có tồn tại không, và trường thì không. Bạn có thể cần phải thực hiện hook_install trong mô-đun của mình và lập trình thêm trường vào nút. Đây là một bài viết mô tả cách thực hiện điều đó, nhưng tôi không thêm nó vào câu trả lời của mình vì tôi đã không kiểm tra nếu nó thực sự hoạt động.
marcvangend

3
Có các trường trong cấu hình xuất là tốt, không có gì sai với IMHO đó. Chúng có các phụ thuộc rõ ràng và sẽ không cho phép bạn cài đặt nếu loại nút đó không có ở đó. Nhưng bạn cũng cần thông tin hiển thị biểu mẫu / dạng xem và các thông tin được lưu trữ theo loại nút và chế độ xem / biểu mẫu, vì vậy bạn không thể chỉ cung cấp dưới dạng cấu hình, bạn cần thêm nó dưới dạng mã với hook_install (). Xem drupal.stackexchange.com/questions/222260/ Ví dụ.
Berdir

2

Làm cho nó hoạt động bằng cách sử dụng một core.entity_form_display.node.<modulename>.default.ymltệp có nội dung sau:

langcode: en
status: true
dependencies:
config:
  - field.field.node.modulename.body
  - node.type.modulename
module:
  - link
id: node.modulename.default
targetEntityType: node
bundle: modulename
mode: default
content:
  body:
    label: hidden
    type: string_textarea
    weight: 4
    settings:
      rows: 5
      placeholder: ''
    third_party_settings: {  }
    region: content
hidden:
  created: true
  path: true
  promote: true
  sticky: true
  uid: true
  body: true

1

Câu trả lời @leymannx còn thiếu là giải thích về những gì có thể (và nên) được gửi với một mô-đun tùy chỉnh và những gì không thể.

Lưu trữ trường có thể và nên được vận chuyển với mô-đun của bạn.

Trường hợp trường có thể được gửi cùng với mô-đun của bạn, nhưng chỉ vì optional, nó sẽ phụ thuộc vào các mô-đun khác cung cấp loại nội dung (trừ khi mô-đun của bạn cung cấp cả loại nội dung và trường trong trường hợp bạn chỉ có thể cung cấp config/install). Btw, bạn có thể lưu trữ các tệp này trong mô-đun này hoặc mô-đun khác - khi được bật, Drupal sẽ quét tất cả các thư config/optionalmục cho tất cả các mô-đun để lấy bất kỳ cấu hình liên quan nào. https://www.drupal.org/node/2453919

Hiển thị biểu mẫu thực thể không thể được vận chuyển với mô-đun của bạn. Hơn nữa, nếu mô-đun của bạn chỉ cung cấp một trường, hiển thị biểu mẫu thực thể vận chuyển cho toàn bộ thực thể sẽ ghi đè cấu hình hiện có. Thay vào đó, mô-đun của bạn phải bao gồm triển khai hook_install()nơi các trường sẽ được thay đổi để hiển thị biểu mẫu cho tất cả các loại nội dung được hỗ trợ.

Hiển thị chế độ xem thực thể phải được xử lý giống như hiển thị biểu mẫu thực thể.

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.