Điểm:3

Làm cách nào để tạo thực thể nội dung tùy chỉnh không có url chuẩn?

lá cờ ru

Tôi đã tạo một thực thể nội dung tùy chỉnh với drush tạo mô-đun-nội dung-thực thể, hoạt động tuyệt vời. Tuy nhiên, tôi muốn các thực thể tùy chỉnh của mình KHÔNG có url chuẩn. Drush tự động tạo những thứ đó trong chú thích của lớp thực thể:

/**
 * Định nghĩa lớp thực thể chunk.
 *
 * @ContentEntityType(
 * id = "khối",
 *...
 * liên kết = {
 * "add-form" = "/admin/content/chunk/add/{chunk_type}",
 * "add-page" = "/admin/content/chunk/add",
 * "chuẩn" = "/chunk/{chunk}",
 * "biểu mẫu chỉnh sửa" = "/admin/content/chunk/{chunk}/chỉnh sửa",
 * "delete-form" = "/admin/content/chunk/{chunk}/delete",
 * "bộ sưu tập" = "/admin/content/chunk"
 * },
 *...
 * )
 */

Tôi đã cố gắng xóa mục chính tắc khỏi chú thích, nhưng điều này dẫn đến nhiều lỗi trái và phải, bởi vì rất nhiều mô-đun cốt lõi và đóng góp cho rằng các URL chính tắc luôn tồn tại. Trong trường hợp của tôi, hầu hết các lỗi đó đến từ các chức năng gọi mô-đun khác kết thúc bằng EntityBase::toUrl, không thành công với WSOD do thiếu mục chính tắc.

Mặc dù điều này có vẻ là bắt buộc (@xem EntityTypeInterface), một số khác - ví dụ: Mô-đun đoạn văn - bằng cách nào đó quản lý để xóa liên kết chính tắc mà không gây ra lỗi ở mọi nơi.

Ai có thể cho tôi một số gợi ý làm thế nào để an toàn xóa liên kết chính tắc khỏi thực thể nội dung tùy chỉnh của tôi? Tôi không muốn biến các liên kết chính tắc thành 403 hoặc 404, tôi muốn những liên kết đó không bao giờ được hiển thị (ẩn tab chính "Xem", ngăn liên kết khi hiển thị nhãn thực thể, v.v.).

Jaypan avatar
lá cờ de
Tôi không biết bạn đang gặp lỗi gì nhưng tôi đã tạo nhiều thực thể không có liên kết chính tắc. Tôi thậm chí có các thực thể không có liên kết nào được xác định. Chúng chỉ được sử dụng trong mã chứ không phải ở giao diện người dùng.
4uk4 avatar
lá cờ cn
"*rất nhiều mô-đun lõi và đóng góp giả định rằng các URL chính tắc luôn tồn tại*" - Có và không, Không, bởi vì [bộ xương thực thể] này(https://www.drupal.org/docs/8/api/entity-api /creating-a-custom-content-entity#s-entity-skeleton) hoạt động. Có, bởi vì trình xử lý thực thể tiêu chuẩn đảm nhận các thuộc tính nhất định trong định nghĩa thực thể. Giải pháp: Bạn cần có người xử lý của riêng mình.
lá cờ ru
Trong trường hợp của tôi, hầu hết dường như bắt nguồn từ `EntityBase::toLink / ::toUrl`, được gọi bởi các mô-đun khác và không thành công với WSOD khi xóa mục chính tắc khỏi chú thích
4uk4 avatar
lá cờ cn
Sử dụng các phương pháp này với một đoạn dẫn đến: *Không tìm thấy mẫu liên kết 'chuẩn' cho loại thực thể 'đoạn'*
Điểm:0
lá cờ ru

Nó thực sự rất dễ dàng, ngoại trừ việc xóa tất cả các tham chiếu đến chuẩn từ mã soạn sẵn, tôi chỉ cần ghi đè lên một chức năng duy nhất toUrl trong lớp thực thể tùy chỉnh của tôi:

src/Entity/MyContentEntity.php

/**
 * Định nghĩa lớp thực thể chunk.
 * Lưu ý mục "links = { canonical }" bị thiếu trong chú thích
 *
 *
 * @ContentEntityType(
 * id = "khối",
 *...
 * liên kết = {
 * "add-form" = "/admin/content/chunk/add/{chunk_type}",
 * "add-page" = "/admin/content/chunk/add",
 * "biểu mẫu chỉnh sửa" = "/admin/content/chunk/{chunk}/chỉnh sửa",
 * "delete-form" = "/admin/content/chunk/{chunk}/delete",
 * "bộ sưu tập" = "/admin/content/chunk"
 * },
 *...
 * )
 */
lớp Chunk mở rộng ContentEntityBase thực hiện ChunkInterface {
  /**
   * điều này ngăn WSOD khi các mô-đun bên thứ 3 gọi $entity->toUrl
   */
  public function toUrl($rel = 'canonical', array $options = []) {
    if ($rel == 'chuẩn') {
      trả về Url::fromUri('route:<nolink>')->setOptions($options);
    }
    khác {
      trả về cha mẹ::toUrl($rel, $options);
    }
  }
}

Những nội dung khác ở đây chỉ cần thiết nếu thực thể dựa trên mã soạn sẵn được tạo tự động từ drush tạo ra hoặc tương tự:

src/Form/MyContentEntityForm.php

/**
 * Thay đổi sau đây chỉ cần thiết nếu bạn sử dụng mã soạn sẵn từ "drush generate" hoặc tương tự
 */
lớp ChunkForm mở rộng ContentEntityForm {
  lưu chức năng công cộng (mảng $form, FormStateInterface $form_state) {
    ...
    // thay đổi dòng sau
    //$form_state->setRedirect('entity.chunk.canonical', ['chunk' => $entity->id()]);
    // đến một cái gì đó của sự lựa chọn của bạn
    $form_state->setRedirect('entity.chunk.edit-form', ['chunk' => $entity->id()]);
  }

}

my_module.links.task.yml:

# Nếu có, hãy xóa mã soạn sẵn sau khỏi "drush generate" hoặc tương tự

thực thể.chunk.view:
  tiêu đề: Xem
  route_name: entity.chunk.canonical
  cơ sở_route: thực thể.chunk.canonical
wranvaud avatar
lá cờ us
Lỗi: Không tìm thấy lớp 'Drupal\my_content_entity\Entity\Url'

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.