Skip to content

Instantly share code, notes, and snippets.

@fubarhouse
Forked from AlexSkrypnyk/mymodule.css
Last active February 20, 2018 03:34
Show Gist options
  • Save fubarhouse/0eedf1ebf8e6cb025126d3c3bedf5a9d to your computer and use it in GitHub Desktop.
Save fubarhouse/0eedf1ebf8e6cb025126d3c3bedf5a9d to your computer and use it in GitHub Desktop.
Multiple field API example including add/remove submit and callback functions.
<?php
/**
* @file
* Module file for add_more_example.
*/
/**
* Implements hook_menu().
*
* @inheritdoc
*/
function addmore_menu() {
$items = array();
$items['admin/snippet/addmore'] = array(
'title' => 'Example form',
'type' => MENU_CALLBACK,
'page callback' => 'drupal_get_form',
'page arguments' => array('addmore_form'),
'access callback' => TRUE,
);
return $items;
}
function addmore_form($form, &$form_state) {
$form['field_container'] = [
'#type' => 'container',
'#weight' => 80,
'#tree' => TRUE,
'#prefix' => '<div id="js-ajax-elements-wrapper">',
'#suffix' => '</div>',
];
$values = variable_get('testvar_one', NULL);
$form_state['field_deltas'] = isset($form_state['field_deltas']) ? $form_state['field_deltas'] : range(0, count($values) - 1);
foreach ((array) $form_state['field_deltas'] as $delta => $value) {
$form['field_container'][$delta] = [
'#type' => 'container',
'#attributes' => [
'class' => ['container-inline'],
],
'#tree' => TRUE,
];
$form['field_container'][$delta]['field1'] = [
'#type' => 'textfield',
'#title' => t('Field 1 - ' . $delta),
'#value' => $values[$delta],
'#size' => 10,
];
$form['field_container'][$delta]['remove_name'] = [
'#type' => 'submit',
'#value' => t('Remove'),
'#submit' => ['addmore_form_remove'],
'#ajax' => [
'callback' => 'addmore_form_remove_callback',
'wrapper' => 'js-ajax-elements-wrapper',
],
'#weight' => 50,
'#attributes' => [
'class' => ['button-small'],
],
'#name' => 'remove_name_' . $delta,
];
}
// Submit buttons.
$form['field_container']['add_name'] = [
'#type' => 'submit',
'#value' => t('Add one more'),
'#submit' => ['addmore_form_add'],
'#ajax' => [
'callback' => 'addmore_form_add_callback',
'wrapper' => 'js-ajax-elements-wrapper',
],
'#weight' => 100,
];
$form['submit'] = [
'#type' => 'submit',
'#value' => t('Submit'),
'#submit' => ['addmore_submit'],
'#weight' => 150,
];
$form['other_field'] = [
'#type' => 'textfield',
'#title' => t('Other field'),
];
return $form;
}
/**
* Remove submit function
*/
function addmore_form_remove($form, &$form_state) {
$delta_remove = $form_state['triggering_element']['#parents'][1];
$k = array_search($delta_remove, $form_state['field_deltas']);
unset($form_state['field_deltas'][$k]);
$form_state['rebuild'] = TRUE;
drupal_get_messages();
}
/**
* Remove callback.
*/
function addmore_form_remove_callback($form, &$form_state) {
return $form['field_container'];
}
/**
* Add submit function.
*/
function addmore_form_add($form, &$form_state) {
$form_state['field_deltas'][] = count($form_state['field_deltas']) > 0 ? max($form_state['field_deltas']) + 1 : 0;
$fs['field_deltas'] = $form_state['field_deltas'];
$fs['field_deltas'][] = count($form_state['field_deltas']) > 0 ? max($form_state['field_deltas']) + 1 : 0;
$form_state['rebuild'] = TRUE;
drupal_get_messages();
}
/**
* Add callback.
*/
function addmore_form_add_callback($form, $form_state) {
return $form['field_container'];
}
function addmore_submit($form, $form_state) {
print '';
variable_set('testvar_one', $form_state['input']['field_container']);
$x = variable_get('testvar_one', NULL);
print '';
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment