| 1: | <?php | 
| 2: |  | 
| 3: |  | 
| 4: |  | 
| 5: |  | 
| 6: |  | 
| 7: |  | 
| 8: |  | 
| 9: |  | 
| 10: |  | 
| 11: |  | 
| 12: |  | 
| 13: |  | 
| 14: |  | 
| 15: |  | 
| 16: |  | 
| 17: |  | 
| 18: |  | 
| 19: |  | 
| 20: | defined('XOOPS_ROOT_PATH') || exit('Restricted access'); | 
| 21: |  | 
| 22: |  | 
| 23: |  | 
| 24: |  | 
| 25: |  | 
| 26: |  | 
| 27: |  | 
| 28: |  | 
| 29: |  | 
| 30: |  | 
| 31: | class XoopsForm | 
| 32: | { | 
| 33: |  | 
| 34: |  | 
| 35: |  | 
| 36: |  | 
| 37: |  | 
| 38: |  | 
| 39: |  | 
| 40: |  | 
| 41: |  | 
| 42: |  | 
| 43: | public $_action; | 
| 44: |  | 
| 45: |  | 
| 46: |  | 
| 47: |  | 
| 48: |  | 
| 49: |  | 
| 50: | public $_method; | 
| 51: |  | 
| 52: |  | 
| 53: |  | 
| 54: |  | 
| 55: |  | 
| 56: |  | 
| 57: | public $_name; | 
| 58: |  | 
| 59: |  | 
| 60: |  | 
| 61: |  | 
| 62: |  | 
| 63: |  | 
| 64: | public $_title; | 
| 65: |  | 
| 66: |  | 
| 67: |  | 
| 68: |  | 
| 69: |  | 
| 70: |  | 
| 71: | public $_summary = ''; | 
| 72: |  | 
| 73: |  | 
| 74: |  | 
| 75: |  | 
| 76: |  | 
| 77: |  | 
| 78: | public $_elements = array(); | 
| 79: |  | 
| 80: |  | 
| 81: |  | 
| 82: |  | 
| 83: |  | 
| 84: |  | 
| 85: | public $_class = array(); | 
| 86: |  | 
| 87: |  | 
| 88: |  | 
| 89: |  | 
| 90: |  | 
| 91: |  | 
| 92: | public $_extra = array(); | 
| 93: |  | 
| 94: |  | 
| 95: |  | 
| 96: |  | 
| 97: |  | 
| 98: |  | 
| 99: | public $_required = array(); | 
| 100: |  | 
| 101: |  | 
| 102: |  | 
| 103: |  | 
| 104: |  | 
| 105: |  | 
| 106: | public $_objid = 'da39a3ee5e6b4b0d3255bfef95601890afd80709'; | 
| 107: |  | 
| 108: |  | 
| 109: |  | 
| 110: |  | 
| 111: |  | 
| 112: |  | 
| 113: |  | 
| 114: |  | 
| 115: |  | 
| 116: |  | 
| 117: |  | 
| 118: |  | 
| 119: |  | 
| 120: |  | 
| 121: |  | 
| 122: | public function __construct($title, $name, $action, $method = 'post', $addtoken = false, $summary = '') | 
| 123: | { | 
| 124: | $this->_title   = $title; | 
| 125: | $this->_name    = $name; | 
| 126: | $this->_action  = $action; | 
| 127: | $this->_method  = $method; | 
| 128: | $this->_summary = $summary; | 
| 129: | if (false != $addtoken) { | 
| 130: | $this->addElement(new XoopsFormHiddenToken()); | 
| 131: | } | 
| 132: | } | 
| 133: |  | 
| 134: |  | 
| 135: |  | 
| 136: |  | 
| 137: | public function XoopsForm() | 
| 138: | { | 
| 139: | $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1); | 
| 140: | trigger_error("Should call parent::__construct in {$trace[0]['file']} line {$trace[0]['line']},", E_USER_DEPRECATED); | 
| 141: | self::__construct(); | 
| 142: | } | 
| 143: |  | 
| 144: |  | 
| 145: |  | 
| 146: |  | 
| 147: |  | 
| 148: |  | 
| 149: |  | 
| 150: |  | 
| 151: |  | 
| 152: |  | 
| 153: |  | 
| 154: |  | 
| 155: |  | 
| 156: | public function getObjectID($object, $hashinfo = 'sha1') | 
| 157: | { | 
| 158: |  | 
| 159: | $var = array( | 
| 160: | 'name' => '', | 
| 161: | 'value' => '', | 
| 162: | 'func' => '' | 
| 163: | ); | 
| 164: |  | 
| 165: |  | 
| 166: | if (!is_object($object)) { | 
| 167: | $object = $this; | 
| 168: | } | 
| 169: |  | 
| 170: |  | 
| 171: | $hashMethod = ('md5' === $hashinfo) ? 'md5' : 'sha1'; | 
| 172: |  | 
| 173: |  | 
| 174: | $var['name'] = $hashMethod(get_class($object)); | 
| 175: |  | 
| 176: |  | 
| 177: | foreach (get_object_vars($object) as $key => $value) { | 
| 178: | if ($key !== '_objid') { | 
| 179: | $var['value'] = $this->getArrayID($value, $key, $var['value'], $hashinfo); | 
| 180: | } | 
| 181: | } | 
| 182: |  | 
| 183: |  | 
| 184: | foreach (get_class_methods($object) as $key => $value) { | 
| 185: | $var['func'] = $this->getArrayID($value, $key, $var['func'], $hashinfo); | 
| 186: | } | 
| 187: |  | 
| 188: |  | 
| 189: | $this->_objid = $hashMethod(implode(':', $var)); | 
| 190: |  | 
| 191: | return $this->_objid; | 
| 192: | } | 
| 193: |  | 
| 194: |  | 
| 195: |  | 
| 196: |  | 
| 197: |  | 
| 198: |  | 
| 199: |  | 
| 200: |  | 
| 201: |  | 
| 202: |  | 
| 203: | public function getArrayID($value, $key, $ret, $hashinfo = 'sha1') | 
| 204: | { | 
| 205: | switch ($hashinfo) { | 
| 206: | case 'md5': | 
| 207: | if (!isset($ret)) { | 
| 208: | $ret = ''; | 
| 209: | } | 
| 210: | if (is_array($value)) { | 
| 211: | foreach ($value as $keyb => $valueb) { | 
| 212: | $ret = md5($ret . ':' . $this->getArrayID($valueb, $keyb, $ret, $hashinfo)); | 
| 213: | } | 
| 214: | } else { | 
| 215: | $ret = md5($ret . ':' . $key . ':' . $value); | 
| 216: | } | 
| 217: |  | 
| 218: | return $ret; | 
| 219: | default: | 
| 220: | if (!isset($ret)) { | 
| 221: | $ret = ''; | 
| 222: | } | 
| 223: | if (is_array($value)) { | 
| 224: | foreach ($value as $keyb => $valueb) { | 
| 225: | $ret = sha1($ret . ':' . $this->getArrayID($valueb, $keyb, $ret, $hashinfo)); | 
| 226: | } | 
| 227: | } else { | 
| 228: | $ret = sha1($ret . ':' . $key . ':' . $value); | 
| 229: | } | 
| 230: |  | 
| 231: | return $ret; | 
| 232: | } | 
| 233: | } | 
| 234: |  | 
| 235: |  | 
| 236: |  | 
| 237: |  | 
| 238: |  | 
| 239: |  | 
| 240: |  | 
| 241: | public function getSummary($encode = false) | 
| 242: | { | 
| 243: | return $encode ? htmlspecialchars($this->_summary, ENT_QUOTES) : $this->_summary; | 
| 244: | } | 
| 245: |  | 
| 246: |  | 
| 247: |  | 
| 248: |  | 
| 249: |  | 
| 250: |  | 
| 251: |  | 
| 252: | public function getTitle($encode = false) | 
| 253: | { | 
| 254: | return $encode ? htmlspecialchars($this->_title, ENT_QUOTES) : $this->_title; | 
| 255: | } | 
| 256: |  | 
| 257: |  | 
| 258: |  | 
| 259: |  | 
| 260: |  | 
| 261: |  | 
| 262: |  | 
| 263: |  | 
| 264: |  | 
| 265: | public function getName($encode = true) | 
| 266: | { | 
| 267: | return $encode ? htmlspecialchars($this->_name, ENT_QUOTES) : $this->_name; | 
| 268: | } | 
| 269: |  | 
| 270: |  | 
| 271: |  | 
| 272: |  | 
| 273: |  | 
| 274: |  | 
| 275: |  | 
| 276: | public function getAction($encode = true) | 
| 277: | { | 
| 278: |  | 
| 279: | return $encode ? htmlspecialchars(str_replace('&', '&', $this->_action), ENT_QUOTES) : $this->_action; | 
| 280: | } | 
| 281: |  | 
| 282: |  | 
| 283: |  | 
| 284: |  | 
| 285: |  | 
| 286: |  | 
| 287: | public function getMethod() | 
| 288: | { | 
| 289: | return (strtolower($this->_method) === 'get') ? 'get' : 'post'; | 
| 290: | } | 
| 291: |  | 
| 292: |  | 
| 293: |  | 
| 294: |  | 
| 295: |  | 
| 296: |  | 
| 297: |  | 
| 298: |  | 
| 299: | public function addElement($formElement, $required = false) | 
| 300: | { | 
| 301: | if (is_string($formElement)) { | 
| 302: | $this->_elements[] = $formElement; | 
| 303: | } elseif (is_subclass_of($formElement, 'XoopsFormElement')) { | 
| 304: | $this->_elements[] = &$formElement; | 
| 305: | if (!$formElement->isContainer()) { | 
| 306: | if ($required) { | 
| 307: | $formElement->_required = true; | 
| 308: | $this->_required[]      = &$formElement; | 
| 309: | } | 
| 310: | } else { | 
| 311: | $required_elements = &$formElement->getRequired(); | 
| 312: | $count             = count($required_elements); | 
| 313: | for ($i = 0; $i < $count; ++$i) { | 
| 314: | $this->_required[] = &$required_elements[$i]; | 
| 315: | } | 
| 316: | } | 
| 317: | } | 
| 318: | } | 
| 319: |  | 
| 320: |  | 
| 321: |  | 
| 322: |  | 
| 323: |  | 
| 324: |  | 
| 325: |  | 
| 326: |  | 
| 327: | public function &getElements($recurse = false) | 
| 328: | { | 
| 329: | if (!$recurse) { | 
| 330: | return $this->_elements; | 
| 331: | } else { | 
| 332: | $ret   = array(); | 
| 333: | $count = count($this->_elements); | 
| 334: | for ($i = 0; $i < $count; ++$i) { | 
| 335: | if (is_object($this->_elements[$i])) { | 
| 336: | if (!$this->_elements[$i]->isContainer()) { | 
| 337: | $ret[] = &$this->_elements[$i]; | 
| 338: | } else { | 
| 339: | $elements = &$this->_elements[$i]->getElements(true); | 
| 340: | $count2   = count($elements); | 
| 341: | for ($j = 0; $j < $count2; ++$j) { | 
| 342: | $ret[] = &$elements[$j]; | 
| 343: | } | 
| 344: | unset($elements); | 
| 345: | } | 
| 346: | } | 
| 347: | } | 
| 348: |  | 
| 349: | return $ret; | 
| 350: | } | 
| 351: | } | 
| 352: |  | 
| 353: |  | 
| 354: |  | 
| 355: |  | 
| 356: |  | 
| 357: |  | 
| 358: | public function getElementNames() | 
| 359: | { | 
| 360: | $ret      = array(); | 
| 361: | $elements = &$this->getElements(true); | 
| 362: | $count    = count($elements); | 
| 363: | for ($i = 0; $i < $count; ++$i) { | 
| 364: | $ret[] = $elements[$i]->getName(); | 
| 365: | } | 
| 366: |  | 
| 367: | return $ret; | 
| 368: | } | 
| 369: |  | 
| 370: |  | 
| 371: |  | 
| 372: |  | 
| 373: |  | 
| 374: |  | 
| 375: |  | 
| 376: | public function &getElementByName($name) | 
| 377: | { | 
| 378: | $elements =& $this->getElements(true); | 
| 379: | $count    = count($elements); | 
| 380: | for ($i = 0; $i < $count; ++$i) { | 
| 381: | if ($name == $elements[$i]->getName(false)) { | 
| 382: | return $elements[$i]; | 
| 383: | } | 
| 384: | } | 
| 385: | $elt = null; | 
| 386: |  | 
| 387: | return $elt; | 
| 388: | } | 
| 389: |  | 
| 390: |  | 
| 391: |  | 
| 392: |  | 
| 393: |  | 
| 394: |  | 
| 395: |  | 
| 396: | public function setElementValue($name, $value) | 
| 397: | { | 
| 398: | $ele = &$this->getElementByName($name); | 
| 399: | if (is_object($ele) && method_exists($ele, 'setValue')) { | 
| 400: | $ele->setValue($value); | 
| 401: | } | 
| 402: | } | 
| 403: |  | 
| 404: |  | 
| 405: |  | 
| 406: |  | 
| 407: |  | 
| 408: |  | 
| 409: | public function setElementValues($values) | 
| 410: | { | 
| 411: | if (!empty($values) && \is_array($values)) { | 
| 412: |  | 
| 413: | $elements = &$this->getElements(true); | 
| 414: | $count    = count($elements); | 
| 415: | for ($i = 0; $i < $count; ++$i) { | 
| 416: | $name = $elements[$i]->getName(false); | 
| 417: | if ($name && isset($values[$name]) && method_exists($elements[$i], 'setValue')) { | 
| 418: | $elements[$i]->setValue($values[$name]); | 
| 419: | } | 
| 420: | } | 
| 421: | } | 
| 422: | } | 
| 423: |  | 
| 424: |  | 
| 425: |  | 
| 426: |  | 
| 427: |  | 
| 428: |  | 
| 429: |  | 
| 430: |  | 
| 431: | public function getElementValue($name, $encode = false) | 
| 432: | { | 
| 433: | $ele = &$this->getElementByName($name); | 
| 434: | if (is_object($ele) && method_exists($ele, 'getValue')) { | 
| 435: | return $ele->getValue($encode); | 
| 436: | } | 
| 437: |  | 
| 438: | return null; | 
| 439: | } | 
| 440: |  | 
| 441: |  | 
| 442: |  | 
| 443: |  | 
| 444: |  | 
| 445: |  | 
| 446: |  | 
| 447: | public function getElementValues($encode = false) | 
| 448: | { | 
| 449: |  | 
| 450: | $elements = &$this->getElements(true); | 
| 451: | $count    = count($elements); | 
| 452: | $values   = array(); | 
| 453: | for ($i = 0; $i < $count; ++$i) { | 
| 454: | $name = $elements[$i]->getName(false); | 
| 455: | if ($name && method_exists($elements[$i], 'getValue')) { | 
| 456: | $values[$name] = &$elements[$i]->getValue($encode); | 
| 457: | } | 
| 458: | } | 
| 459: |  | 
| 460: | return $values; | 
| 461: | } | 
| 462: |  | 
| 463: |  | 
| 464: |  | 
| 465: |  | 
| 466: |  | 
| 467: |  | 
| 468: | public function setClass($class) | 
| 469: | { | 
| 470: | $class = trim($class); | 
| 471: | if (!empty($class)) { | 
| 472: | $this->_class[] = $class; | 
| 473: | } | 
| 474: | } | 
| 475: |  | 
| 476: |  | 
| 477: |  | 
| 478: |  | 
| 479: |  | 
| 480: |  | 
| 481: | public function setExtra($extra) | 
| 482: | { | 
| 483: | if (!empty($extra)) { | 
| 484: | $this->_extra[] = $extra; | 
| 485: | } | 
| 486: | } | 
| 487: |  | 
| 488: |  | 
| 489: |  | 
| 490: |  | 
| 491: |  | 
| 492: |  | 
| 493: | public function setSummary($summary) | 
| 494: | { | 
| 495: | if (!empty($summary)) { | 
| 496: | $this->summary = strip_tags($summary); | 
| 497: | } | 
| 498: | } | 
| 499: |  | 
| 500: |  | 
| 501: |  | 
| 502: |  | 
| 503: |  | 
| 504: |  | 
| 505: | public function &getClass() | 
| 506: | { | 
| 507: | if (empty($this->_class)) { | 
| 508: | return false; | 
| 509: | } | 
| 510: | $classes = array(); | 
| 511: | foreach ($this->_class as $class) { | 
| 512: | $classes[] = htmlspecialchars($class, ENT_QUOTES); | 
| 513: | } | 
| 514: |  | 
| 515: | return implode(' ', $classes); | 
| 516: | } | 
| 517: |  | 
| 518: |  | 
| 519: |  | 
| 520: |  | 
| 521: |  | 
| 522: |  | 
| 523: | public function &getExtra() | 
| 524: | { | 
| 525: | $extra = empty($this->_extra) ? '' : ' ' . implode(' ', $this->_extra); | 
| 526: |  | 
| 527: | return $extra; | 
| 528: | } | 
| 529: |  | 
| 530: |  | 
| 531: |  | 
| 532: |  | 
| 533: |  | 
| 534: |  | 
| 535: | public function setRequired(XoopsFormElement $formElement) | 
| 536: | { | 
| 537: | $this->_required[] = &$formElement; | 
| 538: | } | 
| 539: |  | 
| 540: |  | 
| 541: |  | 
| 542: |  | 
| 543: |  | 
| 544: |  | 
| 545: | public function &getRequired() | 
| 546: | { | 
| 547: | return $this->_required; | 
| 548: | } | 
| 549: |  | 
| 550: |  | 
| 551: |  | 
| 552: |  | 
| 553: |  | 
| 554: |  | 
| 555: |  | 
| 556: |  | 
| 557: |  | 
| 558: | public function insertBreak($extra = null) | 
| 559: | { | 
| 560: | } | 
| 561: |  | 
| 562: |  | 
| 563: |  | 
| 564: |  | 
| 565: |  | 
| 566: |  | 
| 567: |  | 
| 568: |  | 
| 569: | public function render() | 
| 570: | { | 
| 571: | } | 
| 572: |  | 
| 573: |  | 
| 574: |  | 
| 575: |  | 
| 576: | public function display() | 
| 577: | { | 
| 578: | echo $this->render(); | 
| 579: | } | 
| 580: |  | 
| 581: |  | 
| 582: |  | 
| 583: |  | 
| 584: |  | 
| 585: |  | 
| 586: |  | 
| 587: |  | 
| 588: |  | 
| 589: |  | 
| 590: |  | 
| 591: |  | 
| 592: |  | 
| 593: |  | 
| 594: |  | 
| 595: |  | 
| 596: |  | 
| 597: |  | 
| 598: |  | 
| 599: |  | 
| 600: |  | 
| 601: |  | 
| 602: |  | 
| 603: |  | 
| 604: |  | 
| 605: | public function renderValidationJS($withtags = true) | 
| 606: | { | 
| 607: | $js = ''; | 
| 608: | if ($withtags) { | 
| 609: | $js .= "\n<!-- Start Form Validation JavaScript //-->\n<script type='text/javascript'>\n<!--//\n"; | 
| 610: | } | 
| 611: | $formname = $this->getName(); | 
| 612: | $js .= "function xoopsFormValidate_{$formname}() { var myform = window.document.{$formname}; "; | 
| 613: | $elements =& $this->getElements(true); | 
| 614: | foreach ($elements as $elt) { | 
| 615: | if (method_exists($elt, 'renderValidationJS')) { | 
| 616: | $js .= $elt->renderValidationJS(); | 
| 617: | } | 
| 618: | } | 
| 619: | $js .= "return true;\n}\n"; | 
| 620: | if ($withtags) { | 
| 621: | $js .= "//--></script>\n<!-- End Form Validation JavaScript //-->\n"; | 
| 622: | } | 
| 623: |  | 
| 624: | return $js; | 
| 625: | } | 
| 626: |  | 
| 627: |  | 
| 628: |  | 
| 629: |  | 
| 630: |  | 
| 631: |  | 
| 632: |  | 
| 633: | public function assign(XoopsTpl $tpl) | 
| 634: | { | 
| 635: | $i        = -1; | 
| 636: | $elements = array(); | 
| 637: | if (count($this->getRequired()) > 0) { | 
| 638: | $this->_elements[] = "<tr class='foot'><td colspan='2'>* = " . _REQUIRED . '</td></tr>'; | 
| 639: | } | 
| 640: | foreach ($this->getElements() as $ele) { | 
| 641: | ++$i; | 
| 642: | if (is_string($ele)) { | 
| 643: | $elements[$i]['body'] = $ele; | 
| 644: | continue; | 
| 645: | } | 
| 646: | $ele_name                 = $ele->getName(); | 
| 647: | $ele_description          = $ele->getDescription(); | 
| 648: | $n                        = $ele_name ?: $i; | 
| 649: | $elements[$n]['name']     = $ele_name; | 
| 650: | $elements[$n]['caption']  = $ele->getCaption(); | 
| 651: | $elements[$n]['body']     = $ele->render(); | 
| 652: | $elements[$n]['hidden']   = $ele->isHidden(); | 
| 653: | $elements[$n]['required'] = $ele->isRequired(); | 
| 654: | if ($ele_description != '') { | 
| 655: | $elements[$n]['description'] = $ele_description; | 
| 656: | } | 
| 657: | } | 
| 658: | $js = $this->renderValidationJS(); | 
| 659: | $tpl->assign($this->getName(), array( | 
| 660: | 'title'      => $this->getTitle(), | 
| 661: | 'name'       => $this->getName(), | 
| 662: | 'action'     => $this->getAction(), | 
| 663: | 'method'     => $this->getMethod(), | 
| 664: | 'extra'      => 'onsubmit="return xoopsFormValidate_' . $this->getName() . '();"' . $this->getExtra(), | 
| 665: | 'javascript' => $js, | 
| 666: | 'elements'   => $elements, | 
| 667: | 'rendered'   => $this->render(), | 
| 668: | )); | 
| 669: | } | 
| 670: | } | 
| 671: |  |