By amirn on
Hi,
I've created a module that creates a form which has an 'Add' button. clicking it adds a new row to the from (themed as table)
my problem is that the old values in the form are not saved and reset to their defaults each time I click 'Add'
Any ideas?
source attached: (form in question is 'new_product_form' )
<?php
function elib_menu() {
$items = array();
$items['elib'] = array(
'title' => 'elib test',
'page callback' => 'page_elib',
'access callback' => 'access_elib',
'access arguments' => array('elib'),
'type' => MENU_CALLBACK,
);
$items['test/ahah_js'] = array(
'page callback' => 'test_ahah1',
'type' => MENU_CALLBACK,
'access callback' => 'access_elib',
'access arguments' => array('elib'),
);
return $items;
}
function access_elib($account) {
return TRUE;
}
function page_elib()
{
$output = drupal_get_form('featured_product_form');
$output .= drupal_get_form('new_product_form');
return $output;
}
// main form
function featured_product_form() {
drupal_add_js('misc/collapse.js');
for ($i = 0 ;$i<3; ++$i)
{
$form['portfolio'][$i]['feat'] = array('#type' => 'checkbox');
$form['portfolio'][$i]['name'] = array('#type' => 'item', '#value' => 'name'.$i);
$form['portfolio'][$i]['category'] = array('#type' => 'textfield', '#size' => 12, '#default_value' => $i);
$form['portfolio'][$i]['discount'] = array('#type' => 'item', '#value' => '0%');
$form['portfolio'][$i]['createdon'] = array('#type' => 'item', '#value' => date('m-d-Y'));
$form['portfolio'][$i]['cat'] = array('#type' => 'select', '#default_value' => $data->cid, '#options' => array(1 => t('cat1'), 2 => t('cat2')) );
}
$form['portfolio']['#tree'] = TRUE;
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Submit'),
);
$form['cancel'] = array(
'#type' => 'markup',
'#value' => l(t('Cancel'), 'elib'),
);
$form['#redirect'] = 'elib';
return $form;
}
// new product form
function new_product_form() {
//drupal_add_js('misc/collapse.js');
$form['#prefix'] = '<div id="new_form_wrapper">';
$form['#suffix'] = '</div>';
$nkey = variable_get('new_key', 4);
$nkey++;
variable_set('new_key',$nkey);
$form['portfolio'][$nkey]['feat'] = array('#type' => 'checkbox');
$form['portfolio'][$nkey]['name'] = array('#type' => 'item', '#value' => 'bla'.$nkey);
$form['portfolio'][$nkey]['category'] = array('#type' => 'textfield', '#size' => 12, '#default_value' => 0);
$form['portfolio'][$nkey]['discount'] = array('#type' => 'item', '#value' => '0%');
$form['portfolio'][$nkey]['createdon'] = array('#type' => 'item', '#value' => 'NEW');
$form['portfolio'][$nkey]['cat'] = array('#type' => 'select', '#default_value' => 1, '#options' => array(1 => t('cat1'), 2 => t('cat2')) );
$form['portfolio']['#tree'] = TRUE;
$form['add'] = array(
'#type' => 'submit',
'#value' => t('Add'),
'#ahah' => array(
'event' => 'click',
'path' => 'test/ahah_js',
'wrapper' => 'new_form_wrapper',
'method' => 'replace',
'effect' => 'fade',
)
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Submit'),
);
$form['cancel'] = array(
'#type' => 'markup',
'#value' => l(t('Cancel'), 'elib'),
);
$form['#redirect'] = 'elib';
return $form;
}
// ahah callback
function test_ahah1() {
$form_state = array('submitted' => FALSE, 'values' => $_POST, 'rebuild' => TRUE);
$form_id = $_POST['form_id'];
$form_build_id = $_POST['form_build_id'];
$form = form_get_cache($form_build_id, $form_state);
$nkey = variable_get('new_key', 4);
$nkey++;
variable_set('new_key',$nkey);
$form['portfolio'][$nkey]['feat'] = array('#type' => 'checkbox');
$form['portfolio'][$nkey]['name'] = array('#type' => 'item', '#value' => 'bla');
$form['portfolio'][$nkey]['category'] = array('#type' => 'textfield', '#size' => 12, '#default_value' => 0);
$form['portfolio'][$nkey]['discount'] = array('#type' => 'item', '#value' => '0%');
$form['portfolio'][$nkey]['createdon'] = array('#type' => 'item', '#value' => 'NEW');
$form['portfolio'][$nkey]['cat'] = array('#type' => 'select', '#default_value' => 1, '#options' => array(1 => t('cat1'), 2 => t('cat2')) );
form_set_cache($form_build_id, $form, $form_state);
// Rebuild the form.
$form = form_builder($_POST['form_id'], $form, $form_state);
// Render the new output.
$output = theme('new_product_form', $form);
drupal_json(array('status' => TRUE, 'data' => $output));
}
// submit main form
function featured_product_form_submit($form, &$form_state) {
$form_values = $form_state['values'];
drupal_set_message(t('main form submitted: ').$form_values);
}
// submit new form
function new_product_form_submit($form, &$form_state) {
//dsm($form_state);
$form_values = $form_state['values'];
drupal_set_message(t('new form submitted: ').$form_values);
}
// hook theme
function elib_theme() {
return array(
'featured_product_form' => array('arguments' => array('form' => NULL),),
'new_product_form' => array('arguments' => array('form' => NULL),),
);
}
// theme for main form
function theme_featured_product_form($form) {
$rows = array();
foreach (element_children($form['portfolio']) as $key) {
$row = array();
if (isset($form['portfolio'][$key]['name'])) {
$status = drupal_render($form['portfolio'][$key]['feat']);
$row[] = array('data' => $status, 'class' => 'checkbox');
$row[] = array('data' => drupal_render($form['portfolio'][$key]['name']));
$row[] = array('data' => drupal_render($form['portfolio'][$key]['category']));
$row[] = array('data' => drupal_render($form['portfolio'][$key]['cat']));
$row[] = array('data' => drupal_render($form['portfolio'][$key]['discount']));
$row[] = array('data' => drupal_render($form['portfolio'][$key]['createdon']));
$rows[] = $row;
}
}
// table headers.
$header = array();
$header[] = array('data' => t('Featured'), 'class' => 'checkbox');
$header[] = t('Name');
$header[] = t('Category');
$header[] = t('Cat');
$header[] = t('Discount');
$header[] = t('Created on');
$output = '<fieldset id="mydiv1" class=" collapsible"><legend>My Portfolio</legend>';
$output .= theme('table', $header, $rows);
$output .= '</fieldset>';
$output .= drupal_render($form);
return $output;
}
// theme for new product form
function theme_new_product_form($form) {
$rows = array();
foreach (element_children($form['portfolio']) as $key) {
$row = array();
if (isset($form['portfolio'][$key]['name'])) {
$status = drupal_render($form['portfolio'][$key]['feat']);
$row[] = array('data' => $status, 'class' => 'checkbox');
$row[] = array('data' => drupal_render($form['portfolio'][$key]['name']));
$row[] = array('data' => drupal_render($form['portfolio'][$key]['category']));
$row[] = array('data' => drupal_render($form['portfolio'][$key]['cat']));
$row[] = array('data' => drupal_render($form['portfolio'][$key]['discount']));
$row[] = array('data' => drupal_render($form['portfolio'][$key]['createdon']));
$rows[] = $row;
}
}
// table headers.
$header = array();
$header[] = array('data' => t('Featured'), 'class' => 'checkbox');
$header[] = t('Name');
$header[] = t('Category');
$header[] = t('Cat');
$header[] = t('Discount');
$header[] = t('Created on');
$output = '<fieldset id="target" class=" collapsible"><legend>New Items</legend>';
$output .= theme('table', $header, $rows);
$output .= '</fieldset>';
$output .= drupal_render($form);
return $output;
}
Comments
Issues with $form_state and #value
I have had issues with form_state retaining values across multi step forms and on researching the API and the forums found the following posts that might be relevant to the problem that you are facing.
http://drupal.org/node/386678 and
http://drupal.org/node/350648
Hope this helps
Acer Aspire 5745
[i5 430M, 3GB, 320GB]
Ubuntu 12.04 (Precise Pangolin)
Drupal 6.15, 7.x
DigitalOcean, Go Daddy, Rackspace,
thanks, but I've decided to move to D7
and it seems to work better for me.
You need to add a
You need to add a $default_value to the form elements. The default value will be in $form_state.
But D7 #ajax is definitely easier than D5/6 #ahah.
Contact me to contract me for D7 -> D10/11 migrations.
where were you 3 weeks ago :)
but, I think D7 is better choice for me as I have a lot of Ajax in my project.
btw, I've run into a problem with D7 forms/ajax, I've opened a new topic here: http://drupal.org/node/1150006
Thanks.