Score:3

วิธีสร้างเอนทิตีเนื้อหาที่กำหนดเองโดยไม่มี URL ที่เป็นที่ยอมรับ

ธง ru

ฉันได้สร้างเอนทิตีเนื้อหาแบบกำหนดเองด้วย drush สร้างโมดูลเนื้อหาเอนทิตีซึ่งใช้งานได้ดี อย่างไรก็ตาม ฉันต้องการให้เอนทิตีที่กำหนดเองของฉันไม่มี URL แบบบัญญัติ Drush จะสร้างสิ่งเหล่านั้นในคำอธิบายประกอบของคลาสเอนทิตีโดยอัตโนมัติ:

/**
 * กำหนดคลาสเอนทิตีก้อน
 *
 * @ContentEntityType(
 * id = "ก้อน",
 * ...
 * ลิงก์ = {
 * "แบบฟอร์มเพิ่มเติม" = "/admin/content/chunk/add/{chunk_type}",
 * "เพิ่มหน้า" = "/admin/content/chunk/add",
 * "canonical" = "/chunk/{chunk}",
 * "แก้ไขแบบฟอร์ม" = "/admin/content/chunk/{chunk}/edit",
 * "แบบฟอร์มการลบ" = "/admin/content/chunk/{chunk}/delete",
 * "collection" = "/admin/content/chunk"
 * },
 * ...
 * )
 */

ฉันพยายามลบรายการบัญญัติออกจากคำอธิบายประกอบ แต่สิ่งนี้ส่งผลให้เกิดข้อผิดพลาดมากมายทั้งซ้ายและขวา เนื่องจากโมดูลหลักและส่วนร่วมจำนวนมากถือว่า URL แบบบัญญัติมีอยู่จริงเสมอ ในกรณีของฉันข้อผิดพลาดส่วนใหญ่มาจากโมดูลอื่นที่เรียกฟังก์ชันที่ลงท้ายด้วย EntityBase::toUrlซึ่งล้มเหลวด้วย WSOD เนื่องจากไม่มีรายการบัญญัติ

แม้ว่าจะดูเหมือนเป็นข้อบังคับ (@see EntityTypeInterface), อื่น ๆ - เช่น โมดูลย่อหน้า - สามารถจัดการเพื่อลบลิงก์มาตรฐานได้โดยไม่ทำให้เกิดข้อผิดพลาดทุกที่

ใครช่วยแนะนำวิธีหน่อยค่ะ ได้อย่างปลอดภัย ลบลิงก์บัญญัติออกจากเอนทิตีเนื้อหาที่กำหนดเองของฉันหรือไม่ ฉันไม่ต้องการเปลี่ยนลิงก์ตามรูปแบบมาตรฐานเป็น 403 หรือ 404 ฉันไม่ต้องการให้ลิงก์เหล่านั้นแสดงผลเลย (ซ่อนแท็บหลัก "ดู" ป้องกันลิงก์เมื่อแสดงป้ายกำกับเอนทิตี ฯลฯ)

Jaypan avatar
de flag
ฉันไม่รู้ว่าคุณได้รับข้อผิดพลาดอะไร แต่ฉันได้สร้างเอนทิตีหลายรายการโดยไม่มีลิงก์ตามรูปแบบบัญญัติ ฉันยังมีเอนทิตีที่ไม่มีการกำหนดลิงก์เลย พวกมันถูกใช้ในโค้ดเท่านั้น ไม่ใช่ในส่วนหน้า
4uk4 avatar
cn flag
"*โมดูลหลักและส่วนร่วมจำนวนมากถือว่ามี Canonical URL อยู่เสมอ*" - ใช่และไม่ใช่ เพราะ [โครงร่างเอนทิตี](https://www.drupal.org/docs/8/api/entity-api /creating-a-custom-content-entity#s-entity-skeleton) ใช้งานได้ ใช่ เนื่องจากตัวจัดการเอนทิตีมาตรฐานถือว่าคุณสมบัติบางอย่างในคำจำกัดความของเอนทิตี วิธีแก้ไข: คุณต้องมีตัวจัดการของคุณเอง
ru flag
ในกรณีของฉันดูเหมือนว่าส่วนใหญ่มาจาก `EntityBase::toLink / ::toUrl` ซึ่งเรียกโดยโมดูลอื่นและล้มเหลวด้วย WSOD เมื่อลบรายการบัญญัติออกจากคำอธิบายประกอบ
4uk4 avatar
cn flag
การใช้วิธีการเหล่านี้กับย่อหน้าส่งผลให้: *ไม่พบเทมเพลตลิงก์ 'canonical' สำหรับประเภทเอนทิตี 'ย่อหน้า'*
Score:0
ธง ru

จริงๆแล้วมันง่ายมาก ยกเว้นการลบการอ้างอิงถึงบัญญัติทั้งหมดออกจากรหัสสำเร็จรูป ฉันแค่ต้องการแทนที่ฟังก์ชันเดียว ถึงUrl ในคลาสเอนทิตีที่กำหนดเองของฉัน:

src/Entity/MyContentEntity.php

/**
 * กำหนดคลาสเอนทิตีก้อน
 * สังเกตรายการ "links = { canonical }" ที่ขาดหายไปในคำอธิบายประกอบ
 *
 *
 * @ContentEntityType(
 * id = "ก้อน",
 * ...
 * ลิงก์ = {
 * "แบบฟอร์มเพิ่มเติม" = "/admin/content/chunk/add/{chunk_type}",
 * "เพิ่มหน้า" = "/admin/content/chunk/add",
 * "แก้ไขแบบฟอร์ม" = "/admin/content/chunk/{chunk}/edit",
 * "แบบฟอร์มการลบ" = "/admin/content/chunk/{chunk}/delete",
 * "collection" = "/admin/content/chunk"
 * },
 * ...
 * )
 */
Class Chunk ขยาย ContentEntityBase ใช้ ChunkInterface {
  /**
   * สิ่งนี้จะป้องกัน WSOD เมื่อโมดูลบุคคลที่สามเรียก $entity->toUrl
   */
  ฟังก์ชันสาธารณะ toUrl($rel = 'canonical', array $options = []) {
    ถ้า ($ rel == 'บัญญัติ') {
      ส่งคืน Url::fromUri('เส้นทาง:<nolink>')->setOptions($options);
    }
    อื่น {
      ส่งคืนพาเรนต์::toUrl($rel, $options);
    }
  }
}

สิ่งอื่นๆ ที่นี่จำเป็นต่อเมื่อเอนทิตีอิงตามรหัสสำเร็จรูปที่สร้างขึ้นโดยอัตโนมัติจาก drush สร้าง หรือที่คล้ายกัน:

src/Form/MyContentEntityForm.php

/**
 * การเปลี่ยนแปลงต่อไปนี้จำเป็นต่อเมื่อคุณใช้รหัสสำเร็จรูปจาก "drush create" หรือที่คล้ายกัน
 */
คลาส ChunkForm ขยาย ContentEntityForm {
  บันทึกฟังก์ชั่นสาธารณะ (อาร์เรย์ $form, FormStateInterface $form_state) {
    ...
    // เปลี่ยนบรรทัดต่อไปนี้
    //$form_state->setRedirect('entity.chunk.canonical', ['chunk' => $entity->id()]);
    // ไปที่สิ่งที่คุณเลือก
    $form_state->setRedirect('entity.chunk.edit-form', ['chunk' => $entity->id()]);
  }

}

my_module.links.task.yml:

# หากมีอยู่ ให้ลบโค้ดสำเร็จรูปต่อไปนี้ออกจาก "drush create" หรือที่คล้ายกัน

entity.chunk.view:
  หัวเรื่อง : ดู
  route_name: entity.chunk.canonical
  base_route: entity.chunk.canonical
wranvaud avatar
us flag
ข้อผิดพลาด: ไม่พบคลาส 'Drupal\my_content_entity\Entity\Url'

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา