diff --git a/docroot/sites/all/modules/contrib/inline_entity_form/inline_entity_form.module b/docroot/sites/all/modules/contrib/inline_entity_form/inline_entity_form.module index d5fb20a..91d715d 100644 --- a/docroot/sites/all/modules/contrib/inline_entity_form/inline_entity_form.module +++ b/docroot/sites/all/modules/contrib/inline_entity_form/inline_entity_form.module @@ -243,6 +243,20 @@ function inline_entity_form_field_widget_info() { 'default value' => FIELD_BEHAVIOR_NONE, ), ); + + $widgets['inline_entity_form_multiple_direct_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'), @@ -456,7 +470,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_direct_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']); @@ -476,7 +490,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, @@ -486,8 +500,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_direct_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_direct_edit') { + $element['form']['#multiple_direct_edit'] = TRUE; } $element['form'] = inline_entity_form_entity_form($controller, $element['form'], $form_state); @@ -709,7 +741,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, @@ -855,6 +887,37 @@ function inline_entity_form_process_entity_form(&$entity_form, &$form_state) { // If validation passed, execute the submission handler. if (!form_get_errors()) { + + // check if values are empty if we are in direct edit + $entity_values = drupal_array_get_nested_value($form_state['values'], $entity_form['#parents']); + $values_excluding_fields = $info['fieldable'] ? array_diff_key($entity_values, field_info_instances($this->entityType, $bundle)) : $entity_values; + + // inc case of multiple direct edit we can't insert blank values + if (isset($entity_form['#multiple_direct_edit'])) { + $is_entity_empty = TRUE; + foreach ($values_excluding_fields as $key => $value) { + $info = field_info_field($key); + + // not a valid field + if (empty($info)) + continue; + + // ignore checkboxes + if ($info['type'] == 'list_boolean') + continue; + + $function = $info['module'] . '_field_is_empty'; + if (!($function($value[LANGUAGE_NONE][0], $info))) { + $is_entity_empty = FALSE; + } + } + + // entity is blank, ignore it + if ($is_entity_empty) { + return; + } + } + $controller->entityFormSubmit($entity_form, $form_state); $entity = $entity_form['#entity']; @@ -874,8 +937,35 @@ function inline_entity_form_process_entity_form(&$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) { + if (!is_numeric($key)) { + // it is not a field + 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; } } }