diff --git a/inline_entity_form.module b/inline_entity_form.module index 70935fb..2453651 100644 --- a/inline_entity_form.module +++ b/inline_entity_form.module @@ -244,6 +244,20 @@ function inline_entity_form_field_widget_info() { 'default value' => FIELD_BEHAVIOR_NONE, ), ); + + $widgets['inline_entity_form_multiple_edit'] = array( + 'label' => t('Inline entity form - Multiple values with direct edit'), + 'field types' => array('commerce_line_item_reference', 'commerce_product_reference', 'entityreference'), + 'settings' => array( + 'fields' => array(), + 'type_settings' => array(), + ), + 'behaviors' => array( + 'multiple values' => FIELD_BEHAVIOR_DEFAULT, + 'default value' => FIELD_BEHAVIOR_NONE, + ), + ); + $widgets['inline_entity_form'] = array( 'label' => t('Inline entity form - Multiple values'), 'field types' => array('commerce_line_item_reference', 'commerce_product_reference', 'entityreference'), @@ -481,7 +495,7 @@ function inline_entity_form_field_widget_form(&$form, &$form_state, $field, $ins // Build the appropriate widget. // The "Single value" widget assumes it is operating on a required single // value reference field with 1 allowed bundle. - if ($widget['type'] == 'inline_entity_form_single') { + if ($widget['type'] == 'inline_entity_form_single' || $widget['type'] == 'inline_entity_form_multiple_edit') { // Intentionally not using $settings['create_bundles'] here because this // widget doesn't care about permissions because of its use case. $bundle = reset($settings['bundles']); @@ -501,7 +515,7 @@ function inline_entity_form_field_widget_form(&$form, &$form_state, $field, $ins '#op' => 'add', // Used by Field API and controller methods to find the relevant // values in $form_state. - '#parents' => array_merge($parents, array('form')), + '#parents' => array_merge($parents, array('form', $element['#delta'])), // Pass the current entity type. '#entity_type' => $settings['entity_type'], // Pass the langcode of the parent entity, @@ -511,8 +525,26 @@ function inline_entity_form_field_widget_form(&$form, &$form_state, $field, $ins ); if (!empty($form_state['inline_entity_form'][$ief_id]['entities'])) { $element['form']['#op'] = 'edit'; - $element['form']['#entity'] = $form_state['inline_entity_form'][$ief_id]['entities'][0]['entity']; - $element['form']['#ief_row_delta'] = 0; + + // Adds entities to the form. + if($widget['type'] == 'inline_entity_form_single') { + $element['form']['#entity'] = $form_state['inline_entity_form'][$ief_id]['entities'][0]['entity']; + $element['form']['#ief_row_delta'] = 0; + } + else if ($widget['type'] == 'inline_entity_form_multiple_edit') { + if (isset($form_state['inline_entity_form'][$ief_id]['entities'][$element['#delta']]['entity'])) { + $element['form']['#entity'] = $form_state['inline_entity_form'][$ief_id]['entities'][$element['#delta']]['entity']; + } + else { + $element['form']['#entity'] = inline_entity_form_create_entity($settings['entity_type'], $settings['entity_type'], $parent_langcode); + } + + $element['form']['#ief_row_delta'] = $element['#delta']; + } + } + + if ($widget['type'] == 'inline_entity_form_multiple_edit') { + $element['form']['#multiple_direct_edit'] = TRUE; } $element['form'] = inline_entity_form_entity_form($controller, $element['form'], $form_state); @@ -745,7 +777,7 @@ function inline_entity_form_field_widget_form(&$form, &$form_state, $field, $ins '#ief_id' => $ief_id, // Used by Field API and controller methods to find the relevant // values in $form_state. - '#parents' => array_merge($parents, array('form')), + '#parents' => array_merge($parents, array('form', $element['#delta'])), // Pass the current entity type. '#entity_type' => $settings['entity_type'], // Pass the langcode of the parent entity, @@ -969,6 +1001,7 @@ function inline_entity_form_entity_form_validate(&$entity_form, &$form_state) { function inline_entity_form_entity_form_submit($entity_form, &$form_state) { $ief_id = $entity_form['#ief_id']; $instance = $form_state['inline_entity_form'][$ief_id]['instance']; + // Instantiate the controller and validate the form. $controller = inline_entity_form_get_controller($instance); $controller->entityFormSubmit($entity_form, $form_state); @@ -990,8 +1023,36 @@ function inline_entity_form_entity_form_submit($entity_form, &$form_state) { } else { $delta = $entity_form['#ief_row_delta']; + + // In case of direct edit we need to fix the order. + if (isset($entity_form['#multiple_direct_edit'])) { + $unsorted_items = $form_state['values'][$instance['field_name']][LANGUAGE_NONE]; + + // Check values present that are not fields. + if (!empty($unsorted_items)) { + foreach ($unsorted_items as $key => $value) { + // It is not a field. + if (!is_numeric($key)) { + unset($unsorted_items[$key]); + } + } + } + + // Sort the values by _weight. + uasort($unsorted_items, '_field_sort_items_helper'); + + // Get the new delta. + if (empty($form_state['inline_entity_form'][$ief_id]['entities'][$delta]['entity'])) { + $delta = max(array_keys($form_state['inline_entity_form'][$ief_id]['entities'])) + 1; + } + else { + $delta = array_search($entity_form['#ief_row_delta'], array_keys($unsorted_items)); + } + } + $form_state['inline_entity_form'][$ief_id]['entities'][$delta]['entity'] = $entity_form['#entity']; $form_state['inline_entity_form'][$ief_id]['entities'][$delta]['needs_save'] = TRUE; + $form_state['inline_entity_form'][$ief_id]['entities'][$delta]['weight'] = $delta; } }