$val) $form_tag .= $attr.'="'.$val.'" '; $form_tag .= ">\n"; // generate the validators for the form $rules = ""; $messages = ""; foreach($form->getValidatorSchema()->getFields() as $field_name => $field) { // get the field names $field_name = '"'.sprintf($form->getWidgetSchema()->getNameFormat(), $field_name).'"'; // get the validator options associated with the validator $options = $field->getOptions(); $mobj = $field->getMessages(); // add the rules switch(get_class($field)) { case "sfValidatorEmail": // update the rules $rules .= "\t$field_name: { "; if($options['required']) $rules .= "required: true, "; $rules .= "email: true }, \n"; // set the message $messages .= "\t$field_name: \"{$mobj['invalid']}\", \n"; break; case "sfValidatorString": $rules .= "\t$field_name: { "; if($options['required']) $rules .= "required: true, "; if($options['max_length']) $rules .= "maxlength: {$options['max_length']}, "; if($options['min_length']) $rules .= "minlength: {$options['min_length']}, "; $rules .= "}, \n"; // update the messages $messages .= "\t$field_name: { "; if($mobj['required']) $messages .= "required: \"{$mobj['required']}\", "; if($mobj['max_length']) $messages .= "maxlength: \"Please enter at most {$options['max_length']} characters.\", "; if($mobj['min_length']) $messages .= "minlength: \"Please enter at least {$options['min_length']} characters.\", "; $messages .= "}, \n"; break; case "sfValidatorPass": if($options['required']) $rules .= "\t$field_name: { required: true }, \n"; break; default: break; } } // construct the validator $errorPlacement = ((in_array("error_placement", $attrs)) ? ", errorPlacement: function(error, element) { ".$attributes['error_placement'] ." } " : " "); $errorElement = ", errorElement: ".((in_array("error_element", $attrs)) ? $attributes['error_element'] : " 'div'"); $validator = << $().ready(function() { $("#{$form_name}").validate({ rules: { {$rules} }, messages: { {$messages} } {$errorPlacement} {$errorElement} }); }); EOF; return $form_tag.$validator; }