[Решено]Node reference - сложить сумму полей связанных нод

Главные вкладки

Аватар пользователя Nikolas Nikolas 28 мая 2015 в 11:44

Добрый день!

Есть нода Смена, в ней поле, которое ссылается на другие типа Задание
В Задании поле с числовым значением Сделано.
Надо чтобы в материале Смена было поле, которое содержит в себе сумму значений Сделано из привязанных Заданий.

Как это можно сделать?
Просто вывести таблицу - разобрался, в ней можно показать при помощи Views Calc сумму этих Сделано, но данную сумму надо использовать и в других местах - надо как-то ее в поле записать автоматически. реально?
Чем можно сделать и как?

Комментарии

Аватар пользователя serega111 serega111 28 мая 2015 в 15:30

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

Аватар пользователя serega111 serega111 28 мая 2015 в 17:01

"gun_dose" wrote:
Можно и без модуля, а всунуть в теме в препроцесс ноды.

Не стоит так делать, потому что
1. При каждом отображении ноды придется грузить все связанные ноды и делать одни и те же вычисления при каждом запросе, хотя их можно было бы сделать один раз при обновлении ноды Задание.
2. Если эти данные нужно отобразить во вьюхе или еще где-то, то для каждого случая писать препроцесс?
3. Не надо мешать обработку данных и отображение. Препроцесс нужен для того, чтобы менять выводмый html, а не для того, чтобы там обрабатывать данные. Для этого есть хуки.

PS. С таким подходом кастомные модули вообще не нужны, ведь достаточно препроцесса страницы.

Аватар пользователя serega111 serega111 28 мая 2015 в 22:09

"Nikolas" wrote:
А по запросам можете подсказать в какой архитектуре лучше делать из Rules?

Пять раз прочел, так и не понял, о чем вы спрашиваете.

Аватар пользователя Nikolas Nikolas 29 мая 2015 в 7:56

Видимо спросонья криво написал Smile
Синтаксис запросов интересует. Чтобы не в базу саму лезть, а средствами drupal api

Аватар пользователя serega111 serega111 29 мая 2015 в 9:41

чтобы получить значения полей ноды - field_get_items. Чтобы загрузить ноду из базы - node_load либо node_load_multiple. Но это если кастомный модуль будете писать. Если использовать Rules, то ничего этого не понадобится, все можно настроить через админку

Аватар пользователя sg85 sg85 29 мая 2015 в 15:25

"Nikolas" wrote:
Синтаксис запросов интересует. Чтобы не в базу саму лезть, а средствами drupal api

со связанными сущностями очень удобно работать через фабрику entity_metadata_wrapper() (модуль entity api), например:

  $result = 0;
  $wrapper = entity_metadata_wrapper('node', $node);
  foreach($wrapper->field_task as $task){
    if($value = $task->field_int->value()){
      $result += $value;
    }
  }
  return $result;

где $node - полностью загруженная сущность ноды, field_int и field_task - имена полей(последнее обязательно должно быть множественным)

Аватар пользователя Nikolas Nikolas 31 августа 2015 в 22:39

"sg85" wrote:
со связанными сущностями очень удобно работать через фабрику entity_metadata_wrapper() (модуль entity api), например:
$result = 0;
$wrapper = entity_metadata_wrapper('node', $node);
foreach($wrapper->field_task as $task){
if($value = $task->field_int->value()){
$result += $value;
}
}
return $result;

где $node - полностью загруженная сущность ноды, field_int и field_task - имена полей(последнее обязательно должно быть множественным)


Это помогло Smile
Спасибо! Smile

Аватар пользователя Nikolas Nikolas 2 сентября 2015 в 16:10

Почти помогло.
Если делать отдельный блок на странице ноды к которой привязано - тогда все работает.
Если же цеплять блок в вывод поля node reference или просто делать отдельно страницу со всеми заказами то ругается:
Unknown data property field_price.
Что может быть?

Все - понял - не было у нескольких старых контентов данных.
Удалил - помогло.

Аватар пользователя Nikolas Nikolas 9 сентября 2015 в 21:35

"sg85" wrote:
со связанными сущностями очень удобно работать через фабрику entity_metadata_wrapper() (модуль entity api), например:
$result = 0;
$wrapper = entity_metadata_wrapper('node', $node);
foreach($wrapper->field_task as $task){
if($value = $task->field_int->value()){
$result += $value;
}
}
return $result;

где $node - полностью загруженная сущность ноды, field_int и field_task - имена полей(последнее обязательно должно быть множественным)


Попробовал перейти на Entity reference - теперь данный код считает только первую позици, а остальные не суммирует.
куда копать?

Попробовал через Rules, но запутался.
Как там сделать выборку поочереди и сложить? php или можно средствами Rules?