ТЗ на разработку поля - "время"

InstantCMS 2.X

Подскажите есть ли готовое поле время?

#1 6 апреля 2023 в 13:25

Подскажите как настроить чтобы был выбор просто времени, в формате часы, минуты. 

Нашёл библиотеку — robinherbots.github.io/Inputmask/#/documentation/datetime Ссылку на неё нашёл когда изучал маску ввода для Строкового поля в Инстанте.  Там есть маска формата HH.MM (часы минуты). Но как это можно настроить в нашей системе? 

Или может есть поле при нажатии на которое выскакивает циферблат? В дополнениях не нашёл. Готов купить. 

И задача максимум: Есть два поля — «Отход ко сну» и «Время пробуждения», нужно поле — Длительность сна, которое бы считало автоматически разницу. Если есть кто готов сделать, то напишите цену. 

Спасибо.

#4 6 апреля 2023 в 17:22

Твоя задумка мне мою напоминает 

instantcms.ru/forum/ischyu-ispolnitelja.html#post-355235

Я тебя правильно понял?

Тебе хочется примерно тоже, только прикрученной к инсте?

#5 6 апреля 2023 в 17:41

Твоя задумка мне мою напоминает 

Тебе хочется примерно тоже, только прикрученной к инсте?

Piti

Не, у меня всё гораздо проще... 

У меня на сайте есть Тип контента — Ежедневник, в который пользователь заполняет поля, и потом может анализировать от чего у него зависит качество жизни и количество энергии. Там нужно заполнять во сколько лёг, и во сколько проснулся. И желательно было бы что бы время сна считалось автоматом. Сейчас это 2 строковых поля с масками «99:99» и одно числовое с разрядной частью 2 и дробной частью 2, разделитель двоеточие, (это время сна), и их все нужно заполнять вручную… По полю Длительность сна строится диаграмма, поэтому оно числовое.  Но всё это очень не удобно… Вот думаю как улучшить. 

#6 6 апреля 2023 в 18:52

В папке system/fields создать файл time.php

  1. <?php class fieldTime extends cmsFormField {
  2. public $title = 'Время';
  3. public $sql = 'varchar(10) NULL DEFAULT NULL';
  4. public $var_type = 'string';
  5. public $type = 'text';
  6. public function parse($value) {
  7. if (is_empty_value($value)) { return ''; }
  8. return html($value, false);
  9. }
  10. public function store($value, $is_submitted, $old_value = null) {
  11. if (is_empty_value($value)) { return ''; }
  12. return strip_tags(trim($value));
  13. }
  14. }

В папке templates/default/assets/fields создать файл time.tpl.php

  1. <?php if ($field->title) { ?><label for="<?php echo $field->id; ?>"><?php echo $field->title; ?></label><?php } ?>
  2. <?php echo html_input('time', $field->element_name, $value, []); ?>

Изображение

Изображение

А на телефоне так:

Изображение

#7 6 апреля 2023 в 19:07

Вам надо поле где заполняется время когда лёг и когда проснулся, т.е. 2 поля выбор времени?

На выходе что бы считал сколько человек спал?

Например лёг в 9:00, проснулся в 06:00, на выход что бы получил, что то типа Время сна: 9 часов?

#8 6 апреля 2023 в 21:14

Вариант с подсчетом.

Изображение

В папке system/fields создать файл sleep.php

  1. <?php class fieldSleep extends cmsFormField {
  2. public $title = 'Сон';
  3. public $sql = 'varchar(128) NULL DEFAULT NULL';
  4. public $var_type = 'string';
  5. public $type = 'text';
  6. public function parse($value) {
  7. if (is_empty_value($value)) { return ''; }
  8. $values = explode('|', $value);
  9. $start = '<p>Начало: '.($values[0] ? date('H:i', strtotime($values[0])) : '---').'</p>';
  10. $end = '<p>Конец: '.($values[1] ? date('H:i', strtotime($values[1])) : '---').'</p>';
  11. $period = '';
  12. if ($values[0] && $values[1]) {
  13. $time_0 = date_create($values[0]);
  14. $time_1 = date_create($values[1]);
  15. $period = date_diff($time_0, $time_1);
  16. $period = $period->format('%H ч. %I мин.');
  17. $period = '<p>Продолжительность: '.$period.'</p>';
  18. }
  19. return '<div>'.$start.$end.$period.'</div>';
  20. }
  21. public function store($value, $is_submitted, $old_value = null) {
  22. $values = $this->request->get($this->name);
  23. if (empty($values[0]) && empty($values[1])) { return ''; }
  24. $old_values = $old_value ? explode('|', $old_value) : [];
  25. if ($values[0]) { $values[0] = !empty($old_values[0]) ? date('Y-m-d '.$values[0], strtotime($old_values[0])) : date('Y-m-d '.$values[0]); }
  26. if ($values[1]) { $values[1] = !empty($old_values[1]) ? date('Y-m-d '.$values[1], strtotime($old_values[1])) : date('Y-m-d '.$values[1]); }
  27. return implode('|', $values);
  28. }
  29. }

В папке templates/default/assets/fields создать файл sleep.tpl.php

  1. <?php if ($field->title) { ?><label for="<?php echo $field->id; ?>"><?php echo $field->title; ?></label><?php } ?>
  2.  
  3. <?php
  4. $vals = explode('|', $value);
  5. $val_0 = !empty($vals[0]) ? date('H:i', strtotime($vals[0])) : '';
  6. $val_1 = !empty($vals[1]) ? date('H:i', strtotime($vals[1])) : '';
  7. $time_0 = html_input('time', $field->element_name.'[0]', '', []);
  8. if ($val_0) {
  9. $time_0 = html_input('hidden', $field->element_name.'[0]', $val_0, []).html_input('time', $field->element_name.'_disabled_0', $val_0, ['disabled' => 'disabled']);
  10. }
  11. $time_1 = html_input('time', $field->element_name.'[1]', '', []);
  12. if ($val_1) {
  13. $time_1 = html_input('hidden', $field->element_name.'[1]', $val_1, []).html_input('time', $field->element_name.'_disabled_1', $val_1, ['disabled' => 'disabled']);
  14. }
  15. ?>
  16. <div class="time_field">
  17. <div class="input-group mb-2">
  18. <label style="width:100%;">Начало</label>
  19. <?php echo $time_0; ?>
  20. </div>
  21. <div class="input-group">
  22. <label style="width:100%;">Конец</label>
  23. <?php echo $time_1; ?>
  24. </div>
  25. </div>

Добавить в ТК поле «Сон».

Особенности:

  1. Если время указано, его нельзя изменить.
  2. Дата (день/месяц/год) в поле — текущая при заполнении.

Изображение

nifigasse.ru/board/21-objavlenie.html

#9 7 апреля 2023 в 01:52

 Саня, ты просто обязан задонейтить на кофе  Нифигаccе о-го-гошеньки

#10 7 апреля 2023 в 09:39

Вариант с подсчетом.

Нифигаccе о-го-гошеньки

Спасибо большое, сейчас попробую. 

Саня, ты просто обязан задонейтить на кофе  Нифигаccе о-го-гошеньки

Василич

Само собой. 

Добавлено спустя 24 минуты

Вариант с подсчетом.

Нифигаccе о-го-гошеньки

Проверил, всё супер. Только нужно сделать проверку на Время «Начало», если там меньше 23.59, то ставить дату вчерашнего дня. Если начинается с 00:00 то сегодняшний день. Потому что у меня если ложусь раньше 23:59 всегда выдаёт что лёг сегодня ночью, и проснулся сегодня утром, в итоге считает не 8 часов сна, а 16. 

Выглядит сейчас так:

Отход ко сну: 23:59

Пробуждение: 08:00

Продолжительность: 15 ч. 59 мин.

#11 7 апреля 2023 в 10:09

Я знал)) Через пару часов домой вернусь, поправим.

#12 7 апреля 2023 в 10:34

поправим

Нифигаccе о-го-гошеньки

Код в файле system/fields/sleep.php

  1. <?php
  2.  
  3. class fieldSleep extends cmsFormField {
  4.  
  5. public $title = 'Сон';
  6. public $sql = 'varchar(128) NULL DEFAULT NULL';
  7. public $var_type = 'string';
  8. public $type = 'text';
  9.  
  10. public function parse($value) {
  11.  
  12. if (is_empty_value($value)) {
  13. return '';
  14. }
  15.  
  16. $values = explode('|', $value);
  17.  
  18. $start = '<p>Начало: ' . ($values[0] ? date('H:i', strtotime($values[0])) : '---') . '</p>';
  19. $end = '<p>Конец: ' . ($values[1] ? date('H:i', strtotime($values[1])) : '---') . '</p>';
  20. $period = '';
  21.  
  22. if ($values[0] && $values[1]) {
  23.  
  24. $time_0 = date_create($values[0]);
  25. $time_1 = date_create($values[1]);
  26.  
  27. if ($time_0 > $time_1){
  28. date_add($time_1, date_interval_create_from_date_string('1 day'));
  29. }
  30.  
  31. $period = date_diff($time_0, $time_1);
  32. $period = $period->format('%H ч. %I мин.');
  33. $period = '<p>Продолжительность: ' . $period . '</p>';
  34.  
  35. }
  36.  
  37. return '<div>' . $start . $end . $period . '</div>';
  38.  
  39. }
  40.  
  41. public function store($value, $is_submitted, $old_value = null) {
  42.  
  43. $values = $this->request->get($this->name);
  44.  
  45. if (empty($values[0]) && empty($values[1])) {
  46. return '';
  47. }
  48.  
  49. $old_values = $old_value ? explode('|', $old_value) : [];
  50.  
  51. if ($values[0]) {
  52. $values[0] = !empty($old_values[0]) ? date('Y-m-d ' . $values[0], strtotime($old_values[0])) : date('Y-m-d ' . $values[0]);
  53. }
  54.  
  55. if ($values[1]) {
  56. $values[1] = !empty($old_values[1]) ? date('Y-m-d ' . $values[1], strtotime($old_values[1])) : date('Y-m-d ' . $values[1]);
  57. }
  58.  
  59. return implode('|', $values);
  60.  
  61. }
  62.  
  63. }
Добавлено спустя Только что

выдаёт что лёг сегодня ночью, и проснулся сегодня утром, в итоге считает не 8 часов сна, а 16.

Саня

Зато качество сна лучше стало.

#13 7 апреля 2023 в 10:40

Я знал)) Через пару часов домой вернусь, поправим.

Нифигаccе о-го-гошеньки

А ещё вопрос в таблицу заносится информация: «2023-04-07 23:59|2023-04-07 08:00», а я хотел бы по этому полю формировать диаграмму. Как можно сделать чтобы в таблицу заносился сам результат. Или может результат передавался бы в переменную, которую можно было бы вывести через другое поле? 

Добавлено спустя 2 минуты

Зато качество сна лучше стало.

Loadырь

Хотелось бы разок так выспаться)))

Добавлено спустя 1 минуту

Код в файле system/fields/sleep.php

Loadырь

Спасибо, сейчас считает верно

#14 7 апреля 2023 в 10:47

О, уже исправили)) Но я бы перещаписывал лучше один этот день при сохранении. Мало ли где ещё надо будет использовать эти данные.

#15 7 апреля 2023 в 10:55

а я хотел бы

Саня

Вот эти все «а я хотел бы» нужно озвучивать сразу и желательно ещё до написания основного ТЗ )).

Добавлено спустя 8 минут

Но я бы перещаписывал лучше один этот день при сохранении.

Нифигаccе о-го-гошеньки

Можно и так, я не смотрел, что он там в базу сохраняет,.

Но всё равно из-за хотелок вам придется поле переписывать и как минимум использовать денормализацию, либо писать второе поле для хранения значения вычисления в этом поле.

Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.