View source
<?php
function content_form(&$form, &$form_state) {
$type = content_types($form['type']['#value']);
foreach ($type['fields'] as $field_name => $field) {
$form['#field_info'][$field['field_name']] = $field;
$form += (array) content_field_form($form, $form_state, $field);
}
return $form;
}
function content_field_form(&$form, &$form_state, $field, $get_delta = NULL) {
$form['#cache'] = FALSE;
$node = $form['#node'];
$addition = array();
$form_element = array();
$function = $field['widget']['module'] . '_widget';
$field_name = $field['field_name'];
if (function_exists($function)) {
$items = array();
if (!empty($form_state['values'][$field['field_name']])) {
$items = $form_state['values'][$field['field_name']];
}
elseif (!empty($node->{$field}['field_name'])) {
$items = $node->{$field}['field_name'];
}
elseif (empty($node->nid)) {
if (content_callback('widget', 'default value', $field) != CONTENT_CALLBACK_NONE) {
$callback = content_callback('widget', 'default value', $field) == CONTENT_CALLBACK_CUSTOM ? $field['widget']['module'] . '_default_value' : 'content_default_value';
if (function_exists($callback)) {
$items = $callback($form, $form_state, $field, 0);
}
}
}
if (!isset($get_delta) && content_handle('widget', 'multiple values', $field) == CONTENT_HANDLE_CORE) {
$form_element = content_multiple_value_form($form, $form_state, $field, $items);
}
else {
$delta = isset($get_delta) ? $get_delta : 0;
if ($element = $function($form, $form_state, $field, $items, $delta)) {
$defaults = array(
'#field_name' => $field['field_name'],
'#required' => $get_delta > 0 ? FALSE : $field['required'],
'#columns' => array_keys($field['columns']),
'#title' => t($field['widget']['label']),
'#delta' => $delta,
);
if (content_handle('widget', 'multiple values', $field) == CONTENT_HANDLE_CORE) {
$form_element[$delta] = array_merge($element, $defaults);
}
else {
$form_element = array_merge($element, $defaults);
}
}
}
if ($form_element) {
$defaults = array(
'#field_name' => $field['field_name'],
'#tree' => TRUE,
'#weight' => $field['widget']['weight'],
'#count' => count($form_element),
);
$addition[$field['field_name']] = array_merge($form_element, $defaults);
}
}
return $addition;
}
function content_multiple_value_form(&$form, &$form_state, $field, $items) {
$field_name = $field['field_name'];
switch ($field['multiple']) {
case 0:
$max = 0;
break;
case 1:
$max = isset($form_state['item_count'][$field_name]) ? $form_state['item_count'][$field_name] : count($items);
break;
default:
$max = $field['multiple'] - 1;
break;
}
$form_element = array(
'#theme' => 'content_multiple_values',
'#title' => t($field['widget']['label']),
'#required' => $field['required'],
'#description' => t($field['widget']['description']),
);
$function = $field['module'] . '_widget';
for ($delta = 0; $delta <= $max; $delta++) {
if ($element = $function($form, $form_state, $field, $items, $delta)) {
$defaults = array(
'#field_name' => $field_name,
'#title' => $field['multiple'] >= 1 ? '' : t($field['widget']['label']),
'#description' => $field['multiple'] >= 1 ? '' : t($field['widget']['description']),
'#required' => $delta == 0 && $field['required'],
'#weight' => $delta,
'#delta' => $delta,
'#columns' => array_keys($field['columns']),
);
if ($field['multiple'] >= 1) {
$element['_weight'] = array(
'#type' => $max < 10 ? 'weight' : 'textfield',
'#default_value' => $delta,
'#weight' => 100,
);
}
$form_element[$delta] = array_merge($element, $defaults);
}
}
if ($field['multiple'] == 1 && empty($form['#programmed'])) {
$form['#cache'] = TRUE;
$content_type = content_types($form['type']['#value']);
$field_name_css = str_replace('_', '-', $field_name);
$form_element[$field_name . '_add_more'] = array(
'#type' => 'submit',
'#value' => t('Add another !field value', array(
'!field' => t($field['widget']['label']),
)),
'#description' => t("If the amount of boxes above isn't enough, click here to add more items."),
'#weight' => $field['widget']['weight'] + $max + 1,
'#submit' => array(
'content_add_more_submit',
),
'#ahah' => array(
'path' => 'content/js_add_more/' . $content_type['url_str'] . '/' . $field_name,
'wrapper' => $field_name_css . '-items',
'method' => 'replace',
'effect' => 'fade',
),
);
$form_element['#prefix'] = '<div class="clear-block" id="' . $field_name_css . '-add-more-wrapper"><div id="' . $field_name_css . '-items">';
$form_element[$field_name . '_add_more']['#prefix'] = '<div class="content-add-more">';
$form_element[$field_name . '_add_more']['#suffix'] = '</div></div></div>';
}
return $form_element;
}
function content_add_more_submit($form, &$form_state) {
node_form_submit_build_node($form, $form_state);
$field_name = $form_state['clicked_button']['#field_name'];
$type_name = $form_state['clicked_button']['#type_name'];
foreach ($form['#field_info'] as $field_name => $field) {
if ($form_state['values'][$field_name][$field_name . '_add_more']) {
$form_state['item_count'][$field_name] = count($form_state['node'][$field_name]) + 1;
}
}
}
function content_add_more_js($type_name_url, $field_name) {
$type = content_types($type_name_url);
$field = content_fields($field_name, $type['type']);
if ($field['multiple'] != 1) {
drupal_json(array(
'status' => 0,
));
}
$_POST[$field_name] = _content_sort_items($field, $_POST[$field_name]);
$delta = max(array_keys($_POST[$field_name])) + 1;
$form_state = array(
'values' => $_POST,
);
$form = form_get_cache($_POST['form_build_id'], $form_state);
$form_element = content_field_form($form, $form_state, $field);
drupal_alter('form', $form_element, array(), 'content_add_more_js');
if (module_exists('fieldgroup') && ($group_name = _fieldgroup_field_get_group($type['type'], $field_name))) {
$form[$group_name][$field_name] = $form_element[$field_name];
}
else {
$form[$field_name] = $form_element[$field_name];
}
form_set_cache($_POST['form_build_id'], $form, $form_state);
$_POST[$field_name][$delta]['_weight'] = $delta;
$form_state = array(
'submitted' => FALSE,
);
$form += array(
'#post' => $_POST,
'#programmed' => FALSE,
);
$form = form_builder($_POST['form_id'], $form, $form_state);
$field_form = !empty($group_name) ? $form[$group_name][$field_name] : $form[$field_name];
$field_form[$delta]['#prefix'] = '<div class="ahah-new-content">' . (isset($field_form[$delta]['#prefix']) ? $field_form[$delta]['#prefix'] : '');
$field_form[$delta]['#suffix'] = (isset($field_form[$delta]['#suffix']) ? $field_form[$delta]['#suffix'] : '') . '</div>';
$output = theme('status_messages') . drupal_render($field_form);
drupal_json(array(
'status' => TRUE,
'data' => $output,
));
}