Puncte:2

Cum să returnezi un fișier XLS pentru a fi descărcat la trimiterea formularului

drapel je

Încerc să creez un fișier XLS și să-l trimit în browser printr-un formular, dar nu îmi dau seama cum să o fac. Folosesc modulul de serializare XLS, dar sunt deschis la toate celelalte sugestii.Cu acest modul am creat cu succes câteva vederi cu caracteristica XLS Export. Dar acum am un formular și fișierul excel ar trebui creat la trimiterea formularului în funcție de datele trimise.

Am creat următorul cod, dar dacă trimit formularul, nu primesc niciun fișier Excel de descărcat:

clasa MyForm extinde FormBase {
  private SerializerInterface $serializator;

  funcția publică statică create(ContainerInterface $container) {
    returnează static nou ($container->get('serializer'));
  }

  funcția publică __construct(SerializerInterface $serializer) {
    $this->serializator = $serializator;
  }

  // Am eliminat buildForm() etc pentru simplitate

  funcția publică submitForm(matrice &$form, FormStateInterface $form_state) {
    $răspuns = (nouă StreamedResponse(funcție () utilizare ($selected_values) {
      $this->serialize->serialize([[1, 2, 3], [4, 5, 6]], 'xlsx');
    }))->trimite();

    $form_state->setResponse($response);
  }
}
drapel 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
drapel je
înseamnă că atunci când trimit formularul, nu primesc un fișier excel de descărcat
Puncte:4
drapel in

În primul rând, aveți nevoie de un serializator pentru xls(x), pe care l-am folosit eu https://www.drupal.org/project/xls_serialization

Următorul exemplu de cod ar trebui să ofere ceea ce aveți nevoie:

funcția publică submitForm(matrice &$form, FormStateInterface $form_state) {
  $valori = $form_state->getValues();
  $filename = "random_file_" . rand() . „.xlsx”;

  $răspuns = new StreamedResponse(funcție () utilizare ($valori) {
    echo $this->serialize->serialize([[1, 2, 3], [4, 5, 6]], 'xlsx');
  });
  $response->headers->set('Content-Type', 'application/vnd.ms-excel');
  $response->headers->set('Content-Disposition', 'attachment; filename="' . $filename . '"');

  $form_state->setResponse($response);
}

Am încercat asta cu codificatorul XLS furnizat https://www.drupal.org/project/xls_serialization și a funcționat.

Noroc!

Referinte:

Елин Й. avatar
drapel je
Mulțumesc, am găsit o soluție funcțională. Dar cu o funcție de apel invers puțin diferită și mai simplă în StreamedResponse. Te deranjează dacă îți actualizez codul?
Stefanos Petrakis avatar
drapel in
Dacă este aceeași abordare, da, vă rugăm să faceți. În caz contrar, această întrebare are nevoie de un alt răspuns decât al meu. Curios in orice caz! Codul de apel invers pe care l-am scris acolo se bazează pe întrebarea dvs., poate că puteți actualiza întrebarea și apoi îmi pot actualiza răspunsul.
Елин Й. avatar
drapel je
Am actualizat codul cu cel care a funcționat pentru mine. Vă rugăm să verificați modificările mele: https://drupal.stackexchange.com/posts/308007/revisions Dacă doriți, puteți încă să reveniți la versiunea dvs. Mulțumiri.
Stefanos Petrakis avatar
drapel in
Deci, tot ce aveai nevoie era partea antetelor pentru ca codul tău să funcționeze, nu?
Елин Й. avatar
drapel je
Nu numai anteturile. De asemenea, am adăugat `echo` la apelul StreamedResponse și am eliminat metoda `send()` pe care am folosit-o la început.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.