Вы здесь

Как с помощью Computed Field вычислить разницу двух дат?

0

Доброго времени суток всем

Есть сайт, на котором, есть тип материала с полем "дата". Поле дата имеет начальную и конечную дату с временем.
Так же есть поле в котором планируется выводить разницу между начальной и конечной датой с временем.

Поискав ответ, нашел 2 подходящих решения в виде готовых модулей, первый Computed Field и второй Math Field.

У первого модуля - Computed Field - есть готовое решения, для конкретного вопроса, которое описано здесь - https://www.drupal.org/node/149234.
Так как я с PHP знаком плохо, прощу помочь с тем, что и куда нужно вставить, чтобы все заработало.

У меня:
Поле с датой, имеет машинное имя: field_date
Поле с разницей, имеет машинное имя: field_summ

Ниже сам код, со страницы с примером решения - https://www.drupal.org/node/149234

Computed field settings

Computed Code:

$field_info = array_pop(field_get_items($entity_type, $entity, 'field_date'));

$start = $field_info['value'];
$end = $field_info['value2'];
$timezone = $field_info['timezone'];

$date_start = new DateTime($start, $timezone);
$date_end = new DateTime($end, $timezone);

$interval = $date_start->diff($date_end);

$entity_field[0]['value'] = $interval->format('%h');

Display Code:

$display_output = $entity_field_item['value'] . " hours";

Заранее спасибо за помощь.

Версия Drupal: 
7.x
Связанные проекты: 
Computed FieldMath Field
Вопрос задан 21.12.2015 - 12:36

Если я правильно понимаю, я должен поменять значения только в этой строке

$field_info = array_pop(field_get_items($entity_type, $entity, 'field_date'));

а именно:

  1. $entity_type -> на какие то мои значения?
  2. $entity - на какие то мои значения?
  3. 'field_date' - это машинное имя поле с датой, оно совпадет с мои заданным машинным именем
Комментарий оставлен 21.12.2015 - 12:53

Так если вы решение нашли, то в чем вопрос тогда?

Комментарий оставлен 21.12.2015 - 13:17

В том, что как я понимаю, нужно в этот PHP код свои значения вставить, так ведь? а какие именно значения ставить я не пойму, так как не знаю PHP, вот и прощу тех, кто знаком с PHP, чтобы подсказали, что и куда нужно вставить.

Что я сделал уже:

  1. Тип материала для теста использую Article
  2. Создал поле типа "дата", с машинным именем: field_date
  3. Создал поле типа "сomputed", с машинным именем: field_computed‎
  4. В настройках поля "сomputed" в техстовом поле "Computed Code (PHP)" вставил:
$field_info = array_pop(field_get_items($entity_type, $entity, 'field_date'));

$start = $field_info['value'];
$end = $field_info['value2'];
$timezone = $field_info['timezone'];

$date_start = new DateTime($start, $timezone);
$date_end = new DateTime($end, $timezone);

$interval = $date_start->diff($date_end);

$entity_field[0]['value'] = $interval->format('%h');
?>
  1. В настройках поля "сomputed" в техстовом поле "Display Code (PHP) " вставил:
$display_output = $entity_field_item['value'] . " hours";

  1. в настройке поля "сomputed" в Data Type поставил Float
  2. в настройке поля "сomputed" в Data Length поставил 3,2

При создании материала Article, заполняю поле заголовок, поле дата - указывая начальную дату и время и конечную, сохраняю - должно произойти вычисление и вывести поле "сomputed" с вычислением, но не работает это и ничего не выводится.

Что я сделал не так?

Комментарий оставлен 21.12.2015 - 14:02

Ответы

0

Как минимум нужно понимать, что пример с орга имеет смысл, если дата начала и конца события одинаковые, а разница только по времени, если же даты разные, то нужно хранить поле в varchar и форматировать DateInterval совсем по другому

$field_info = array_pop(field_get_items($entity_type, $entity, 'field_date'));
$start = $field_info['value'];
$end = $field_info['value2'];
$date_start = new DateTime($start);
$date_end = new DateTime($end);
$interval = $date_start->diff($date_end);
$entity_field[0]['value'] = $interval->format('%d:%h:%i:%s');
Ответ дан 21.12.2015 - 14:59
Аватар пользователя drupby
drupby
456

Да, ваш пример работает, спасибо большое за помощь!)

Получается если же и года разные, то DateInterval будет выглядеть так, добавляем просто %Y, верно?

$interval->format('%Y:%d:%h:%i:%s');
Комментарий оставлен 21.12.2015 - 15:24

Получается если же и года разные, то DateInterval будет выглядеть так, добавляем просто %Y, верно?

да

Комментарий оставлен 21.12.2015 - 15:37

Еще раз благодарю за предоставленный вариант решения и помощь..)

Комментарий оставлен 21.12.2015 - 15:41
0

похожая задача http://userone.ru/?q=node/1

Ответ дан 25.12.2015 - 16:52

А как использовать поле "Дата публикации" для просчета между ним и другим полем даты?
Кто знает?

Комментарий оставлен 22.12.2016 - 15:44