Добрый день!
Есть нода Смена, в ней поле, которое ссылается на другие типа Задание
В Задании поле с числовым значением Сделано.
Надо чтобы в материале Смена было поле, которое содержит в себе сумму значений Сделано из привязанных Заданий.
Как это можно сделать?
Просто вывести таблицу - разобрался, в ней можно показать при помощи Views Calc сумму этих Сделано, но данную сумму надо использовать и в других местах - надо как-то ее в поле записать автоматически. реально?
Чем можно сделать и как?
Комментарии
через рулесы пересчитывать при сохранении каждого задания и сохранять в отдельном поле в Смена.
Либо кастомный модуль, выполняющий то же самое
Можно и без модуля, а всунуть в теме в препроцесс ноды.
Не стоит так делать, потому что
1. При каждом отображении ноды придется грузить все связанные ноды и делать одни и те же вычисления при каждом запросе, хотя их можно было бы сделать один раз при обновлении ноды Задание.
2. Если эти данные нужно отобразить во вьюхе или еще где-то, то для каждого случая писать препроцесс?
3. Не надо мешать обработку данных и отображение. Препроцесс нужен для того, чтобы менять выводмый html, а не для того, чтобы там обрабатывать данные. Для этого есть хуки.
PS. С таким подходом кастомные модули вообще не нужны, ведь достаточно препроцесса страницы.
А по запросам можете подсказать в какой архитектуре лучше делать из Rules?
А по запросам можете подсказать в какой архитектуре лучше делать из Rules?
Пять раз прочел, так и не понял, о чем вы спрашиваете.
Видимо спросонья криво написал
Синтаксис запросов интересует. Чтобы не в базу саму лезть, а средствами drupal api
чтобы получить значения полей ноды - field_get_items. Чтобы загрузить ноду из базы - node_load либо node_load_multiple. Но это если кастомный модуль будете писать. Если использовать Rules, то ничего этого не понадобится, все можно настроить через админку
со связанными сущностями очень удобно работать через фабрику entity_metadata_wrapper() (модуль entity api), например:
$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 - имена полей(последнее обязательно должно быть множественным)
Это помогло
Спасибо!
Почти помогло.
Если делать отдельный блок на странице ноды к которой привязано - тогда все работает.
Если же цеплять блок в вывод поля node reference или просто делать отдельно страницу со всеми заказами то ругается:
Unknown data property field_price.
Что может быть?
Все - понял - не было у нескольких старых контентов данных.
Удалил - помогло.
Попробовал перейти на Entity reference - теперь данный код считает только первую позици, а остальные не суммирует.
куда копать?
Попробовал через Rules, но запутался.
Как там сделать выборку поочереди и сложить? php или можно средствами Rules?