function test($_html) { $num = 10; $ob = new HTML_FormPersister(); $_time = getTime(); for ($i = 0; $i < $num; $i++) { $_result = $ob->process($_html); } $_time = (getTime() - $_time) / $num; printf("%.6fs - <tt>%s</tt><br>", $_time, htmlspecialchars($_html)); }
function process($s, $sign = false) { if ($sign) { $s = HTML_FormPersister::ob_formPersisterHandler($s); } return parent::process($s); }
static function signHtmlForm($s, $substitute_values = false) { if ($substitute_values) { $s = HTML_FormPersister::ob_formPersisterHandler($s); } return self::getSigner()->process($s); }
public static function fillFromArray($htmlForm, $array = array()) { $savedPOST = $_POST; $_POST = $array; $data = HTML_FormPersister::ob_formPersisterHandler($htmlForm); $_POST = $savedPOST; return $data; }
/** * Fetch an element of $arr array using "complex" key $name. * * $name can be in form of "zzz[aaa][bbb]", * it means $arr[zzz][aaa][bbb]. * * If $name contain auto-indexed parts (e.g. a[b][]), replace * it by corresponding indexes. * * $name may be scalar name or array (already splitted name, * see _splitMultiArray() method). * * @param array &$arr Array to fetch from. * @param mixed &$name Complex form-field name. * @param array &$autoindexes Container to hold auto-indexes * @return found value, or false if $name is not found. */ function _deepFetch(&$arr, &$name, &$autoindexes) { if (is_scalar($name) && strpos($name, '[') === false) { // Fast fetch. return isset($arr[$name]) ? $arr[$name] : false; } // Else search into deep. $parts = HTML_FormPersister::_splitMultiArray($name); $leftPrefix = ''; foreach ($parts as $i => $k) { if (!strlen($k)) { // Perform auto-indexing. if (!isset($autoindexes[$leftPrefix])) { $autoindexes[$leftPrefix] = 0; } $parts[$i] = $k = $autoindexes[$leftPrefix]++; } if (!is_array($arr)) { // Current container is not array. return false; } if (!array_key_exists($k, $arr)) { // No such element. return false; } $arr =& $arr[$k]; $leftPrefix = strlen($leftPrefix) ? $leftPrefix . "[{$k}]" : $k; } if (!is_scalar($name)) { $name = $parts; } else { $name = $leftPrefix; } return $arr; }
/** * Convert plain metadata to multidimension array (as in $_GET and $_POST). * Used for forms with complex field names: a[b][c][] etc. * Called usually ONLY on POST form processing, not each time page loaded. * Also check if field values are consistent with metadata (e.g. hidden * field is unchanged manually and "select" value is present in <option>'s). * Each resulting elements will have the following structure: * elementName => array( * 'type' => text | action | single | multiple, * 'label' => corresponding <label>...</label> content * 'value' => entered value (if MF_USE_VALUES is true) * 'name' => full name of form element (e.g. field[key1][key2]) * 'original' => original value of the element (for hidden fields and forms) * 'items' => array(items of selects, checkboxes etc.) * ); */ function _decodeFormMeta($metas, $valuesArray) { require_once 'HTML/FormPersister.php'; // Second pass: make meta tree. $flatMetas = $metas['items']; $treeMetas = $autoindexes = $values = array(); foreach ($flatMetas as $k => $meta) { // Get name structure. $name = $meta['name']; $nameParts = HTML_FormPersister::_splitMultiArray($name); // may be modified later! // Set values. if ($this->MF_USE_VALUES) { $value = null; // Fetch the value. if ($meta['type'] == "action" && count($nameParts) == 1) { // This is possibly <input type="image" name="aaa"> field. E.g., // $_GET contains "aaa_x" and "aaa_y" fieds. if (is_numeric($x = @$valuesArray["{$name}_x"]) && is_numeric($y = @$valuesArray["{$name}_y"])) { $value = array($x, $y); } } if ($value === null) { // This is not "image" field, or "image" with [] parts // (PHP always ignores .x and .y after [] part, so - remain only "y" coord). if (($v = HTML_FormPersister::_deepFetch($valuesArray, $nameParts, $autoindexes)) !== false) { $value = $v; } } // For multi-selects value is ALWAYS array. if ($value === null && $meta['type'] == "multiple") { $value = array(); } // Single select with size>1 and set of radio-buttons without // checked item ALSO could generate NULL in value. But we must // process such cases via meta:dynamic attribute. // Flag-based checkbox may need correction. if ($meta['type'] == 'flag') { if ($meta['key'] === null) { // If checkbox has no 'value' attribute - completely // boolean element (browser sends "on"). $value = intval(!!$value); } unset($meta['key']); } // Make values array ("trusted $_POST"). $curValue =& $values; foreach ($nameParts as $part) { $curValue =& $curValue[$part]; } $curValue = $value; // Save new value back to meta. $meta['value'] = $value; } // Make deep (tree-like) array. $curTree =& $treeMetas; foreach ($nameParts as $part) { if (!strlen($part)) { break; } $curTree =& $curTree[$part]; } $curTree = $meta; // Save modified meta back to array. $flatMetas[$k] = $meta; } // Create resulting metadata. $metas['items'] = $flatMetas; $metas['tree'] = $treeMetas; if ($this->MF_USE_VALUES) { $metas['value'] = $values; } // Return full meta-information. return $metas; }
<?php include_once "../../lib/config.php"; include_once "HTML/FormPersister.php"; $ob = new HTML_FormPersister(); $options['some']['key'] = array('one' => 'From 1d array', 'two' => 'Other from 1d'); $options['other']['key'] = array('Group1' => array('one' => 'From 2d array', 'two' => 'Another from 2d'), 'Group2' => array('three' => 'Again from 2d array', 'four' => '2d vah-vah!')); $code = trim(str_replace("\t", "", ' <br><form> <select name=sel-1> options[some][key] </select> <select name=sel0> <option value="0">0000</option> $options[some][key] <option value="1">1111</option> </select> <select name=sel1> <optgroup label="aaa"> <option value="0">rrrrr</option> options[some][key] </optgroup> options[other][key] </select> <select name=sel2 size="1"> <optgroup label="First"> <option value=a>aaaaaaaaaaaaa <option value=b>bbbbbbbbbbbbb </optgroup> <optgroup label="Second"> <option value=c>ccccccccccccc
} else { $_POST['sex'] = 'default'; $BreadCrumbs->addBreadCrumbs($sKey, 'Регистрация аккаунта'); $tpl->assign('title', 'Регистрация аккаунта'); $tplForm->assign('content', 'Регистрация на этом сайте даст вам возможность оставлять комментарии в блоге.'); $tplForm->assign('act', 'register'); $tplForm->assign('submit', 'Зарегистрироваться'); $tplForm->assign('validation_login', $tplForm->fetchBlock('validation_login')); } $tplForm->assign('validator_login', 'Только английские строчные буквы, цифры, тире и знак подчеркивания'); $tplForm->assign('validator_name', 'Любые буквы, цифры, тире и знак подчеркивания'); $tplForm->assign('validator_password', 'Любые буквы, цифры, тире и знак подчеркивания'); $tplForm->assign('validator_age', 'Число полных лет (в пределах от 4 до <a target="_blank" href="http://ru.wikipedia.org/wiki/%D0%9A%D0%B0%D0%BB%D1%8C%D0%BC%D0%B0%D0%BD,_%D0%96%D0%B0%D0%BD%D0%BD%D0%B0">122</a>)'); $tplForm->assign('validator_email', 'Правильный email (используется для уведомлений, на сайте не отображается)'); $tplForm->assign('validator_kcaptcha', 'Защита от автоматических регистраций - введите символы, изображенные на картинке'); $sForm = $tplForm->get(); $sForm = HTML_FormPersister::ob_formpersisterhandler($sForm); $sForm = $metaForm->process($sForm); $tpl->assign('content', $sForm); break; } $_t->assign('ContentBlock', $tpl); $tpl->reset(); // BREADCRUMBS $_t->assign('BreadCrumbs', $BreadCrumbs->getBreadCrumbs()); // HEAD_TITLE $_t->assign('head_title', $sTitle); // SEO $_t->assign('seo_title', $sSeoTitle); $_t->assign('seo_keywords', $sSeoKeywords); $_t->assign('seo_description', $sSeoDescription);
<?php include_once "../../lib/config.php"; include_once "HTML/FormPersister.php"; ob_start(); ?> <form method="get"> <input type="submit" value=" Submit - must NOT contain plain &nbsp; on the left!"> </form> <? $c = ob_get_contents(); ob_end_clean(); echo HTML_FormPersister::ob_formPersisterHandler($c); ?>
function ShowTask() { global $_t; global $tpl; global $metaForm; // Строим запрос //dbg($_POST); $sql = "SELECT * FROM `" . DB_PREFIX . DB_TBL_TASKS . "` WHERE (\r\n"; if (isset($_POST['complete'])) { $sql .= "(`status` = 'complete') OR \r\n"; } if (isset($_POST['uncomplete'])) { $sql .= "(`status` = '') OR \r\n"; } if (isset($_POST['error'])) { $sql .= "(`status` = 'error') OR \r\n"; } if (isset($_POST['other'])) { $sql .= "((`status` != 'error') AND (`status` != '') AND (`status` != 'complete')) OR \r\n"; } $sql = substr($sql, 0, strlen($sql) - 5) . "\r\n"; $sql .= ") ORDER BY `" . $_POST['sort'] . "` "; if (isset($_POST['desc'])) { $sql .= "DESC"; } //dbg($sql); // Получаем задачи //$sql = "SELECT * FROM `".DB_PREFIX.DB_TBL_TASKS."` WHERE 1 ORDER BY `t_start` "; $sql = mysql_query($sql); if (false == $sql) { my_die(); } $aList = array(); while ($row = mysql_fetch_assoc($sql)) { $aList[] = $row; } //dbg($aList); // Выводим задачи if (empty($aList)) { $tpl->assign('TaskList', 'Нет задач'); } else { $tplTaskList = $tpl->fetchBlock('TaskList'); foreach ($aList as $k => $v) { $tplTaskElt = $tplTaskList->fetchBlock('TaskElt'); $tplTaskElt->assign($v); $tplTaskElt->assign('color', substr(md5($v['status']), 0, 6)); $tplTaskList->assign('TaskElt', $tplTaskElt); $tplTaskElt->reset(); } $tpl->assign('TaskList', $tplTaskList); $tplTaskList->reset(); } $sql = "SELECT COUNT(*) FROM `" . DB_PREFIX . DB_TBL_TASKS . "` WHERE `status` = 'complete'"; $sql = mysql_query($sql); if (false == $sql) { my_die(); } $tpl->assign('task_complete', current(mysql_fetch_assoc($sql))); $sql = "SELECT COUNT(*) FROM `" . DB_PREFIX . DB_TBL_TASKS . "` WHERE `status` = ''"; $sql = mysql_query($sql); if (false == $sql) { my_die(); } $tpl->assign('task_uncomplete', current(mysql_fetch_assoc($sql))); $sql = "SELECT COUNT(*) FROM `" . DB_PREFIX . DB_TBL_TASKS . "` WHERE `status` = 'error'"; $sql = mysql_query($sql); if (false == $sql) { my_die(); } $tpl->assign('task_error', current(mysql_fetch_assoc($sql))); $sql = "SELECT COUNT(*) FROM `" . DB_PREFIX . DB_TBL_TASKS . "` WHERE ((`status` != 'error') AND (`status` != '') AND (`status` != 'complete'))"; $sql = mysql_query($sql); if (false == $sql) { my_die(); } $tpl->assign('task_other', current(mysql_fetch_assoc($sql))); $sql = "SELECT COUNT(*) FROM `" . DB_PREFIX . DB_TBL_TASKS . "` WHERE 1"; $sql = mysql_query($sql); if (false == $sql) { my_die(); } $tpl->assign('task_all', current(mysql_fetch_assoc($sql))); $sTpl = $tpl->get(); $sTpl = HTML_FormPersister::ob_formpersisterhandler($sTpl); $sTpl = $metaForm->process($sTpl); $_t->assign('content', $sTpl); $tpl->reset(); }