diff --git a/entityreference.module b/entityreference.module index dc5e004..7e039af 100644 --- a/entityreference.module +++ b/entityreference.module @@ -283,17 +283,106 @@ function entityreference_field_widget_form(&$form, &$form_state, $field, $instan } $entity_labels[] = $key; } - - return $element + array( - '#type' => 'textfield', - '#maxlength' => 1024, - '#default_value' => implode(', ', $entity_labels), - '#autocomplete_path' => $instance['widget']['settings']['path'] . '/' . $field['field_name'] . '/' . $instance['entity_type'] . '/' . $instance['bundle'], - '#size' => $instance['widget']['settings']['size'], - '#element_validate' => array('_entityreference_autocomplete_validate'), - ); + + $field_name = $field['field_name']; + $parents = $form['#parents']; + // Determine the number of widgets to display. + switch ($field['cardinality']) { + case FIELD_CARDINALITY_UNLIMITED: + $field_state = field_form_get_state($parents, $field_name, $langcode, $form_state); + $max = $field_state['items_count']; + break; + + default: + $max = $field['cardinality'] - 1; + break; + } + + $title = check_plain($instance['label']); + $description = field_filter_xss($instance['description']); + + $id_prefix = implode('-', array_merge($parents, array($field_name))); + $wrapper_id = drupal_html_id($id_prefix . '-add-more-wrapper'); + + $field_elements = array(); + + + for ($delta = 0; $delta <= $max; $delta++) { + $multiple = $field['cardinality'] > 1 || $field['cardinality'] == FIELD_CARDINALITY_UNLIMITED; + $element['value'] = array( + '#type' => 'textfield', + '#maxlength' => 1024, + '#autocomplete_path' => $instance['widget']['settings']['path'] . '/' . $field['field_name'] . '/' . $instance['entity_type'] . '/' . $instance['bundle'], + '#size' => $instance['widget']['settings']['size'], + '#element_validate' => array('_entityreference_autocomplete_validate'), + '#entity_type' => $instance['entity_type'], + '#bundle' => $instance['bundle'], + '#field_name' => $field_name, + '#language' => $langcode, + '#field_parents' => $parents, + '#columns' => array_keys($field['columns']), + // Only the first widget should be required. + '#required' => $delta == 0 && $instance['required'], + '#delta' => $delta, + '#weight' => $delta, + ); + + if (!empty($entity_labels[$delta])) { + $element['#default_value'] = $entity_labels[$delta]; + } + + // Input field for the delta (drag-n-drop reordering). + if ($multiple) { + // We name the element '_weight' to avoid clashing with elements + // defined by widget. + $element['_weight'] = array( + '#type' => 'weight', + '#title' => t('Weight for row @number', array('@number' => $delta + 1)), + '#title_display' => 'invisible', + // Note: this 'delta' is the FAPI 'weight' element's property. + '#delta' => $max, + '#default_value' => isset($items[$delta]['_weight']) ? $items[$delta]['_weight'] : $delta, + '#weight' => 100, + ); + } + + $field_elements[$delta] = $element; + + if ($field_elements) { + $field_elements += array( + '#theme' => 'field_multiple_value_form', + '#field_name' => $field['field_name'], + '#cardinality' => $field['cardinality'], + '#title' => $title, + '#required' => $instance['required'], + '#description' => $description, + '#prefix' => '
', + '#suffix' => '
', + '#max_delta' => $max, + ); + // Add 'add more' button, if not working with a programmed form. + if ($field['cardinality'] == FIELD_CARDINALITY_UNLIMITED && empty($form_state['programmed'])) { + $field_elements['add_more'] = array( + '#type' => 'submit', + '#name' => strtr($id_prefix, '-', '_') . '_add_more', + '#value' => t('Add another item'), + '#attributes' => array('class' => array('field-add-more-submit')), + '#limit_validation_errors' => array(array_merge($parents, array($field_name, $langcode))), + '#submit' => array('field_add_more_submit'), + '#ajax' => array( + 'callback' => 'field_add_more_js', + 'wrapper' => $wrapper_id, + 'effect' => 'fade', + ), + ); + } + } + } + + return $field_elements; } return $element; + } function _entityreference_autocomplete_validate($element, &$form_state, $form) {