За последние 24 часа нас посетили 23708 программистов и 1693 робота. Сейчас ищут 1546 программистов ...

Получить ответ, когда вызываемый скрипт отработал

Тема в разделе "PHP для новичков", создана пользователем l_2001, 23 сен 2024.

  1. l_2001

    l_2001 Активный пользователь

    С нами с:
    9 дек 2014
    Сообщения:
    77
    Симпатии:
    2
    здравствуйте! есть два скрипта... в первом форма отправки, во втором формирование на основе данных формы xls файла... хотелось бы если второй скрипт сформировал файл (или не сформировал, не суть) передал в первый ответ и по ответу сделать релоад страницы... в первом просто есть кнопка загрузки файла, а когда файл загружен, то появляется кнопка "сформировать файл" и по клику по ней данные улетают во второй скрипт... хочу, чтобы после получения файла страница возвращалась в исходное состояние, без кнопки "сформировать файл"! файл xls формируется библиотекой PHPExcel... весь скрипт не привожу, он достаточно стандартный... отправка во второй тоже обычная
    Код (Text):
    1. <form METHOD="POST" ACTION="GetInXls.php" />
    2. <input type="hidden" name="variable" value='.$new_file_tmp.'>
    3. <input class="left-indent" style="width: 160px; background-color: limegreen" type="submit" value="Сформировать файл">
    4. </form>
    может просто укажете мне нужное направление, бо гугл что-то мне ничего дельного не выдаёт...
    заранее спасибо!
     
  2. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    355
    Симпатии:
    67
    Адрес:
    Бавария, Германия
    Добрый день!
    Попробуйте сделать так
    PHP:
    1. <?
    2. if(isset($_POST["variable"]))
    3. {
    4.     /*
    5.       Здесь файл xls формируется библиотекой PHPExcel
    6.       В случае успеха $xlsOK = true, иначе $xlsOK = false;
    7.     */
    8.     $xlsOK = true;
    9.     //$xlsOK = false;
    10.     if($xlsOK)
    11.         $res["status"] = 1;
    12.     else
    13.         $res["status"] = 0;
    14.     header('Content-Type: application/json; charset=utf-8');
    15.     echo json_encode($res);
    16.     exit;
    17. }
    18.  
    19. $new_file_tmp = "my_file.tmp";
    20. echo <<<HTML
    21. <html>
    22. <head>
    23. <style>
    24. .left-inden{
    25.     width: 160px;
    26.     background-color: limegreen
    27. }
    28. </style
    29. </head>
    30. <body>
    31. <form method="POST">
    32. <input type="hidden" name="variable" value="$new_file_tmp">
    33. <input id="go" class="left-indent" type="submit" value="Сформировать файл">
    34. </form>
    35. <div id="st"></div>
    36. </html>
    37. <script>
    38. form = document.querySelector("form");
    39. st = document.getElementById("st");
    40. go = document.getElementById("go");
    41. form.onsubmit = (event) => {
    42. event.preventDefault();
    43. fd = new FormData(form);
    44. fetch("?", {
    45.     method: "POST",
    46.     body: fd
    47.   })
    48. .then(response => response.json())
    49. .then((data) => {
    50.     if(data["status"] == 1)
    51.     {
    52.         //В случае успеха переход на другую страницу
    53.         //window.location.replace(".....");
    54.         // или
    55.         //В случае успеха кнопкa "Сформировать файл" удаляется
    56.         go.style.display="none";
    57.     }
    58.     else
    59.     {
    60.         st.innerHTML = "Файл xls не сформирован!"
    61.     }
    62.   })
    63. }
    64. </script>
    65. HTML;
    Удачи!
     
    #2 Vladimir Kheifets, 24 сен 2024
    Последнее редактирование: 24 сен 2024
  3. l_2001

    l_2001 Активный пользователь

    С нами с:
    9 дек 2014
    Сообщения:
    77
    Симпатии:
    2
    спасибо! идея в принципе понятна, но моих знаний в вэб разработках оставляет желать лучшего, не моя специфика... у меня файл не сохраняется локально, а отдаётся на растерзание юзеру (открыть/сохранить)
    Код (Text):
    1. if (isset($_POST['variable'])) {
    2. // тут тело обработчика
    3. // тут отдаём пользователю в браузер
    4. header("Content-Type:application/vnd.ms-excel");
    5.     header("Content-Disposition:attachment;filename=PanAccount.xls");
    6.     header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
    7.     header("Cache-Control: post-check=0, pre-check=0", false);
    8.     header("Pragma: no-cache");
    9.     $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
    10.     $objWriter->save('php://output');
    11.     exit();
    12. }
    соответственно в json влетает всё тело обработчика... вопрос - куда поместить echo json_encode() чтобы потом пользоваться его выводом?
     
  4. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    355
    Симпатии:
    67
    Адрес:
    Бавария, Германия
    Два различных Content-Type application/vnd.ms-excel и json у одного документа быть не может.
    Попробуйте не отпралять документ в браузер а сохранять его в файл на сервере.
    В json передайте имя файла, а из js в случае успеха открывайте в новом окне просмоторщик Excel.
     
    #4 Vladimir Kheifets, 24 сен 2024
    Последнее редактирование: 24 сен 2024
  5. l_2001

    l_2001 Активный пользователь

    С нами с:
    9 дек 2014
    Сообщения:
    77
    Симпатии:
    2
    да, я понял, что контент типы разные, но у меня есть ограничения от админа сервера - файлы на нём не сохранять... к тому-же, если я даже добьюсь от админа взаимности, то потребуется ещё прикручивать в обязательном порядке удаление файла, т.к. задачка многопользовательская и каждому юзеру нужен на свой запрос свой файл, а лезть одновременно может и два, и три человека... в общем - я Вам очень благодарен за помощь!
     
  6. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    355
    Симпатии:
    67
    Адрес:
    Бавария, Германия
    Гипотеза. Если нельзя сохранить на сервере, то можно отправлять и обрабатывать на стороне клиент контент в text-response
    PHP:
    1. <?
    2. if (isset($_POST['variable']))
    3. {
    4.     // тут тело обработчика
    5.     // тут отдаём пользователю в браузер
    6.     header("Content-Type:application/vnd.ms-excel");
    7.     header("Content-Disposition:attachment;filename=PanAccount.xls");
    8.     header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
    9.     header("Cache-Control: post-check=0, pre-check=0", false);
    10.     header("Pragma: no-cache");
    11.     $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
    12.     $objWriter->save('php://output');
    13.     exit;
    14. }
    15.  
    16. $new_file_tmp = "my_file.tmp";
    17. echo <<<HTML
    18. <html>
    19. <head>
    20. <style>
    21. .left-inden{
    22.     width: 160px;
    23.     background-color: limegreen
    24. }
    25. </style
    26. </head>
    27. <body>
    28. <form method="POST">
    29. <input type="hidden" name="variable" value="$new_file_tmp">
    30. <input id="go" class="left-indent" type="submit" value="Сформировать файл">
    31. </form>
    32. <div id="st"></div>
    33. </html>
    34. <script>
    35. form = document.querySelector("form");
    36. st = document.getElementById("st");
    37. go = document.getElementById("go");
    38. form.onsubmit = (event) => {
    39. event.preventDefault();
    40. fd = new FormData(form);
    41. fetch("?", {
    42.     method: "POST",
    43.     body: fd
    44.   })
    45. .then((response) => response.text())
    46.   .then((text) => {
    47.     console.log(text);
    48.    })
    49.   .catch((error) => {
    50.     console.log(`Error: ${error.message}`);
    51.   });
    52. }
    53. </script>..
    54. HTML;
    посмотрите, что выводится консоле.
    А я ещё м.б. что-то придумаю. Удачи!
     
  7. l_2001

    l_2001 Активный пользователь

    С нами с:
    9 дек 2014
    Сообщения:
    77
    Симпатии:
    2
    интересная мысль! но я уже "ушёл" с работы... а завтра (если оно наступит) я попробую проверить Вашу гипотезу! навскидку - может и будет работать! это очень любопытно! спасибо!
     
  8. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    355
    Симпатии:
    67
    Адрес:
    Бавария, Германия
    Добрый день!
    Как вчера обещал, посылаю дополнения
    1. Как просто создать и экспотировать Excel-документ из JS
    HTML:
    1. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    2. <title>Export table to Excel</title>
    3. body {
    4.     font-size: 12pt;
    5.     font-family: Calibri;
    6.     padding : 10px;
    7. }
    8. table {
    9.     border: 1px solid black;
    10. }
    11. th {
    12.     border: 1px solid black;
    13.     padding: 5px;
    14.     background-color:grey;
    15.     color: white;
    16. }
    17. td {
    18.     border: 1px solid black;
    19.     padding: 5px;
    20. }
    21. input {
    22.     font-size: 12pt;
    23.     font-family: Calibri;
    24. }
    25.  
    26. </head>
    27.  
    28.  
    29. <br/>
    30. <br/>
    31. <div id="dvData">
    32.     <table>
    33.         <tr>
    34.             <th>Name</th>
    35.             <th>Date</th>
    36.             <th>Place</th>
    37.         </tr>
    38.         <tr>
    39.             <td>row1 Col1</td>
    40.             <td>row1 Col2</td>
    41.             <td>row1 Col3</td>
    42.         </tr>
    43.         <tr>
    44.             <td>row2 Col1</td>
    45.             <td>row2 Col2</td>
    46.             <td>row2 Col3</td>
    47.         </tr>
    48.         <tr>
    49.             <td>row3 Col1</td>
    50.             <td>row3 Col2</td>
    51.             <td>row3 Col3</a>
    52.             </td>
    53.         </tr>
    54.     </table>
    55. </div>
    56. </body>
    57.  
    58. dvData = document.getElementById("dvData");
    59. function saveFile(url, filename) {
    60.   const a = document.createElement("a");
    61.   a.href = url;
    62.   a.download = filename || "file-name";
    63.   document.body.appendChild(a);
    64.   a.click();
    65.   document.body.removeChild(a);
    66. }
    67.  
    68. file = new Blob(
    69.     [dvData.innerHTML],
    70.     {type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,"}
    71. );
    72. const url = window.URL.createObjectURL(file);
    73. saveFile(url, "myFile.xls");
    74. window.URL.revokeObjectURL(url);
    75. </html>
    2. Эту затею можно попытаться применить в Вашем случае(информация к размышлению, не проверено)
    PHP:
    1. <?
    2. if (isset($_POST['variable']))
    3. {
    4.     // тут тело обработчика
    5.     // тут отдаём пользователю в браузер
    6.     header("Content-Type:application/vnd.ms-excel");
    7.     header("Content-Disposition:attachment;filename=PanAccount.xls");
    8.     header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
    9.     header("Cache-Control: post-check=0, pre-check=0", false);
    10.     header("Pragma: no-cache");
    11.     $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
    12.     $objWriter->save('php://output');
    13.     exit;
    14. }
    15.  
    16. $new_file_tmp = "my_file.tmp";
    17. echo <<<HTML
    18. <html>
    19. <head>
    20. <style>
    21. .left-inden{
    22.     width: 160px;
    23.     background-color: limegreen
    24. }
    25. </style
    26. </head>
    27. <body>
    28. <form method="POST">
    29. <input type="hidden" name="variable" value="$new_file_tmp">
    30. <input id="go" class="left-indent" type="submit" value="Сформировать файл">
    31. </form>
    32. <div id="st"></div>
    33. </html>
    34. <script>
    35. form = document.querySelector("form");
    36. st = document.getElementById("st");
    37. go = document.getElementById("go");
    38.  
    39. function saveFile(url, filename) {
    40.   const a = document.createElement("a");
    41.   a.href = url;
    42.   a.download = filename || "file-name";
    43.   document.body.appendChild(a);
    44.   a.click();
    45.   document.body.removeChild(a);
    46. }
    47.  
    48. form.onsubmit = (event) => {
    49. event.preventDefault();
    50. fd = new FormData(form);
    51. fetch("?", {
    52.     method: "POST",
    53.     body: fd
    54.   })
    55.     .then((response) => response.text())
    56.     .then((text) => {
    57.     console.log(text);
    58.     //--- Export response to Excel ---------------------
    59.  
    60.     file = new Blob(
    61.         [text],
    62.         {type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,"}
    63.     );
    64.     const url = window.URL.createObjectURL(file);
    65.     saveFile(url, "myFile.xls");
    66.     window.URL.revokeObjectURL(url);
    67.  
    68.     //-----------------------------------------------
    69.     go.style.display="none";
    70.  
    71.    })
    72.     .catch((error) => {
    73.     console.log(`Error: ${error.message}`);
    74.   });
    75. }
    76. </script>
    77. HTML;
    Удачи!
     
  9. l_2001

    l_2001 Активный пользователь

    С нами с:
    9 дек 2014
    Сообщения:
    77
    Симпатии:
    2
    здравствуйте! а вот этот вариант отлично сработал! осталось его к прикрутить к уже существующему... красота!!! большое Вам спасибо, Вы меня уже не раз выручали :)!
    всего Вам доброго!