form->getId(); echo <<'; for(e = 0; e < errorSize; ++e) errorHTML += '
  • ' + response.errors[e] + '
  • '; errorHTML += ''; jQuery("#$id").prepend(errorHTML); /* Apply ARIA attributes and inline errors for accessibility */ if (response.elementErrors) { jQuery.each(response.elementErrors, function(fieldName, fieldErrors) { var field = jQuery('[name="' + fieldName + '"]', '#$id'); if (field.length) { var parent = field.closest('.pfbc-element, .pfbc-fieldwrap'); var errorId = field.attr('id') + '-error'; /* Add ARIA attributes */ field.attr('aria-invalid', 'true'); field.attr('aria-describedby', errorId); /* Add error class to parent */ parent.addClass('pfbc-element-has-error'); /* Remove existing inline error if any */ parent.find('.pfbc-inline-error').remove(); /* Add inline error message */ var inlineErrorHTML = ''; field.after(inlineErrorHTML); } }); } JS; } private function parse($errors) { $list = array(); if(!empty($errors)) { $keys = array_keys($errors); $keySize = sizeof($keys); for($k = 0; $k < $keySize; ++$k) $list = array_merge($list, $errors[$keys[$k]]); } return $list; } public function render() { $errors = $this->parse($this->form->getErrors()); if(!empty($errors)) { $size = sizeof($errors); if($size == 1) $format = "error was"; else $format = $size . " errors were"; echo ''; } } public function renderAjaxErrorResponse() { $flatErrors = $this->parse($this->form->getErrors()); $elementErrors = $this->form->getErrors(); // Keep structured errors for field-level ARIA if(!empty($flatErrors)) { header("Content-type: application/json"); print _accua_forms_json_encode(array( "errors" => $flatErrors, "elementErrors" => $elementErrors // Add field-specific errors for ARIA attributes )); } } }