Điểm:2

Cách trả lại tệp XLS để tải xuống khi gửi biểu mẫu

lá cờ je

Tôi đang cố gắng tạo tệp XLS và gửi tệp đó tới trình duyệt khi gửi biểu mẫu nhưng tôi không thể tìm ra cách thực hiện. Tôi đang sử dụng mô-đun Sê-ri hóa XLS nhưng tôi sẵn sàng đón nhận tất cả các đề xuất khác.Với mô-đun này, tôi đã tạo thành công một số chế độ xem với tính năng Xuất XLS. Nhưng bây giờ tôi có một biểu mẫu và tệp excel sẽ được tạo khi gửi biểu mẫu tùy thuộc vào dữ liệu đã gửi.

Tôi đã tạo đoạn mã sau nhưng nếu tôi gửi biểu mẫu, tôi không nhận được tệp excel nào để tải xuống:

lớp MyForm mở rộng FormBase {
  riêng SerializerInterface $serializer;

  tạo hàm tĩnh công khai (ContainerInterface $container) {
    trả lại tĩnh mới($container->get('serializer'));
  }

  hàm công khai __construct(SerializerInterface $serializer) {
    $this->serializer = $serializer;
  }

  // Đã xóa buildForm() vv để đơn giản

  hàm công khai submitForm(mảng &$form, FormStateInterface $form_state) {
    $response = (mới StreamedResponse(hàm () sử dụng ($sselected_values) {
      $this->serializer->serialize([[1, 2, 3], [4, 5, 6]], 'xlsx');
    }))->gửi();

    $form_state->setResponse($response);
  }
}
lá cờ fr
"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
lá cờ je
có nghĩa là khi tôi gửi biểu mẫu, tôi không nhận được tệp excel để tải xuống
Điểm:4
lá cờ in

Trước hết, bạn cần một bộ nối tiếp cho xls(x), tôi đã sử dụng https://www.drupal.org/project/xls_serialization

Mã ví dụ sau sẽ cung cấp những gì bạn cần:

hàm công khai submitForm(mảng &$form, FormStateInterface $form_state) {
  $values ​​= $form_state->getValues();
  $filename = "random_file_" . rand() . ".xlsx";

  $response = new StreamedResponse(function () use ($values) {
    echo $this->serializer->serialize([[1, 2, 3], [4, 5, 6]], 'xlsx');
  });
  $response->headers->set('Content-Type', 'application/vnd.ms-excel');
  $response->headers->set('Bố trí nội dung', 'file đính kèm; filename="' . $filename . '"');

  $form_state->setResponse($response);
}

Tôi đã thử điều đó với bộ mã hóa XLS được cung cấp https://www.drupal.org/project/xls_serialization va no đa hoạt động.

Chúc may mắn!

Người giới thiệu:

Елин Й. avatar
lá cờ je
Cảm ơn bạn, tôi đã tìm ra một giải pháp làm việc. Nhưng với chức năng gọi lại khác và đơn giản hơn một chút trong StreamedResponse. Bạn có phiền không nếu tôi cập nhật mã của bạn?
Stefanos Petrakis avatar
lá cờ in
Nếu đó là cách tiếp cận tương tự, vâng, xin vui lòng làm. Mặt khác, câu hỏi này cần một câu trả lời khác với câu hỏi của tôi. Tò mò trong mọi trường hợp! Mã gọi lại tôi đã viết trong đó dựa trên câu hỏi của bạn, có lẽ bạn có thể cập nhật câu hỏi và sau đó tôi có thể cập nhật câu trả lời của mình.
Елин Й. avatar
lá cờ je
Đã cập nhật mã với mã phù hợp với tôi. Vui lòng kiểm tra các thay đổi của tôi: https://drupal.stackexchange.com/posts/308007/revisions Nếu muốn, bạn vẫn có thể quay lại phiên bản của mình. Cảm ơn.
Stefanos Petrakis avatar
lá cờ in
Vì vậy, tất cả những gì bạn cần là phần tiêu đề để mã của bạn hoạt động, phải không?
Елин Й. avatar
lá cờ je
Không chỉ các tiêu đề. Tôi cũng đã thêm `echo` vào hàm gọi lại StreamedResponse và xóa phương thức `send()` mà tôi đã sử dụng lúc đầu.

Đă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.