00001 <?php
00002
00015
00016
00017
00018 import('form.FormError');
00019 import('form.validation.FormValidator');
00020
00021 class Form {
00022
00024 var $_template;
00025
00027 var $_data;
00028
00030 var $_checks;
00031
00033 var $_errors;
00034
00036 var $errorsArray;
00037
00039 var $errorFields;
00040
00045 function Form($template) {
00046 $this->_template = $template;
00047 $this->_data = array();
00048 $this->_checks = array();
00049 $this->_errors = array();
00050 $this->errorsArray = array();
00051 $this->errorFields = array();
00052 }
00053
00057 function display() {
00058 $templateMgr = &TemplateManager::getManager();
00059 $templateMgr->setCacheability(CACHEABILITY_NO_STORE);
00060 $templateMgr->register_function('fieldLabel', array(&$this, 'smartyFieldLabel'));
00061 $templateMgr->register_function('form_language_chooser', array(&$this, 'smartyFormLanguageChooser'));
00062
00063 $templateMgr->assign($this->_data);
00064 $templateMgr->assign('isError', !$this->isValid());
00065 $templateMgr->assign('errors', $this->getErrorsArray());
00066
00067 $templateMgr->assign('formLocales', Locale::getSupportedLocales());
00068
00069
00070 $formLocale = Request::getUserVar('formLocale');
00071 if (empty($formLocale) || !in_array($formLocale, array_keys(Locale::getAllLocales()))) {
00072 $formLocale = Locale::getLocale();
00073 }
00074 $templateMgr->assign('formLocale', $formLocale);
00075
00076 $templateMgr->display($this->_template);
00077 }
00078
00084 function getData($key) {
00085 return isset($this->_data[$key]) ? $this->_data[$key] : null;
00086 }
00087
00093 function setData($key, $value) {
00094
00095 if (is_string($value)) $value = Core::cleanVar($value);
00096
00097 $this->_data[$key] = $value;
00098 }
00099
00103 function initData() {
00104 }
00105
00109 function readInputData() {
00110 }
00111
00115 function validate() {
00116 if (!isset($this->errorsArray)) {
00117 $this->getErrorsArray();
00118 }
00119
00120 foreach ($this->_checks as $check) {
00121 if (!isset($this->errorsArray[$check->getField()]) && !$check->isValid()) {
00122 if (method_exists($check, 'getErrorFields') && method_exists($check, 'isArray') && call_user_func(array(&$check, 'isArray'))) {
00123 $errorFields = call_user_func(array(&$check, 'getErrorFields'));
00124 for ($i=0, $count=count($errorFields); $i < $count; $i++) {
00125 $this->addError($errorFields[$i], $check->getMessage());
00126 $this->errorFields[$errorFields[$i]] = 1;
00127 }
00128 } else {
00129 $this->addError($check->getField(), $check->getMessage());
00130 $this->errorFields[$check->getField()] = 1;
00131 }
00132 }
00133 }
00134 return $this->isValid();
00135 }
00136
00141 function execute() {
00142 }
00143
00148 function getLocaleFieldNames() {
00149 return array();
00150 }
00151
00157 function isLocaleResubmit() {
00158 $formLocale = Request::getUserVar('formLocale');
00159 return (!empty($formLocale));
00160 }
00161
00166 function getFormLocale() {
00167 $formLocale = Request::getUserVar('formLocale');
00168 if (empty($formLocale)) $formLocale = Locale::getLocale();
00169 return $formLocale;
00170 }
00171
00176 function readUserVars($vars) {
00177 foreach ($vars as $k) {
00178 $this->setData($k, Request::getUserVar($k));
00179 }
00180 }
00181
00186 function readUserDateVars($vars) {
00187 foreach ($vars as $k) {
00188 $this->setData($k, Request::getUserDateVar($k));
00189 }
00190 }
00191
00196 function addCheck($formValidator) {
00197 $this->_checks[] = &$formValidator;
00198 }
00199
00205 function addError($field, $message) {
00206 $this->_errors[] = &new FormError($field, $message);
00207 }
00208
00213 function addErrorField($field) {
00214 $this->errorFields[$field] = 1;
00215 }
00216
00221 function isValid() {
00222 return empty($this->_errors);
00223 }
00224
00230 function getErrorsArray() {
00231 $this->errorsArray = array();
00232 foreach ($this->_errors as $error) {
00233 if (!isset($this->errorsArray[$error->getField()])) {
00234 $this->errorsArray[$error->getField()] = $error->getMessage();
00235 }
00236 }
00237 return $this->errorsArray;
00238 }
00239
00245 function smartyFieldLabel($params, &$smarty) {
00246 if (isset($params) && !empty($params)) {
00247 if (isset($params['key'])) {
00248 $params['label'] = Locale::translate($params['key'], $params);
00249 }
00250
00251 if (isset($this->errorFields[$params['name']])) {
00252 $class = ' class="error"';
00253 } else {
00254 $class = '';
00255 }
00256 echo '<label' . (isset($params['suppressId']) ? '' : ' for="' . $params['name'] . '"'), $class, '>', $params['label'], (isset($params['required']) && !empty($params['required']) ? '*' : ''), '</label>';
00257 }
00258 }
00259
00260 function _decomposeArray($name, $value, $stack) {
00261 if (is_array($value)) {
00262 foreach ($value as $key => $subValue) {
00263 $newStack = $stack;
00264 $newStack[] = $key;
00265 $this->_decomposeArray($name, $subValue, $newStack);
00266 }
00267 } else {
00268 $name = htmlentities($name, ENT_COMPAT, LOCALE_ENCODING);
00269 $value = htmlentities($value, ENT_COMPAT, LOCALE_ENCODING);
00270 echo '<input type="hidden" name="' . $name;
00271 while (($item = array_shift($stack)) !== null) {
00272 $item = htmlentities($item, ENT_COMPAT, LOCALE_ENCODING);
00273 echo '[' . $item . ']';
00274 }
00275 echo '" value="' . $value . "\" />\n";
00276 }
00277 }
00284 function smartyFormLanguageChooser($params, &$smarty) {
00285
00286
00287 $formLocale = $smarty->get_template_vars('formLocale');
00288 foreach ($this->getLocaleFieldNames() as $field) {
00289 $values = $this->getData($field);
00290 if (!is_array($values)) continue;
00291 foreach ($values as $locale => $value) {
00292 if ($locale != $formLocale) $this->_decomposeArray($field, $value, array($locale));
00293 }
00294 }
00295
00296
00297 $formLocale = $smarty->get_template_vars('formLocale');
00298 echo '<div id="languageSelector"><select size="1" name="formLocale" id="formLocale" onchange="changeFormAction(\'' . htmlentities($params['form'], ENT_COMPAT, LOCALE_ENCODING) . '\', \'' . htmlentities($params['url'], ENT_QUOTES, LOCALE_ENCODING) . '\')" class="selectMenu">';
00299 foreach (Locale::getSupportedLocales() as $locale => $name) {
00300 echo '<option ' . ($locale == $formLocale?'selected="selected" ':'') . 'value="' . htmlentities($locale, ENT_COMPAT, LOCALE_ENCODING) . '">' . htmlentities($name, ENT_COMPAT, LOCALE_ENCODING) . '</option>';
00301 }
00302 echo '</select></div>';
00303 }
00304 }
00305
00306 ?>