Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Нужна помощь в создании скрипта для создания графиков дежурств [2]

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (3): « 1 [2] 3 »   

> Описание: На одной странице вывести несколько блоков с бригадами
Vladimir Kheifets
Отправлено: 20 Января, 2022 - 06:34:11
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


Помог: 37 раз(а)




Ruskat пишет:
Спасибо большое. Освоил.
А в чём может быть дело, что применил такой метод дублирования строк, но фамилии раскрываются только в первой строке? В остальных только должности.

Я показал Вам полностью рабочий код. Вместе с тем, что Вы применяли работать не будет.
Обратите внимание на то, что нельзя изменять id в тэгах селект.
Если очень нужно, то изменяйте также и селекторы в CSS и JS.
Общее правило.
Если в динамическом коде с JS что-то не работает, смотрите сообщения об ошибках в консоле браузера.
Удачи!
p.s. В Вашем коде каждый тэг селект "обёрнут" в три тэга див. Не надо так делать.
 
 Top
Ruskat
Отправлено: 21 Января, 2022 - 02:13:01
Post Id



Гость


Покинул форум
Сообщений всего: 70
Дата рег-ции: Март 2008  


Помог: 0 раз(а)




Vladimir Kheifets пишет:

p.s. В Вашем коде каждый тэг селект "обёрнут" в три тэга див. Не надо так делать.

Спасибо. А как лучше сформированных в такой форме работников отпралять в базу, чтобы потом они отобразились на странице просмотра графика?
В одну ячейку в виде Json, как я полагаю?
 
 Top
Vladimir Kheifets
Отправлено: 21 Января, 2022 - 18:42:46
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


Помог: 37 раз(а)




Ruskat пишет:

А как лучше сформированных в такой форме работников отпралять в базу, чтобы потом они отобразились на странице просмотра графика?
В одну ячейку в виде Json, как я полагаю?

Верно, данные писать в виде Json и тип данных sql поля, для сохранения данных "json".
Остальное улеглось?
 
 Top
Ruskat
Отправлено: 23 Января, 2022 - 11:08:58
Post Id



Гость


Покинул форум
Сообщений всего: 70
Дата рег-ции: Март 2008  


Помог: 0 раз(а)




Vladimir Kheifets пишет:
Ruskat пишет:

А как лучше сформированных в такой форме работников отпралять в базу, чтобы потом они отобразились на странице просмотра графика?
В одну ячейку в виде Json, как я полагаю?

Верно, данные писать в виде Json и тип данных sql поля, для сохранения данных "json".
Остальное улеглось?

Стараюсь улаживать. Просто пока больше над бэком работаю. Потихоньку, для снятия напряжения, фронт начал мастырить под соответствие адресной навигации.
Касательно вашей формы есть непонимание:
в цикле
CODE (javascript):
скопировать код в буфер обмена
  1.  
  2.         for(i in optObj)
  3.         {
  4.                 opt = document.createElement('option');
  5.                 opt.innerHTML = optObj[i];
  6.                 -->opt.value = optObj[i];
  7.                 select2.appendChild(opt);
  8.         }
  9.  

Догадался добавить optionу параметр value, чтобы что-то отправить, а не просто увидеть. Всё, что я могу отправить, это данные из optObj[i] - то есть Ф.И.О. А задумал отправлять именно ID работника, который хоть и приходит в список json, но я его так и не нашел ни в какой переменной.

(Отредактировано автором: 23 Января, 2022 - 11:09:30)

 
 Top
Vladimir Kheifets
Отправлено: 23 Января, 2022 - 13:42:32
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


Помог: 37 раз(а)




Ruskat пишет:
Касательно вашей формы есть непонимание:
в цикле
CODE (javascript):
скопировать код в буфер обмена
  1.  
  2.         for(i in optObj)
  3.         {
  4.                 opt = document.createElement('option');
  5.                 opt.innerHTML = optObj[i];
  6.                 -->opt.value = optObj[i];
  7.                 select2.appendChild(opt);
  8.         }
  9.  


Догадался добавить optionу параметр value, чтобы что-то отправить, а не просто увидеть. Всё, что я могу отправить, это данные из optObj[i] - то есть Ф.И.О. А задумал отправлять именно ID работника, который хоть и приходит в список json, но я его так и не нашел ни в какой переменной.


Добрый день!
ID работника было в переменной i. Чтобы было понятнее заменил i на ID:
CODE (javascript):
скопировать код в буфер обмена
  1.  
  2.         for(ID in optObj)
  3.         {
  4.                 opt = document.createElement('option');
  5.                 opt.innerHTML = optObj[ID];
  6.                 opt.value = ID;
  7.                 select2.appendChild(opt);
  8.         }
  9.  


Из консоли браузера:

optObj:
CODE (javascript):
скопировать код в буфер обмена
  1. Object
  2. 1: "Иванов"
  3. 2: "Петров"
  4. 3: "Сидоров"[[Prototype]]: Object


select id="NamePosition1"
CODE (html):
скопировать код в буфер обмена
  1. <select id="NamePosition1" style="visibility: visible;">
  2. <option>Фамилия</option>
  3. <option value="1">Иванов</option>
  4. <option value="2">Петров</option>
  5. <option value="3">Сидоров</option>
  6. </select>

Удачи!

(Отредактировано автором: 23 Января, 2022 - 13:44:44)

 
 Top
Vladimir Kheifets
Отправлено: 23 Января, 2022 - 16:53:55
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


Помог: 37 раз(а)




Дополнение

Новая версия с контролем и отправкой данных.
Спойлер (Отобразить)

(Отредактировано автором: 23 Января, 2022 - 17:03:03)

 
 Top
Ruskat
Отправлено: 24 Января, 2022 - 02:58:08
Post Id



Гость


Покинул форум
Сообщений всего: 70
Дата рег-ции: Март 2008  


Помог: 0 раз(а)




Vladimir Kheifets пишет:
Дополнение

Благодарствую за дополнение.
Немного добавил ссылок для добавления/удаления строк. Не Ajax конечно, но хоть как-то Улыбка
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. require("../config.php");
  3. if(isset($_GET['idSelect']))
  4. {
  5.                 $ps_id = $_GET["SelectedInd"];
  6.                 function full_name_to_short ($full_name, $format="A b. c.") { //ПіП скорочувач
  7.                         $words = explode(" ", $full_name);
  8.                         $format_keys = array("A", "B", "C");
  9.                         $short_name = $format;
  10.                         foreach ($format_keys as $index => $word) {
  11.                                 $short_name = str_replace($word, $words[$index], $short_name);
  12.                                 $short_name = str_replace(mb_strtolower($word), mb_substr($words[$index], 0, 1, 'UTF-8'), $short_name);
  13.                                 }
  14.                                         return $short_name;
  15.                 }       // https://gist.github.com/fdcore/05029aeba743650a15af 
  16.         header('Content-Type: application/json;charset=utf-8');
  17.         $query='SELECT id, pr, im, pb FROM `workers` WHERE `ps`= '.$ps_id;
  18.         $result = mysqli_query($db, $query);    //$db = mysqli_connect('127.0.0.1:3306','root','','test1');
  19.         while ($rows=mysqli_fetch_assoc($result)) {
  20.             $pip = full_name_to_short($rows["pr"]." ".$rows["im"]." ".$rows["pb"]); //Скорочуємо ПіП
  21.                         $arr[$rows['id']]=$pip;
  22.         }
  23.     echo json_encode($arr, JSON_PRETTY_PRINT);
  24.     //Возвращаем данные в JS в JSON-формате (XMLHttpResponse)
  25.         exit;
  26. }
  27. if(isset($_GET['save']))
  28. {
  29.         echo "<pre>";
  30.         print_r($_POST);
  31.         //здесь должны сохраняться данные.
  32.         echo "</pre>Данные успешно сохранены!";
  33.         exit;
  34. }
  35. ######################################################
  36. //$Position, $Brigade, $Place должны выбираться из БД
  37. $res_posady = mysqli_query($db,"SELECT * FROM posady ORDER BY `id` ASC");
  38. while ($posady = mysqli_fetch_assoc($res_posady)){
  39.         $arrp[] = $posady;
  40. }
  41. #$Position = [0=>"Должность", 1 => "Haчальник", 2 => "Водитель", 3 => "Рабочий"];
  42. $Brigade = 204;
  43. $Place = "Станция";
  44. ########################################################################
  45.         if(isset($_GET['p'])){$num_rows=$_GET['p']+1;}else{$num_rows = 1;}      #
  46.         if(isset($_GET['m'])){$num_rows=$_GET['m']-1;}                                          #
  47.         if($num_rows < 6){echo '<a href="?p='.$num_rows.'">Плюс</a>';}          #
  48.         if($num_rows > 1){echo '<a href="?m='.$num_rows.'">Мінус</a>';}         #
  49. ########################################################################
  50. $NumberOfWorkerInBrigade = $num_rows; //мах. кол-во в бригаде должно вводится или из config
  51. $PositionOpt = "";
  52. foreach($arrp as $id)
  53.         $PositionOpt.="<option value=".$id['id'].">".$id['posada']."</option>";
  54. $tr = "";
  55. $n = 0;
  56. while( ++$n <= $NumberOfWorkerInBrigade )
  57. $tr .= <<<HTML
  58. <tr>
  59. <td>$n</td>
  60. <td>$Brigade</td>
  61. <td>$Place</td>
  62. <td>
  63. <select id="Position$n" name="Position$n"><option value="">Посада</option>$PositionOpt</select>
  64. </td>
  65. <td>
  66. <select id="NamePosition$n" name="NamePosition$n"></select>
  67. </td>
  68. <td></td>
  69. </tr>
  70. HTML;
  71.  
  72. echo <<<HTML
  73. <html>
  74. <head>
  75. <title>CreateOption</title>
  76. <style>
  77. body,select{
  78.         font-family:arial;
  79.         color: #0000FF;
  80. }
  81. select[id^="Name"] {visibility: hidden}
  82. table, td{
  83.         border: 2px solid #BBC1C5;
  84.         border-collapse:collapse;
  85.         background-color:#CAD9EC
  86. }
  87. tr td{}
  88. td{
  89.         padding: 5 4 5 4;
  90.         text-align:center;}
  91. td + td,select{min-width:200px}
  92. div{margin-top: 20}
  93. </style>
  94. </head>
  95. <body>
  96. <form  action="" method="post">
  97. <table>
  98. <tr>
  99. <td>№</td>
  100. <td>Бригада</td>
  101. <td>Базирование</td>
  102. <td>Должность</td>
  103. <td>ФИО</td>
  104. <td>Рабочее время</td>
  105. </tr>
  106. $tr
  107. </table>
  108. <input type="hidden" name="Brigade" id ="Brigade" value="$Brigade">
  109. <input type="hidden" name="Place" id = "Place" value="$Place">
  110. <br>
  111. <input type="button" value="Сохранить"> <div id="report"></div>
  112. </form>
  113. </body>
  114. <script>
  115. NumberOfWorkerInBrigade = '$NumberOfWorkerInBrigade';
  116. sel = document.querySelectorAll("select[id^='Position']");
  117. report = document.getElementById("report");
  118. selChange = function(e){
  119.         id = e.target.id;
  120.         i=e.target.selectedIndex;
  121.         getOptions(id, i);
  122. }
  123. for ( iS = 0; iS<sel.length ; iS++)
  124. {
  125.         sel[iS].addEventListener("change", selChange);
  126. }
  127. //------------------------------
  128. setOpt = function(IdSelect, optObj){
  129.         select2 = document.getElementById(IdSelect);
  130.         select2.innerHTML = "";
  131.         opt = document.createElement('option');
  132.         opt.innerHTML = "Фамилия";
  133.         select2.appendChild(opt);
  134.         for(ID in optObj)
  135.         {
  136.                 opt = document.createElement('option');
  137.                 opt.innerHTML = optObj[ID];
  138.                 opt.value = ID;
  139.                 select2.appendChild(opt);
  140.         }
  141.         select2.style.visibility="visible";
  142. };
  143. //-----------------------------
  144. getOptions = function(idSelect, SelectedInd){
  145.         req = new XMLHttpRequest();
  146.         req.responseType = "json";
  147.         url = "?idSelect="+idSelect+"&SelectedInd="+SelectedInd;
  148.         req.open("get", url, true);
  149.         req.responseType = "json";
  150.         req.onreadystatechange = function()
  151.         {
  152.            if (this.readyState == 4 && this.status == 200)
  153.            {
  154.                         try
  155.                         {
  156.                                 rsp = this.response; //получаем JSON Object
  157.                                 setOpt("Name"+idSelect, rsp);
  158.                         }
  159.                         catch (e)
  160.                         {
  161.                                 err={state:this.readyState,err:e.message,url:url};
  162.                                 console.log(err);
  163.                         }
  164.                 };
  165.         };
  166.         req.send();
  167. };
  168.  
  169. sendForm = function(){
  170.         //begin form validation
  171.         arrId = ["Position", "NamePosition"];
  172.         arrMsg = ["должность ", "Ф.И.О "];
  173.         arrMsg2=["Ошибка! Вы не выбрали ", "-ого paботника" ];
  174.         msg = "";
  175.         for( n=1; n <= NumberOfWorkerInBrigade; n++)
  176.         {
  177.                 for(i in arrId)
  178.                 {
  179.                         id = arrId[i] + n;
  180.                         value = document.getElementById(id).value;
  181.                         if(value==0)
  182.                         {
  183.                                 msg += arrMsg2[0] + arrMsg[i] + n + arrMsg2[1]+"<br>";
  184.                         }
  185.                 }
  186.         }
  187.  
  188.         if(msg)
  189.         {
  190.                         report.innerHTML = msg;
  191.                         return;
  192.         }
  193.         // end form validation
  194.         // ----------------------------------------
  195.         // XMLHttpRequest
  196.         data = new FormData(document.forms[0]);
  197.         req = new XMLHttpRequest();
  198.         req.responseType = "text";
  199.         url = "?save=1";
  200.         req.open("post", url, true);
  201.         req.responseType = "text";
  202.         req.onreadystatechange = function()
  203.         {
  204.            if (this.readyState == 4 && this.status == 200)
  205.            {
  206.                         try
  207.                         {
  208.                                 rsp = this.response;
  209.                                 report.innerHTML = rsp;
  210.                         }
  211.                         catch (e)
  212.                         {
  213.                                 err={state:this.readyState,err:e.message,url:url};
  214.                                 console.log(err);
  215.                         }
  216.                 };
  217.         };
  218.         req.send(data);
  219. };
  220. document.querySelectorAll("input[type='button']")[0].addEventListener("click", sendForm);
  221. </script>
  222. </html>
  223. HTML;
  224. ?>

А вот функция запроса работников через XMLHttpRequest исходя из ID должности может подвести, так как, как я понимаю, счёт идёт по номеру элемента option, а не ссылается на ID самой должности, к которой привязан работник. Сбой произойдёт, когда ID в списке должностей будут не по порядку или в разброс.
 
 Top
Vladimir Kheifets
Отправлено: 24 Января, 2022 - 06:06:42
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


Помог: 37 раз(а)




Ruskat пишет:
А вот функция запроса работников через XMLHttpRequest исходя из ID должности может подвести, так как, как я понимаю, счёт идёт по номеру элемента option, а не ссылается на ID самой должности, к которой привязан работник. Сбой произойдёт, когда ID в списке должностей будут не по порядку или в разброс.


Если Вы имеете ввиду value в option, то счёт НЕ идёт по номеру элемента option.
Посмотрите в коде, индекс массива $arr, который затем попадает в value option, это id работника из таблицы, а не порядковый номер.
PHP:
скопировать код в буфер обмена
  1. ........
  2. $query='SELECT id, pr, im, pb FROM `workers` WHERE `ps`= '.$ps_id;
  3. $result = mysqli_query($db, $query);  
  4. while ($rows=mysqli_fetch_assoc($result)) {
  5.     $pip = full_name_to_short($rows["pr"]." ".$rows["im"]." ".$rows["pb"]);
  6.     $arr[$rows['id']]=$pip;
  7. }
  8. echo json_encode($arr, JSON_PRETTY_PRINT);
  9. //Возвращаем данные в JS в JSON-формате (XMLHttpResponse)
  10. ..........


Посмотрел Ваши доработки, Увидел только full_name_to_short
1. Советую Вам не вставлять функции в коде там где они применяются.
2. м. б. сделать попроще
PHP:
скопировать код в буфер обмена
  1. <?
  2. function full_name_to_short($rows){
  3.         $shortName = $rows["pr"];
  4.         foreach(["im","pb"] as $v)
  5.                 $shortName .= " ".mb_substr($rows[$v], 0, 1, 'UTF-8').".";
  6.         return $shortName;
  7. }
  8.  
  9. $rows["pr"]="Пупкин";
  10. $rows["im"]="Василий";
  11. $rows["pb"]="Иванович";
  12. echo "<pre>";
  13. print_r($rows);
  14. $pip = full_name_to_short($rows);
  15. echo $pip;
  16. /*
  17. Array
  18. (
  19.     [pr] => Пупкин
  20.     [im] => Василий
  21.     [pb] => Иванович
  22. )
  23. Пупкин В. И.
  24. */
  25. ?>

(Отредактировано автором: 24 Января, 2022 - 07:15:06)

 
 Top
Ruskat
Отправлено: 29 Января, 2022 - 02:28:31
Post Id



Гость


Покинул форум
Сообщений всего: 70
Дата рег-ции: Март 2008  


Помог: 0 раз(а)




Vladimir Kheifets пишет:
...

Уже массив с данными получаю.
PHP:
скопировать код в буфер обмена
  1.  
  2. (
  3.     [gr_to_date] => 2022-01-30
  4.     [st_disp] => 2
  5.     [kps] => 5
  6.     [brygada] => 205
  7.     [bazirovanie] => 10
  8.     [wrk_1] => 22
  9.     [dt_from_1] => 2022-01-30
  10.     [tm_from_1] => 08:00
  11.     [dt_to_1] => 2022-01-31
  12.     [tm_to_1] => 08:00
  13.     [wrk_2] => 3
  14.     [dt_from_2] => 2022-01-30
  15.     [tm_from_2] => 08:00
  16.     [dt_to_2] => 2022-01-31
  17.     [tm_to_2] => 08:00
  18.     [wrk_3] => 9
  19.     [dt_from_3] => 2022-01-30
  20.     [tm_from_3] => 08:00
  21.     [dt_to_3] => 2022-01-31
  22.     [tm_to_3] => 08:00
  23.     [wrk_4] => 110
  24.     [dt_from_4] => 2022-01-30
  25.     [tm_from_4] => 08:00
  26.     [dt_to_4] => 2022-01-31
  27.     [tm_to_4] => 08:00
  28. )
  29.  

Как теперь эти данные правильно в базу писать? Так как параметры [st_disp] => 2, [kps] => 5, [bazirovanie] => 10 только одни на определенную дату/дежурство. Внесены лишь раз и могут не меняться, если не нужно корректировать.
А вот [brygada] => 205, [bazirovanie] => 10, [wrk_1] => 22 ... Их будет несколько: [brygada] => 206, [brygada] => 216... Могут быть с разным составом, редактироваться или удаляться.
Должность я выведу исходя из ID должности, которая указана в профиле работника. Главное, что имеется ID работника.
Вот набросал условное представление [img]https://i.yapx.ru/QUWyM.png[/img], что мне нужно видеть на выходе для просмотра графика онлайн.
Как это правильно писать в базу и выводить с привязкой к определённой дате?
Подскажите, пожалуйста.

(Отредактировано автором: 29 Января, 2022 - 02:35:48)

 
 Top
Vladimir Kheifets
Отправлено: 29 Января, 2022 - 12:06:34
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


Помог: 37 раз(а)




Ruskat пишет:
Vladimir Kheifets пишет:
...

Уже массив с данными получаю.
PHP:
скопировать код в буфер обмена
  1.  
  2. (
  3.     [gr_to_date] => 2022-01-30
  4.     [st_disp] => 2
  5.     [kps] => 5
  6.     [brygada] => 205
  7.     [bazirovanie] => 10
  8.     [wrk_1] => 22
  9.     [dt_from_1] => 2022-01-30
  10.     [tm_from_1] => 08:00
  11.     [dt_to_1] => 2022-01-31
  12.     [tm_to_1] => 08:00
  13.     [wrk_2] => 3
  14.     [dt_from_2] => 2022-01-30
  15.     [tm_from_2] => 08:00
  16.     [dt_to_2] => 2022-01-31
  17.     [tm_to_2] => 08:00
  18.     [wrk_3] => 9
  19.     [dt_from_3] => 2022-01-30
  20.     [tm_from_3] => 08:00
  21.     [dt_to_3] => 2022-01-31
  22.     [tm_to_3] => 08:00
  23.     [wrk_4] => 110
  24.     [dt_from_4] => 2022-01-30
  25.     [tm_from_4] => 08:00
  26.     [dt_to_4] => 2022-01-31
  27.     [tm_to_4] => 08:00
  28. )
  29.  

Как теперь эти данные правильно в базу писать? Так как параметры [st_disp] => 2, [kps] => 5, [bazirovanie] => 10 только одни на определенную дату/дежурство. Внесены лишь раз и могут не меняться, если не нужно корректировать.
А вот [brygada] => 205, [bazirovanie] => 10, [wrk_1] => 22 ... Их будет несколько: [brygada] => 206, [brygada] => 216... Могут быть с разным составом, редактироваться или удаляться.
Должность я выведу исходя из ID должности, которая указана в профиле работника. Главное, что имеется ID работника.
Вот набросал условное представление [img]https://i.yapx.ru/QUWyM.png[/img], что мне нужно видеть на выходе для просмотра графика онлайн.
Как это правильно писать в базу и выводить с привязкой к определённой дате?
Подскажите, пожалуйста.


Добрый день!

Поскольку у Вас в бригаде у работников время работы разное и по нему могут потребоваться выборки, не стоит упаковывать данные в один стобец типа json.
Попробуйте сделать две таблицы
Спойлер (Отобразить)
т.к. дата в таблице `brigada` создает с датой from `workers_brigada`
а дата то совпадает датой from или +1day, то можно записывать только время.
Конечно это усложнит выборку данных.

Удачи!
 
 Top
Ruskat
Отправлено: 01 Февраля, 2022 - 00:10:08
Post Id



Гость


Покинул форум
Сообщений всего: 70
Дата рег-ции: Март 2008  


Помог: 0 раз(а)




Vladimir Kheifets пишет:

Удачи!

Не могу зацепиться за формирование в базе строк с работниками.
А именно [wrk_1]... ($_POST['wrk_1'])
Параметр идентификатора работника динамичен. Может и до [wrk_4] дойти, а може и 2 иметь.
Как посчитать колличество [wrk_Х] , чтобы потом аналогично и для времени посчитать и для работника получить цикл и всё записать в базу?
Писать думаю в цикле, примерно так:
PHP:
скопировать код в буфер обмена
  1.     $n = count($_POST);
  2.     for($i=1; $i < $n; $i++){
  3.            $vid = $_POST['wrk'.$i];
  4.            $dt_fr= $_POST['dt_from_'.$i];
  5.            $tm_fr= $_POST['tm_from_'.$i];
  6.            $dt_to= $_POST['dt_to_'.$i];
  7.            $tm_to= $_POST['tm_to_'.$i];
  8.     }

Может сформировать как-то иначе, чтобі получилось $_POST['wrk'][0]...[4]

(Отредактировано автором: 01 Февраля, 2022 - 00:13:07)

 
 Top
Vladimir Kheifets
Отправлено: 01 Февраля, 2022 - 14:09:43
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


Помог: 37 раз(а)




Ruskat пишет:
Vladimir Kheifets пишет:

Удачи!

Не могу зацепиться за формирование в базе строк с работниками.
А именно [wrk_1]... ($_POST['wrk_1'])
Параметр идентификатора работника динамичен. Может и до [wrk_4] дойти, а може и 2 иметь.
Как посчитать колличество [wrk_Х] , чтобы потом аналогично и для времени посчитать и для работника получить цикл и всё записать в базу?
Писать думаю в цикле, примерно так:
PHP:
скопировать код в буфер обмена
  1.     $n = count($_POST);
  2.     for($i=1; $i < $n; $i++){
  3.            $vid = $_POST['wrk'.$i];
  4.            $dt_fr= $_POST['dt_from_'.$i];
  5.            $tm_fr= $_POST['tm_from_'.$i];
  6.            $dt_to= $_POST['dt_to_'.$i];
  7.            $tm_to= $_POST['tm_to_'.$i];
  8.     }

Может сформировать как-то иначе, чтобі получилось $_POST['wrk'][0]...[4]

Добрый день!
$n = count($_POST); Выдаст количество эл. массива, а это совсем не то, что Вам нужно.
Если формуляр заполняется последовательно с первой строки, то так можно выбрать все введенное, до первой пустой:
PHP:
скопировать код в буфер обмена
  1. $i=1;
  2.         while(!empty($vid=$_POST["wrk".$i]))
  3.         {
  4.                 $dt_fr= $_POST['dt_from_'.$i];
  5.                 $tm_fr= $_POST['tm_from_'.$i];
  6.                 $dt_to= $_POST['dt_to_'.$i];
  7.                 $tm_to= $_POST['tm_to_'.$i];
  8.                 $i++;
  9.         }


а так можно обработать все строки исключая пустые:
PHP:
скопировать код в буфер обмена
  1. $NumberOfWorkerInBrigade = 4;
  2.         for($i=1; $i<=$NumberOfWorkerInBrigade; $i++)
  3.         {
  4.                 if(!empty($vid=$_POST["wrk".$i]))
  5.                 {
  6.                         $dt_fr= $_POST['dt_from_'.$i];
  7.                         $tm_fr= $_POST['tm_from_'.$i];
  8.                         $dt_to= $_POST['dt_to_'.$i];
  9.                         $tm_to= $_POST['tm_to_'.$i];
  10.                 }
  11.         }
Удачи!
 
 Top
Ruskat
Отправлено: 06 Февраля, 2022 - 03:41:44
Post Id



Гость


Покинул форум
Сообщений всего: 70
Дата рег-ции: Март 2008  


Помог: 0 раз(а)




Не мало уже сделал. Даже получилось работнику по его табельному номеру показывать, когда у него дежурства и на какой бригаде.
Сейчас я хочу все дежурства, в виде бригад, на которых он числится, разделить по трем раскрывающимся спойлерам:
1: Текущее дежурство - если дата и время дежурства уже наступили (C 2020-02-08 08:00 по 2020-02-09 08:00 ) - если таковое имеется.
2: Грядущее дежурство - если до выхода на дежурство менее 3-х суток
3: Предстоящие дежурства - все будущие дежурства, до которых 3-е и более суток.
4: Прошлые дежурства - самый низ - от момента времени окончания суток и пока они есть. Далее продумаю автоочистку дежурств, старее 1-го месяца.
 
 Top
Vladimir Kheifets
Отправлено: 06 Февраля, 2022 - 11:30:03
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


Помог: 37 раз(а)




Ruskat пишет:
Не мало уже сделал. Даже получилось работнику по его табельному номеру показывать, когда у него дежурства и на какой бригаде.
Сейчас я хочу все дежурства, в виде бригад, на которых он числится, разделить по трем раскрывающимся спойлерам:
1: Текущее дежурство - если дата и время дежурства уже наступили (C 2020-02-08 08:00 по 2020-02-09 08:00 ) - если таковое имеется.
2: Грядущее дежурство - если до выхода на дежурство менее 3-х суток
3: Предстоящие дежурства - все будущие дежурства, до которых 3-е и более суток.
4: Прошлые дежурства - самый низ - от момента времени окончания суток и пока они есть. Далее продумаю автоочистку дежурств, старее 1-го месяца.


Добрый день!
Видимо здесь опечатка: разделить по трем раскрывающимся спойлерам, а покали четыре.
Сделал так, что их м.б. столько, сколько будет блоков
CODE (html):
скопировать код в буфер обмена
  1. <div class = "spoiler">..... <span></span>
  2. <div></div>
  3. </div>

Это код для четырёх спойлеров:
Спойлер (Отобразить)
Удачи!

(Отредактировано автором: 06 Февраля, 2022 - 11:31:36)

 
 Top
Ruskat
Отправлено: 13 Февраля, 2022 - 10:51:18
Post Id



Гость


Покинул форум
Сообщений всего: 70
Дата рег-ции: Март 2008  


Помог: 0 раз(а)




Vladimir Kheifets пишет:

Видимо здесь опечатка: разделить по трем раскрывающимся спойлерам

Таки по четырём.
Но Ваш код не стал моим решением. Скорее всего я не верно выразился.
Мне нужно вывести блоки с прошедшими текущим и предстоящими дежурствами определённого работника.

Создал 3 РНР-файла:
PHP:
скопировать код в буфер обмена
  1. include("gchw_current.php");
  2. include("gchw_future.php");
  3. include("gchw_past.php");

С практически одинаковым содержимым, по с разными параметрами выборки с базы:
PHP:
скопировать код в буфер обмена
  1. $gchw_future = mysqli_query($db, "SELECT * FROM `gch_brygady` WHERE wrk_id LIKE '%".$tn."%' and `dt_fr` > date(now()) ORDER BY `dt_fr` ASC");

Где $tn - табельный номер работника.
dt_fr - дата, С которой дежурство. В компоновке с tm_fr - время, с которого дежурство, дадут более точное начало информирования, когда человеку на работу.
А там уже выбрать дежурства с участием конкретного работника из базы:

  • `dt_fr` > date(now()) - позже сегодняшней даты
  • `dt_fr` = date(now()) - если сегодня утром на работу. Тут еще подумаю, чтобы отображало за сутки до дежурства - выбирать, если не более одного дня - за день до сегодняшнего на сутки.
  • `dt_fr` < date(now()) - отображать дежурства, которые уже были - ранее сегодняшней даты

В каждом из файлов стоит условие отображать содержимое, если есть хоть одна запись, согласно условиям выборки - не ноль. Например:
PHP:
скопировать код в буфер обмена
  1. $gchw_past = mysqli_query($db, "SELECT * FROM `gch_brygady` WHERE wrk_id LIKE '%".$tn."%' and `dt_fr` < date(now()) ORDER BY `dt_fr` DESC");    // and `dt_fr` < date(now())
  2. if (mysqli_num_rows($gchw_past) > 0){ ?> <a onclick="$('#ch_past').slideToggle('slow');" href="javascript://">Показати <?PHP echo mysqli_num_rows($gchw_past).' '.vidminyuvannya(mysqli_num_rows($gchw_past), 'прошлое дежурство', 'прошлого дежурства', 'прошлых дежурств'); ?>.</a><div id="ch_past" style="display:none"> <?PHP $i_past = 1;

Далее цикл... и после окончания цикла, но перед закрытием условия - </div>
Функция склонения по падежам:
PHP:
скопировать код в буфер обмена
  1.                 function vidminyuvannya($num, $form_for_1, $form_for_2, $form_for_5){
  2.                         $num = abs($num) % 100; // берем число по модулю и сбрасываем сотни (делим на 100, а остаток присваиваем переменной $num)
  3.                         $num_x = $num % 10; // сбрасываем десятки и записываем в новую переменную
  4.                         if ($num > 10 && $num < 20) // если число принадлежит отрезку [11;19]
  5.                                 return $form_for_5;
  6.                         if ($num_x > 1 && $num_x < 5) // иначе если число оканчивается на 2,3,4
  7.                                 return $form_for_2;
  8.                         if ($num_x == 1) // иначе если оканчивается на 1
  9.                                 return $form_for_1;
  10.                         return $form_for_5;
  11.                 }       // echo $max_product . ' ' . vidminyuvannya($max_product, 'товар', 'товара', 'товаров');


Если скоро работать, но еще не пришло время работать, то затягиваю в HTML-блок AJAXом файл clock.php.
CODE (javascript):
скопировать код в буфер обмена
  1.                                         function show()  
  2.                                         {  
  3.                                                 $.ajax({  
  4.                                                         url: "/clock.php?f=<?php echo $today_br_data['dt_fr'].''. $today_br_data['tm_fr'].'&t='.$today_br_data['dt_to'].''. $today_br_data['tm_to']; ?>",  
  5.                                                         cache: false,  
  6.                                                         success: function(html){  
  7.                                                                 $("#work_clock").html(html);  
  8.                                                         }  
  9.                                                 });  
  10.                                         }  
  11.                                         $(document).ready(function(){  
  12.                                                 show();  
  13.                                                 setInterval('show()',1000);  
  14.                                         });

где

  • $today_br_data['dt_fr'] - Рабочая дата С.
  • $today_br_data['tm_fr'] - Рабочее время С.
  • $today_br_data['dt_to'] - Рабочая дата По.
  • $today_br_data['tm_to'] - Рабочее время По.

clock.php:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.         if(isset($_GET['f'])){$f = $_GET['f'];}else{$oldDate = date("Y-m-d H:i"); $f = date("Y-m-d H:i", strtotime($oldDate.'+ 1 days')); }
  3.         if(isset($_GET['t'])){$t = $_GET['t'];}else{$t = ''; }
  4.         if(isset($_GET['c'])){$c = $_GET['c'];}else{$c = ''; }
  5.         $date_time_now = date("Y-m-d H:i:s");
  6.                 $pochatok_cherguvannya = $f;
  7.         if($date_time_now == $pochatok_cherguvannya){ //Если уже работает
  8.                 $start_date = new DateTime($f);
  9.                 $end_date = new DateTime($t);
  10.                 $ssb = $start_date->diff(new DateTime($date_time_now ));//https://phptime.ru/questions/365191/how-to-get-time-difference-in-minutes-in-php/
  11.                 $sse = $end_date->diff(new DateTime($date_time_now ));//https://phptime.ru/questions/365191/how-to-get-time-difference-in-minutes-in-php/
  12.                         if ($ssb->d == 0){$db='';}else{$db=$ssb->d.' дн, ';}    if ($sse->d == 0){$de='';}else{$de=$sse->d.' дн, ';}
  13.                         if ($ssb->h == 0){$hb='';}else{$hb=$ssb->h.' год, ';}   if ($sse->h == 0){$he='';}else{$he=$sse->h.' год, ';}
  14.                         if ($ssb->i == 0){$mb='';}else{$mb=$ssb->i.' хв, ';}    if ($sse->i == 0){$me='';}else{$me=$sse->i.' хв, ';}
  15.                         if ($ssb->s == 0){$sb='';}else{$sb=$ssb->s.' сек. ';}   if ($sse->s == 0){$se='';}else{$se=$sse->s.' сек. ';}
  16.                 $w_b = $db.$hb.$mb.$sb;         $w_e = $de.$he.$me.$se;
  17.                 //echo '<div class="xw-tc" style="width: 40%; height: 24px;">Відпрацьовано: '.$w_behind.' Лишилося: '.$w_end.'</div>';
  18.                 echo 'Відпрацьовано: '.$w_behind.' Лишилося: '.$w_end.'';
  19.         }else{ //иначе показывать время до начала работы и через сколько конец работы.
  20.                 $start_date = new DateTime($pochatok_cherguvannya);
  21.                 $end_date = new DateTime($t);
  22.                 $ssb = $start_date->diff(new DateTime($date_time_now ));//https://phptime.ru/questions/365191/how-to-get-time-difference-in-minutes-in-php/
  23.                 $sse = $end_date->diff(new DateTime($date_time_now ));//https://phptime.ru/questions/365191/how-to-get-time-difference-in-minutes-in-php/
  24.                         if ($ssb->d == 0){$db='';}else{$db=$ssb->d.' дн, ';}    if ($sse->d == 0){$de='';}else{$de=$sse->d.' дн, ';}
  25.                         if ($ssb->h == 0){$hb='';}else{$hb=$ssb->h.' год, ';}   if ($sse->h == 0){$he='';}else{$he=$sse->h.' год, ';}
  26.                         if ($ssb->i == 0){$mb='';}else{$mb=$ssb->i.' хв, ';}    if ($sse->i == 0){$me='';}else{$me=$sse->i.' хв, ';}
  27.                         if ($ssb->s == 0){$sb='';}else{$sb=$ssb->s.' сек. ';}   if ($sse->s == 0){$se='';}else{$se=$sse->s.' сек. ';}
  28.                 $w_b = $db.$hb.$mb.$sb;         $w_e = $de.$he.$me.$se;
  29.                 echo 'До початку чергування: '.$w_b.' До закінчення чергування: '.$w_e;
  30.         }

Ещё хочу сформировать прогресс-бар, который будет процентно заполняться в зависимости от отработанного времени или времени до начала работы.
Прошу помощи в добавлении к бригаде текстовой заметки.
Работников бывает трое или четверо. Вот я припысываю переменную заметки записать к ячейке третьего работника таким образом:
PHP:
скопировать код в буфер обмена
  1.  
  2. if (isset($_POST['prymitka'])){$prm = mysqli_real_escape_string($db, $_POST['prymitka']);} //Примітка для бригади
  3. $prm_arr = array(' ', '  ', ' ', $prm, ' ');

Далее она пишется в цикле в базу. Можно как-то автоматически задать, писать заметку к ячейке последнего работника, третьего или четвёртого автоматически, а не исскуственным созданием массива?
 
 Top
Страниц (3): « 1 [2] 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB