2014-10-22 2 views

ответ

0

Уже нашли ответ. Я использую hook_node_presave, а затем переупорядочу массив массивов полей. Раньше я использовал hook_node_update, и это не сработало.

+0

хорошо для вас. Пожалуйста, поделитесь кодом –

0

Это фрагмент кода для сортировки коллекции полей любым из его полей перед сохранением узла:

function your_module_node_presave($node){ 
    if ($node->type == 'foo') { 
    // We must sort by this field collection field 
    if (!empty($node->field_to_sort_by)) { 

     // Get the values of the sorting field. We must load the fc items for this. 
     $items = field_get_items('node', $node, 'field_to_sort_by'); 
     foreach ($items as $item) { 
     $fc[] = field_collection_field_get_entity($item); 
     } 

     // field collection fields on nodes only contains 'value' and 'revision_id'. 
     // We temporarily add the field to sort by, 
     // for using the convenient uasort() function over the array. 
     $tmp_array = $node->field_to_sort_by[LANGUAGE_NONE]; 
     foreach ($tmp_array as $key => $item) { 
     $tmp_array[$key]['sortfield'] = $fc[$key]->field_to_sort_by[LANGUAGE_NONE][0]['value']; 
     } 

     // Now we sort the node's field array using uasort(). 
     usort($tmp_array, 'my_module_sortByField_asc'); 

     // unset the sorting field before updating node's field collection 
     foreach ($tmp_array as $key => $item) { 
     unset($tmp_array[$key]['sortfield']); 
     } 

     $node->field_to_sort_by[LANGUAGE_NONE] = $tmp_array; 
    } 

    } 
} 

function my_module_sortByField_asc($a, $b) { 
    return $a['sortfield'] - $b['sortfield']; 
} 

Смежные вопросы