Score:2

วิธีคืนไฟล์ XLS เพื่อดาวน์โหลดเมื่อส่งแบบฟอร์ม

ธง je

ฉันกำลังพยายามสร้างไฟล์ XLS และส่งไปยังเบราว์เซอร์ในการส่งแบบฟอร์ม แต่ฉันไม่สามารถหาวิธีที่จะทำได้ ฉันใช้โมดูล XLS Serialization แต่ฉันเปิดรับคำแนะนำอื่นๆ ทั้งหมดด้วยโมดูลนี้ ฉันสร้างบางมุมมองด้วยคุณลักษณะ XLS Export ได้สำเร็จ แต่ตอนนี้ฉันมีแบบฟอร์มและควรสร้างไฟล์ excel ในการส่งแบบฟอร์มโดยขึ้นอยู่กับข้อมูลที่ส่งมา

ฉันสร้างรหัสต่อไปนี้ แต่ถ้าฉันส่งแบบฟอร์ม ฉันจะไม่มีไฟล์ excel ให้ดาวน์โหลด:

คลาส MyForm ขยาย FormBase {
  SerializerInterface ส่วนตัว $serializer;

  สร้างฟังก์ชันคงที่สาธารณะ (ContainerInterface $container) {
    ส่งคืน new static($container->get('serializer'));
  }

  ฟังก์ชั่นสาธารณะ __construct (SerializerInterface $serializer) {
    $this->serializer = $ซีเรียลไลเซอร์;
  }

  // ลบ buildForm() ฯลฯ เพื่อความเรียบง่าย

  ฟังก์ชันสาธารณะ submitForm (อาร์เรย์ &$form, FormStateInterface $form_state) {
    $response = (StreamedResponse ใหม่ (ฟังก์ชัน () ใช้ ($selected_values) {
      $this->serializer->serialize([[1, 2, 3], [4, 5, 6]], 'xlsx');
    }))->ส่ง();

    $form_state->setResponse($ตอบกลับ);
  }
}
fr flag
"didn't work" ? Not sure what that means exactly ... The only weird thing I can see is the ->send(), but you left out some code and you don't say what the error or problem is.
Елин Й. avatar
je flag
หมายความว่าเมื่อฉันส่งแบบฟอร์ม ฉันไม่ได้รับไฟล์ excel ให้ดาวน์โหลด
Score:4
ธง in

ก่อนอื่น คุณต้องมีซีเรียลไลเซอร์สำหรับ xls(x) ที่ฉันเคยใช้ https://www.drupal.org/project/xls_serialization

โค้ดตัวอย่างต่อไปนี้ควรส่งมอบสิ่งที่คุณต้องการ:

ฟังก์ชันสาธารณะ submitForm (อาร์เรย์ &$form, FormStateInterface $form_state) {
  $values ​​= $form_state->getValues();
  $ชื่อไฟล์ = "random_file_" แรนด์() . ".xlsx";

  $response = StreamedResponse ใหม่ (ฟังก์ชัน () ใช้ (ค่า $) {
    echo $this->serializer->serialize([[1, 2, 3], [4, 5, 6]], 'xlsx');
  });
  $response->headers->set('ประเภทเนื้อหา', 'application/vnd.ms-excel');
  $response->headers->set('Content-Disposition', 'attachment; filename="' . $filename . '"');

  $form_state->setResponse($ตอบกลับ);
}

ฉันลองด้วยตัวเข้ารหัส XLS ที่ให้มา https://www.drupal.org/project/xls_serialization และมันก็ได้ผล

ขอให้โชคดี!

อ้างอิง:

Елин Й. avatar
je flag
ขอบคุณ ฉันหาทางออกที่ใช้งานได้ แต่ด้วยฟังก์ชันการโทรกลับที่แตกต่างออกไปเล็กน้อยใน StreamedResponse คุณจะรังเกียจไหมถ้าฉันจะอัปเดตรหัสของคุณ
Stefanos Petrakis avatar
in flag
ถ้าเป็นแนวทางเดียวกันได้โปรดทำ มิฉะนั้น คำถามนี้ต้องการคำตอบที่แตกต่างจากของฉัน ขี้สงสัยทุกกรณี! รหัสโทรกลับที่ฉันเขียนไว้นั้นอ้างอิงจากคำถามของคุณ บางทีคุณสามารถอัปเดตคำถาม จากนั้นฉันจึงสามารถอัปเดตคำตอบได้
Елин Й. avatar
je flag
อัปเดตรหัสด้วยรหัสที่เหมาะกับฉัน โปรดตรวจสอบการเปลี่ยนแปลงของฉัน: https://drupal.stackexchange.com/posts/308007/revisions หากคุณต้องการ คุณยังสามารถย้อนกลับเป็นเวอร์ชันของคุณได้ ขอบคุณ.
Stefanos Petrakis avatar
in flag
ดังนั้น สิ่งที่คุณต้องการก็แค่ส่วนของส่วนหัวเพื่อให้โค้ดของคุณทำงานใช่ไหม
Елин Й. avatar
je flag
ไม่ใช่แค่ส่วนหัวเท่านั้น ฉันยังได้เพิ่ม `echo` ในการเรียกกลับของ StreamedResponse และลบเมธอด `send()` ที่ฉันใช้ในตอนแรก

โพสต์คำตอบ

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