I've created a form with a themer, and found that if the form contains a lot of controls (say >200), drupal refuses to execute validate and submit when clicking submit button. it works fine with small amount of controls.

I'll post my code if it may help.

Comments

fundawang’s picture

function score_gaokao_province_detail_form() {
	$province=arg(2);
	$form=array();
	$rdbo = db_query(
		'SELECT sg.*, u.uid as userid, s.name, s.idcard_number, s.gender FROM {vl_province} p '.
		'INNER JOIN {students_gk} sg ON p.pid=sg.province '.
		'INNER JOIN {students} s ON sg.uid=s.uid '.
		'INNER JOIN {users} u ON u.name=s.uid '.
		'WHERE s.pass_round3_major>0 AND p.pid=%s ORDER BY s.profession_major, sg.sid, s.name', $province);

	while($r=db_fetch_object($rdbo)) {
		$form['uid'][$r->uid]=array('#type'=>'hidden','#value'=>$r->uid);
		$form['_sid-'.$r->uid]=array('#type'=>'textfield','#default_value'=>$r->sid,'#size'=>17,'#maxlength'=>14);
		//$form['idcard_number'][$r->uid]=array('#value'=>$r->idcard_number);
		$form['prof'][$r->uid]=array('#value'=>db_result(db_query('SELECT p.pname FROM vl_professions p INNER JOIN students s ON '.
			"s.profession_major=p.pid WHERE s.uid='%s'", $r->uid)));
		$form['name'][$r->uid]=array('#value'=>'<nobr>'.l($r->name,'user/'.$r->userid,array('attributes'=>array('title'=>$r->idcard_number))).'</nobr>',);
		$form['_sis-'.$r->uid]=array('#type'=>'checkbox','#default_value'=>$r->is_math_subjects);
		$form['_sch-'.$r->uid]=array('#type'=>'textfield','#default_value'=>$r->score_chinese,'#size'=>4,'#maxlength'=>6);
		$form['_slg-'.$r->uid]=array('#type'=>'textfield','#default_value'=>$r->score_languages,'#size'=>4,'#maxlength'=>6);
		$form['_smt-'.$r->uid]=array('#type'=>'textfield','#default_value'=>$r->score_math,'#size'=>4,'#maxlength'=>6);
		$form['_sst-'.$r->uid]=array('#type'=>'textfield','#default_value'=>$r->score_synthesis,'#size'=>4,'#maxlength'=>6);
		$form['validated-'.$r->uid]=array('#type'=>'checkbox', '#default_value'=>$r->validated);
		$form['memory-'.$r->uid]=array('#type'=>'textfield','#default_value'=>$r->memory,'#size'=>6,'#maxlength'=>4);
	}
	
	$form['submit']=array('#type'=>'submit','#value'=>t('Save'));
	
	return $form;
}

function theme_score_gaokao_province_detail_form($form) {
	$output = '';
	$header=array(
		array('data'=>t('Gaokao SID')),
		array('data'=>t('Real Name')),
		array('data'=>t('Profession')),
		array('data'=>t('Is Science subject')),
		array('data'=>t('Chinese')),
		array('data'=>t('Math')),
		array('data'=>t('Foreign language')),
		array('data'=>t('Synthesis subject')),
		array('data'=>t('Validated')),
		array('data'=>t('Memory')),
	);
	
	foreach(element_children($form['uid']) as $u) {
		$rows[]=array(
			drupal_render($form['_sid-'.$u]),
			//drupal_render($form['idcard_number'][$u]),
			drupal_render($form['name'][$u]),
			drupal_render($form['prof'][$u]),
			drupal_render($form['_sis-'.$u]),
			drupal_render($form['_sch-'.$u]),
			drupal_render($form['_smt-'.$u]),
			drupal_render($form['_slg-'.$u]),
			drupal_render($form['_sst-'.$u]),
			drupal_render($form['validated-'.$u]),
			drupal_render($form['memory-'.$u]),
		);
	}
	$output.=theme('table', $header, $rows);
	$output.=drupal_render($form['submit']);
	$output.=drupal_render($form);

	return $output;

}

function score_gaokao_province_detail_form_validate($form, &$form_state) {
	$form_values=$form_state['values'];
	$keys=array_keys($form_values);
	foreach($keys as $key) {
		switch(substr($key,0,4)) {
			case '_sid': 
				if($form_values[$key] && !preg_match('/08\d{12}/', $form_values[$key]))
					form_set_error($key, t('The student gaokao ID you\'ve entered is not valid.'));
				break;
			case '_sch':
			case '_slg':
			case '_smt':
			case '_sst':
				if(!is_numeric($form_values[$key]))
					form_set_error($key, t('The score you\'ve entered is not valid.'));
		}
	}
}

function score_gaokao_province_detail_form_submit($form, &$form_state) {
	$form_values=$form_state['values'];
	//var_dump($form_values);exit;
	$keys=array_keys($form_values);
	foreach($keys as $key) {
		if(substr($key,0,5)!='2008B') continue;
		$sql=sprintf('UPDATE {students_gk} SET '.
			"sid='%s', is_math_subjects=%s, ".
			"score_chinese=%s, score_languages=%s, ".
			"score_math=%s, score_synthesis=%s, ".
			"validated=%s, memory='%s' ".
			"WHERE uid='%s'",
			 $form_values['_sid-'.$key],
			 $form_values['_sis-'.$key],
			 $form_values['_sch-'.$key],
			 $form_values['_slg-'.$key],
			 $form_values['_smt-'.$key],
			 $form_values['_sst-'.$key],
			 $form_values['validated-'.$key],
			 $form_values['memory-'.$key],
			 $key);
		db_query($sql);
	}
	drupal_set_message(t('Scores have been saved.'));
	$form_state['redirect']='score/inputgk';
}