Я потратил много времени чтобы найти решение следующей задачи
Есть тип материала: $node->type == 'product_template'
скриншот:
Каждый элемент (Item) в Field Сollection (field_properties) состоит из - скриншот:
Задача: программно сделать, чтобы при добавлении новой ноды этого типа материала
в форме добавления было так как на скриншоте:
из гугла нарыл вот этот материал:
drupal.cocomore.com/blog/field-collections-exposed
но не получается, слишком много куда нужно сохранить привязки в структурах массивов $form и $form_state
Пример моего кода который альтерит форму добавления материала и добавляет как в шаблонной ноде nid==22.
/**
* Implements hook_form_alter().
*/
function nxte_database_form_alter(&$form, &$form_state, $form_id) {
if($form_id == 'product_template_node_form'){
if(!isset($form['nid']['#value'])){
dsm('is_new');
dsm($form);
dsm($form_state);
//unset($form['#node']);
//unset($form['#entity']);
//var_dump($form);
//exit;
$original_node = node_load(22);
// Get the fields defined for this node type;
$node_fields = field_info_instances('node', $node_type);
// Re-create the fields for the original node, like when editing it
$tmpform = array();
$tmpform['#node'] = $original_node;
$tmpform['type']['#value'] = $node_type;
$tmpform_state = array( 'build_info' => array('form_id' => $form['#form_id']) );
field_attach_form('node', $original_node, $tmpform, $tmpform_state, entity_language('node', $original_node));
// Here we have on $tmpform the form structure we need and with the default values.
// We can choose what fields to clone, but in this example we will loop over all the node fields and clone all of them
foreach($node_fields as $field_name => $field_settings) {
// Copy the form structure
$form[$field_name] = $tmpform[$field_name];
// Copy state information about this field
$form_state['field'][$field_name] = $tmpform_state['field'][$field_name];
// When copying the field_collection structure, reset the id of the entities and
// they will be created again with a new id.
$langcode = field_language('node', $original_node, $field_name);
if ($form_state['field'][$field_name][$langcode]['field']['type'] == 'field_collection') {
$field_childs = &$form_state['field'][$field_name][$langcode]['entity'];
foreach(element_children($field_childs) as $idx => $fc_entity) {
$field_childs[$idx]->item_id = NULL;
$field_childs[$idx]->revision_id = NULL;
}
}
}
}
}
}
но при попытке сохранить или добавить очередной элемент в FieldCollection выскакивает ошибка