Задать значение для поля field collection

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

Аватар пользователя gera8774 gera8774 1 июня 2023 в 14:18

Всем здравствуйте! Есть тип материала contracts, среди его полей есть поле field_extras - тип field collection.
В этой коллекции есть поле field_extra_number - это порядковый номер, принимает целое число. Я хочу задавать его программно, но не получается.
Пробую с помощью hook_node_presave примерно так:

function mymodule_node_presave($node) {
if ($node->type =='contracts') {
foreach ($node->field_extras['und'] as $elem) {
$collection_entity_id = $elem['value'];
$full_entity = field_collection_item_load($collection_entity_id);
$full_entity->field_extra_number = 77;//пробую установить всем приложениям номер 77
}
}
}

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

По сути мне надо, чтобы каждому приложению присваивался уникальный порядковый номер в рамках одной ноды. Пробовала через модуль Serial, но тогда нумерация идет так: у одной ноды приложения 1,2,3 а у второй уже 4,5,6
А надо, чтобы у каждой ноды была своя нумерация.
Может я изобретаю велосипед и есть что-то готовое?

Комментарии

Аватар пользователя files32 files32 9 июня 2023 в 10:58

Ваша функция hook_node_presave почти верна, но есть несколько вещей, которые стоит учесть.

Во-первых, когда вы меняете значения полей сущности (в данном случае, элемента коллекции полей), вам нужно вызвать метод save() у этой сущности, чтобы сохранить изменения в базе данных.

Во-вторых, вам нужно гарантировать, что у каждого элемента коллекции полей в рамках одной ноды будет уникальное значение field_extra_number. Для этого вы можете использовать счетчик, который увеличивается при каждом проходе цикла.

Ниже приведен обновленный код, который должен работать для вашего случая:

<?php
function mymodule_node_presave($node) {
  if (
$node->type == 'contracts' && isset($node->field_extras['und'])) {
    
$counter 1// Счетчик для уникального номера.
    
foreach ($node->field_extras['und'] as $elem) {
      
$collection_entity_id $elem['value'];
      
$full_entity field_collection_item_load($collection_entity_id);
      
$full_entity->field_extra_number['und'][0]['value'] = $counter// Устанавливаем уникальный номер.
      
$full_entity->save(); // Сохраняем изменения.
      
$counter++; // Увеличиваем счетчик.
    
}
  }
}
?>

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

Также, учтите, что это будет работать только для одного языка ('und'). Если ваш сайт многоязычный, вам нужно учитывать язык при работе с полями.

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