| 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: | define('XOBJ_DTYPE_TXTBOX', 1); | 
| 30: | define('XOBJ_DTYPE_TXTAREA', 2); | 
| 31: | define('XOBJ_DTYPE_INT', 3); | 
| 32: | define('XOBJ_DTYPE_URL', 4); | 
| 33: | define('XOBJ_DTYPE_EMAIL', 5); | 
| 34: | define('XOBJ_DTYPE_ARRAY', 6); | 
| 35: | define('XOBJ_DTYPE_OTHER', 7); | 
| 36: | define('XOBJ_DTYPE_SOURCE', 8); | 
| 37: | define('XOBJ_DTYPE_STIME', 9); | 
| 38: | define('XOBJ_DTYPE_MTIME', 10); | 
| 39: | define('XOBJ_DTYPE_LTIME', 11); | 
| 40: | define('XOBJ_DTYPE_FLOAT', 13); | 
| 41: | define('XOBJ_DTYPE_DECIMAL', 14); | 
| 42: | define('XOBJ_DTYPE_ENUM', 15); | 
| 43: |  | 
| 44: | define('XOBJ_DTYPE_UNICODE_TXTBOX', 16); | 
| 45: | define('XOBJ_DTYPE_UNICODE_TXTAREA', 17); | 
| 46: | define('XOBJ_DTYPE_UNICODE_URL', 18); | 
| 47: | define('XOBJ_DTYPE_UNICODE_EMAIL', 19); | 
| 48: | define('XOBJ_DTYPE_UNICODE_ARRAY', 20); | 
| 49: | define('XOBJ_DTYPE_UNICODE_OTHER', 21); | 
| 50: |  | 
| 51: | define('XOBJ_DTYPE_DATE', 22); | 
| 52: | define('XOBJ_DTYPE_TIME', 23); | 
| 53: | define('XOBJ_DTYPE_TIMESTAMP', 24); | 
| 54: |  | 
| 55: |  | 
| 56: |  | 
| 57: |  | 
| 58: | class XoopsObject | 
| 59: | { | 
| 60: |  | 
| 61: |  | 
| 62: |  | 
| 63: |  | 
| 64: |  | 
| 65: |  | 
| 66: | public $vars = array(); | 
| 67: |  | 
| 68: |  | 
| 69: |  | 
| 70: |  | 
| 71: |  | 
| 72: |  | 
| 73: |  | 
| 74: | public $cleanVars = array(); | 
| 75: |  | 
| 76: |  | 
| 77: |  | 
| 78: |  | 
| 79: |  | 
| 80: |  | 
| 81: |  | 
| 82: | public $_isNew = false; | 
| 83: |  | 
| 84: |  | 
| 85: |  | 
| 86: |  | 
| 87: |  | 
| 88: |  | 
| 89: |  | 
| 90: | public $_isDirty = false; | 
| 91: |  | 
| 92: |  | 
| 93: |  | 
| 94: |  | 
| 95: |  | 
| 96: |  | 
| 97: |  | 
| 98: | public $_errors = array(); | 
| 99: |  | 
| 100: |  | 
| 101: |  | 
| 102: |  | 
| 103: |  | 
| 104: |  | 
| 105: | public $_filters = array(); | 
| 106: |  | 
| 107: |  | 
| 108: |  | 
| 109: |  | 
| 110: |  | 
| 111: |  | 
| 112: |  | 
| 113: |  | 
| 114: | public function __construct() | 
| 115: | { | 
| 116: | } | 
| 117: |  | 
| 118: |  | 
| 119: |  | 
| 120: |  | 
| 121: |  | 
| 122: | public function XoopsObject() | 
| 123: | { | 
| 124: | $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1); | 
| 125: | trigger_error("Should call parent::__construct in {$trace[0]['file']} line {$trace[0]['line']},", E_USER_DEPRECATED); | 
| 126: | self::__construct(); | 
| 127: | } | 
| 128: |  | 
| 129: |  | 
| 130: |  | 
| 131: |  | 
| 132: |  | 
| 133: |  | 
| 134: |  | 
| 135: | public function setNew() | 
| 136: | { | 
| 137: | $this->_isNew = true; | 
| 138: | } | 
| 139: |  | 
| 140: | public function unsetNew() | 
| 141: | { | 
| 142: | $this->_isNew = false; | 
| 143: | } | 
| 144: |  | 
| 145: |  | 
| 146: |  | 
| 147: |  | 
| 148: | public function isNew() | 
| 149: | { | 
| 150: | return $this->_isNew; | 
| 151: | } | 
| 152: |  | 
| 153: |  | 
| 154: |  | 
| 155: |  | 
| 156: |  | 
| 157: |  | 
| 158: |  | 
| 159: |  | 
| 160: |  | 
| 161: | public function setDirty() | 
| 162: | { | 
| 163: | $this->_isDirty = true; | 
| 164: | } | 
| 165: |  | 
| 166: | public function unsetDirty() | 
| 167: | { | 
| 168: | $this->_isDirty = false; | 
| 169: | } | 
| 170: |  | 
| 171: |  | 
| 172: |  | 
| 173: |  | 
| 174: | public function isDirty() | 
| 175: | { | 
| 176: | return $this->_isDirty; | 
| 177: | } | 
| 178: |  | 
| 179: |  | 
| 180: |  | 
| 181: |  | 
| 182: |  | 
| 183: |  | 
| 184: |  | 
| 185: |  | 
| 186: |  | 
| 187: |  | 
| 188: |  | 
| 189: |  | 
| 190: |  | 
| 191: |  | 
| 192: |  | 
| 193: |  | 
| 194: |  | 
| 195: |  | 
| 196: | public function initVar($key, $data_type, $value = null, $required = false, $maxlength = null, $options = '', $enumerations = '') | 
| 197: | { | 
| 198: | $this->vars[$key] = array( | 
| 199: | 'value'       => $value, | 
| 200: | 'required'    => $required, | 
| 201: | 'data_type'   => $data_type, | 
| 202: | 'maxlength'   => $maxlength, | 
| 203: | 'changed'     => false, | 
| 204: | 'options'     => $options, | 
| 205: | 'enumeration' => $enumerations); | 
| 206: | } | 
| 207: |  | 
| 208: |  | 
| 209: |  | 
| 210: |  | 
| 211: |  | 
| 212: |  | 
| 213: |  | 
| 214: |  | 
| 215: | public function assignVar($key, $value) | 
| 216: | { | 
| 217: | if (isset($key) && isset($this->vars[$key])) { | 
| 218: | switch ($this->vars[$key]['data_type']) { | 
| 219: | case XOBJ_DTYPE_UNICODE_ARRAY: | 
| 220: | if (is_array($value)) { | 
| 221: | $temp = $value; | 
| 222: | array_walk($temp, 'xoops_aw_decode'); | 
| 223: | $value = $temp; | 
| 224: | $this->vars[$key]['value'] = $value; | 
| 225: | } else { | 
| 226: | $this->vars[$key]['value'] = xoops_convert_decode($value); | 
| 227: | } | 
| 228: | break; | 
| 229: | case XOBJ_DTYPE_UNICODE_URL: | 
| 230: | case XOBJ_DTYPE_UNICODE_EMAIL: | 
| 231: | case XOBJ_DTYPE_UNICODE_OTHER: | 
| 232: | case XOBJ_DTYPE_UNICODE_TXTBOX: | 
| 233: | case XOBJ_DTYPE_UNICODE_TXTAREA: | 
| 234: | $this->vars[$key]['value'] = xoops_convert_decode($value); | 
| 235: | break; | 
| 236: | case XOBJ_DTYPE_DATE: | 
| 237: | if (!is_string($value) && is_numeric($value)) { | 
| 238: | $this->vars[$key]['value'] = date(_DBDATESTRING, $value); | 
| 239: | } else { | 
| 240: | $this->vars[$key]['value'] = date(_DBDATESTRING, strtotime($value)); | 
| 241: | } | 
| 242: | break; | 
| 243: | case XOBJ_DTYPE_TIME: | 
| 244: | if (!is_string($value) && is_numeric($value)) { | 
| 245: | $this->vars[$key]['value'] = date(_DBTIMESTRING, $value); | 
| 246: | } else { | 
| 247: | $this->vars[$key]['value'] = date(_DBTIMESTRING, strtotime($value)); | 
| 248: | } | 
| 249: | break; | 
| 250: | case XOBJ_DTYPE_TIMESTAMP: | 
| 251: | if (!is_string($value) && is_numeric($value)) { | 
| 252: | $this->vars[$key]['value'] = date(_DBTIMESTAMPSTRING, $value); | 
| 253: | } else { | 
| 254: | $this->vars[$key]['value'] = date(_DBTIMESTAMPSTRING, strtotime($value)); | 
| 255: | } | 
| 256: | break; | 
| 257: |  | 
| 258: | default: | 
| 259: | $this->vars[$key]['value'] =& $value; | 
| 260: | } | 
| 261: | } | 
| 262: | } | 
| 263: |  | 
| 264: |  | 
| 265: |  | 
| 266: |  | 
| 267: |  | 
| 268: |  | 
| 269: |  | 
| 270: | public function assignVars($var_arr) | 
| 271: | { | 
| 272: | if (is_array($var_arr)) { | 
| 273: | foreach ($var_arr as $key => $value) { | 
| 274: | $this->assignVar($key, $value); | 
| 275: | } | 
| 276: | } | 
| 277: | } | 
| 278: |  | 
| 279: |  | 
| 280: |  | 
| 281: |  | 
| 282: |  | 
| 283: |  | 
| 284: |  | 
| 285: |  | 
| 286: |  | 
| 287: | public function setVar($key, $value, $not_gpc = false) | 
| 288: | { | 
| 289: | if (!empty($key) && isset($value) && isset($this->vars[$key])) { | 
| 290: | $this->vars[$key]['value']   =& $value; | 
| 291: | $this->vars[$key]['not_gpc'] = $not_gpc; | 
| 292: | $this->vars[$key]['changed'] = true; | 
| 293: | $this->setDirty(); | 
| 294: | } | 
| 295: | } | 
| 296: |  | 
| 297: |  | 
| 298: |  | 
| 299: |  | 
| 300: |  | 
| 301: |  | 
| 302: |  | 
| 303: |  | 
| 304: | public function setVars($var_arr, $not_gpc = false) | 
| 305: | { | 
| 306: | if (is_array($var_arr)) { | 
| 307: | foreach ($var_arr as $key => $value) { | 
| 308: | $this->setVar($key, $value, $not_gpc); | 
| 309: | } | 
| 310: | } | 
| 311: | } | 
| 312: |  | 
| 313: |  | 
| 314: |  | 
| 315: |  | 
| 316: |  | 
| 317: |  | 
| 318: |  | 
| 319: |  | 
| 320: |  | 
| 321: |  | 
| 322: | public function destroyVars($var) | 
| 323: | { | 
| 324: | if (empty($var)) { | 
| 325: | return true; | 
| 326: | } | 
| 327: | $var = !is_array($var) ? array($var) : $var; | 
| 328: | foreach ($var as $key) { | 
| 329: | if (!isset($this->vars[$key])) { | 
| 330: | continue; | 
| 331: | } | 
| 332: | $this->vars[$key]['changed'] = null; | 
| 333: | } | 
| 334: |  | 
| 335: | return true; | 
| 336: | } | 
| 337: |  | 
| 338: |  | 
| 339: |  | 
| 340: |  | 
| 341: |  | 
| 342: |  | 
| 343: | public function destoryVars($var) | 
| 344: | { | 
| 345: | $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1); | 
| 346: | $GLOBALS['xoopsLogger']->addDeprecated(__METHOD__ . "() is deprecated, called from {$trace[0]['file']}line {$trace[0]['line']}"); | 
| 347: | return $this->destroyVars($var); | 
| 348: | } | 
| 349: |  | 
| 350: |  | 
| 351: |  | 
| 352: |  | 
| 353: |  | 
| 354: |  | 
| 355: |  | 
| 356: |  | 
| 357: |  | 
| 358: |  | 
| 359: |  | 
| 360: |  | 
| 361: |  | 
| 362: |  | 
| 363: |  | 
| 364: |  | 
| 365: | public function setFormVars($var_arr = null, $pref = 'xo_', $not_gpc = false) | 
| 366: | { | 
| 367: | $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1); | 
| 368: | $GLOBALS['xoopsLogger']->addDeprecated(__METHOD__ . "() is deprecated, called from {$trace[0]['file']}line {$trace[0]['line']}"); | 
| 369: |  | 
| 370: | $len = strlen($pref); | 
| 371: | if (is_array($var_arr)) { | 
| 372: | foreach ($var_arr as $key => $value) { | 
| 373: | if ($pref == substr($key, 0, $len)) { | 
| 374: | $this->setVar(substr($key, $len), $value, $not_gpc); | 
| 375: | } | 
| 376: | } | 
| 377: | } | 
| 378: | } | 
| 379: |  | 
| 380: |  | 
| 381: |  | 
| 382: |  | 
| 383: |  | 
| 384: |  | 
| 385: |  | 
| 386: | public function &getVars() | 
| 387: | { | 
| 388: | return $this->vars; | 
| 389: | } | 
| 390: |  | 
| 391: |  | 
| 392: |  | 
| 393: |  | 
| 394: |  | 
| 395: |  | 
| 396: |  | 
| 397: |  | 
| 398: |  | 
| 399: | public function getValues($keys = null, $format = 's', $maxDepth = 1) | 
| 400: | { | 
| 401: | if (!isset($keys)) { | 
| 402: | $keys = array_keys($this->vars); | 
| 403: | } | 
| 404: | $vars = array(); | 
| 405: | foreach ($keys as $key) { | 
| 406: | if (isset($this->vars[$key])) { | 
| 407: | if (is_object($this->vars[$key]) && is_a($this->vars[$key], 'XoopsObject')) { | 
| 408: | if ($maxDepth) { | 
| 409: | $vars[$key] = $this->vars[$key]->getValues(null, $format, $maxDepth - 1); | 
| 410: | } | 
| 411: | } else { | 
| 412: | $vars[$key] = $this->getVar($key, $format); | 
| 413: | } | 
| 414: | } | 
| 415: | } | 
| 416: |  | 
| 417: | return $vars; | 
| 418: | } | 
| 419: |  | 
| 420: |  | 
| 421: |  | 
| 422: |  | 
| 423: |  | 
| 424: |  | 
| 425: |  | 
| 426: |  | 
| 427: |  | 
| 428: |  | 
| 429: |  | 
| 430: | public function getVar($key, $format = null) | 
| 431: | { | 
| 432: | $format = (null === $format) ? 's' : (string) $format; | 
| 433: | $ret = null; | 
| 434: | if (!isset($this->vars[$key])) { | 
| 435: | return $ret; | 
| 436: | } | 
| 437: | $ret = $this->vars[$key]['value']; | 
| 438: | $myts  = \MyTextSanitizer::getInstance(); | 
| 439: | switch ($this->vars[$key]['data_type']) { | 
| 440: | case XOBJ_DTYPE_INT: | 
| 441: | $ret = (null === $ret) ? null : (int) $ret; | 
| 442: | break; | 
| 443: | case XOBJ_DTYPE_UNICODE_TXTBOX: | 
| 444: | case XOBJ_DTYPE_TXTBOX: | 
| 445: | switch (strtolower($format)) { | 
| 446: | case 's': | 
| 447: | case 'show': | 
| 448: | case 'e': | 
| 449: | case 'edit': | 
| 450: | return $myts->htmlSpecialChars($ret); | 
| 451: | break 1; | 
| 452: | case 'p': | 
| 453: | case 'preview': | 
| 454: | case 'f': | 
| 455: | case 'formpreview': | 
| 456: | return $myts->htmlSpecialChars($myts->stripSlashesGPC($ret)); | 
| 457: | break 1; | 
| 458: | case 'n': | 
| 459: | case 'none': | 
| 460: | default: | 
| 461: | break 1; | 
| 462: | } | 
| 463: | break; | 
| 464: | case XOBJ_DTYPE_UNICODE_TXTAREA: | 
| 465: | case XOBJ_DTYPE_TXTAREA: | 
| 466: | switch (strtolower($format)) { | 
| 467: | case 's': | 
| 468: | case 'show': | 
| 469: | $html   = !empty($this->vars['dohtml']['value']) ? 1 : 0; | 
| 470: | $xcode  = (!isset($this->vars['doxcode']['value']) || $this->vars['doxcode']['value'] == 1) ? 1 : 0; | 
| 471: | $smiley = (!isset($this->vars['dosmiley']['value']) || $this->vars['dosmiley']['value'] == 1) ? 1 : 0; | 
| 472: | $image  = (!isset($this->vars['doimage']['value']) || $this->vars['doimage']['value'] == 1) ? 1 : 0; | 
| 473: | $br     = (!isset($this->vars['dobr']['value']) || $this->vars['dobr']['value'] == 1) ? 1 : 0; | 
| 474: |  | 
| 475: | return $myts->displayTarea($ret, $html, $smiley, $xcode, $image, $br); | 
| 476: | break 1; | 
| 477: | case 'e': | 
| 478: | case 'edit': | 
| 479: | return htmlspecialchars((string)$ret, ENT_QUOTES); | 
| 480: | break 1; | 
| 481: | case 'p': | 
| 482: | case 'preview': | 
| 483: | $html   = !empty($this->vars['dohtml']['value']) ? 1 : 0; | 
| 484: | $xcode  = (!isset($this->vars['doxcode']['value']) || $this->vars['doxcode']['value'] == 1) ? 1 : 0; | 
| 485: | $smiley = (!isset($this->vars['dosmiley']['value']) || $this->vars['dosmiley']['value'] == 1) ? 1 : 0; | 
| 486: | $image  = (!isset($this->vars['doimage']['value']) || $this->vars['doimage']['value'] == 1) ? 1 : 0; | 
| 487: | $br     = (!isset($this->vars['dobr']['value']) || $this->vars['dobr']['value'] == 1) ? 1 : 0; | 
| 488: |  | 
| 489: | return $myts->previewTarea($ret, $html, $smiley, $xcode, $image, $br); | 
| 490: | break 1; | 
| 491: | case 'f': | 
| 492: | case 'formpreview': | 
| 493: | return htmlspecialchars($myts->stripSlashesGPC($ret), ENT_QUOTES); | 
| 494: | break 1; | 
| 495: | case 'n': | 
| 496: | case 'none': | 
| 497: | default: | 
| 498: | break 1; | 
| 499: | } | 
| 500: | break; | 
| 501: | case XOBJ_DTYPE_UNICODE_ARRAY: | 
| 502: | switch (strtolower($format)) { | 
| 503: | case 'n': | 
| 504: | case 'none': | 
| 505: | break 1; | 
| 506: | default: | 
| 507: | if (!is_array($ret)) { | 
| 508: | if ($ret != '') { | 
| 509: | $ret = unserialize($ret); | 
| 510: | } | 
| 511: | $ret = is_array($ret) ? $ret : array(); | 
| 512: | if (is_array($ret)) { | 
| 513: | $ret = array_walk($ret, 'xoops_aw_decode'); | 
| 514: | } | 
| 515: | } | 
| 516: |  | 
| 517: | return $ret; | 
| 518: | break 1; | 
| 519: | } | 
| 520: | break; | 
| 521: | case XOBJ_DTYPE_ARRAY: | 
| 522: | switch (strtolower($format)) { | 
| 523: | case 'n': | 
| 524: | case 'none': | 
| 525: | break 1; | 
| 526: | default: | 
| 527: | if (!is_array($ret)) { | 
| 528: | if ($ret != '') { | 
| 529: | $ret = unserialize($ret); | 
| 530: | } | 
| 531: | $ret = is_array($ret) ? $ret : array(); | 
| 532: | } | 
| 533: |  | 
| 534: | return $ret; | 
| 535: | break 1; | 
| 536: | } | 
| 537: | break; | 
| 538: | case XOBJ_DTYPE_SOURCE: | 
| 539: | switch (strtolower($format)) { | 
| 540: | case 's': | 
| 541: | case 'show': | 
| 542: | break 1; | 
| 543: | case 'e': | 
| 544: | case 'edit': | 
| 545: | return htmlspecialchars($ret, ENT_QUOTES); | 
| 546: | break 1; | 
| 547: | case 'p': | 
| 548: | case 'preview': | 
| 549: | return $myts->stripSlashesGPC($ret); | 
| 550: | break 1; | 
| 551: | case 'f': | 
| 552: | case 'formpreview': | 
| 553: | return htmlspecialchars($myts->stripSlashesGPC($ret), ENT_QUOTES); | 
| 554: | break 1; | 
| 555: | case 'n': | 
| 556: | case 'none': | 
| 557: | default: | 
| 558: | break 1; | 
| 559: | } | 
| 560: | break; | 
| 561: | case XOBJ_DTYPE_DATE: | 
| 562: | switch (strtolower($format)) { | 
| 563: | case 's': | 
| 564: | case 'show': | 
| 565: | if (is_string($ret) && !is_numeric($ret)) { | 
| 566: | return date(_DBDATESTRING, strtotime($ret)); | 
| 567: | } else { | 
| 568: | return date(_DBDATESTRING, $ret); | 
| 569: | } | 
| 570: | break 1; | 
| 571: | case 'e': | 
| 572: | case 'edit': | 
| 573: | if (is_string($ret) && !is_numeric($ret)) { | 
| 574: | return htmlspecialchars(date(_DBDATESTRING, strtotime($ret)), ENT_QUOTES); | 
| 575: | } else { | 
| 576: | return htmlspecialchars(date(_DBDATESTRING, $ret), ENT_QUOTES); | 
| 577: | } | 
| 578: | break 1; | 
| 579: | case 'p': | 
| 580: | case 'preview': | 
| 581: | if (is_string($ret) && !is_numeric($ret)) { | 
| 582: | return $myts->stripSlashesGPC(date(_DBDATESTRING, strtotime($ret))); | 
| 583: | } else { | 
| 584: | return $myts->stripSlashesGPC(date(_DBDATESTRING, $ret)); | 
| 585: | } | 
| 586: | break 1; | 
| 587: | case 'f': | 
| 588: | case 'formpreview': | 
| 589: | if (is_string($ret) && !is_numeric($ret)) { | 
| 590: | return htmlspecialchars($myts->stripSlashesGPC(date(_DBDATESTRING, strtotime($ret))), ENT_QUOTES); | 
| 591: | } else { | 
| 592: | return htmlspecialchars($myts->stripSlashesGPC(date(_DBDATESTRING, $ret)), ENT_QUOTES); | 
| 593: | } | 
| 594: | break 1; | 
| 595: | case 'n': | 
| 596: | case 'none': | 
| 597: | default: | 
| 598: | break 1; | 
| 599: | } | 
| 600: | break; | 
| 601: | case XOBJ_DTYPE_TIME: | 
| 602: | switch (strtolower($format)) { | 
| 603: | case 's': | 
| 604: | case 'show': | 
| 605: | if (is_string($ret) && !is_numeric($ret)) { | 
| 606: | return date(_DBTIMESTRING, strtotime($ret)); | 
| 607: | } else { | 
| 608: | return date(_DBTIMESTRING, $ret); | 
| 609: | } | 
| 610: | break 1; | 
| 611: | case 'e': | 
| 612: | case 'edit': | 
| 613: | if (is_string($ret) && !is_numeric($ret)) { | 
| 614: | return htmlspecialchars(date(_DBTIMESTRING, strtotime($ret)), ENT_QUOTES); | 
| 615: | } else { | 
| 616: | return htmlspecialchars(date(_DBTIMESTRING, $ret), ENT_QUOTES); | 
| 617: | } | 
| 618: | break 1; | 
| 619: | case 'p': | 
| 620: | case 'preview': | 
| 621: | if (is_string($ret) && !is_numeric($ret)) { | 
| 622: | return $myts->stripSlashesGPC(date(_DBTIMESTRING, strtotime($ret))); | 
| 623: | } else { | 
| 624: | return $myts->stripSlashesGPC(date(_DBTIMESTRING, $ret)); | 
| 625: | } | 
| 626: | break 1; | 
| 627: | case 'f': | 
| 628: | case 'formpreview': | 
| 629: | if (is_string($ret) && !is_numeric($ret)) { | 
| 630: | return htmlspecialchars($myts->stripSlashesGPC(date(_DBTIMESTRING, strtotime($ret))), ENT_QUOTES); | 
| 631: | } else { | 
| 632: | return htmlspecialchars($myts->stripSlashesGPC(date(_DBTIMESTRING, $ret)), ENT_QUOTES); | 
| 633: | } | 
| 634: | break 1; | 
| 635: | case 'n': | 
| 636: | case 'none': | 
| 637: | default: | 
| 638: | break 1; | 
| 639: | } | 
| 640: | break; | 
| 641: | case XOBJ_DTYPE_TIMESTAMP: | 
| 642: | switch (strtolower($format)) { | 
| 643: | case 's': | 
| 644: | case 'show': | 
| 645: | if (is_string($ret) && !is_numeric($ret)) { | 
| 646: | return date(_DBTIMESTAMPSTRING, strtotime($ret)); | 
| 647: | } else { | 
| 648: | return date(_DBTIMESTAMPSTRING, $ret); | 
| 649: | } | 
| 650: | break 1; | 
| 651: | case 'e': | 
| 652: | case 'edit': | 
| 653: | if (is_string($ret) && !is_numeric($ret)) { | 
| 654: | return htmlspecialchars(date(_DBTIMESTAMPSTRING, strtotime($ret)), ENT_QUOTES); | 
| 655: | } else { | 
| 656: | return htmlspecialchars(date(_DBTIMESTAMPSTRING, $ret), ENT_QUOTES); | 
| 657: | } | 
| 658: | break 1; | 
| 659: | case 'p': | 
| 660: | case 'preview': | 
| 661: | if (is_string($ret) && !is_numeric($ret)) { | 
| 662: | return $myts->stripSlashesGPC(date(_DBTIMESTAMPSTRING, strtotime($ret))); | 
| 663: | } else { | 
| 664: | return $myts->stripSlashesGPC(date(_DBTIMESTAMPSTRING, $ret)); | 
| 665: | } | 
| 666: | break 1; | 
| 667: | case 'f': | 
| 668: | case 'formpreview': | 
| 669: | if (is_string($ret) && !is_numeric($ret)) { | 
| 670: | return htmlspecialchars($myts->stripSlashesGPC(date(_DBTIMESTAMPSTRING, strtotime($ret))), ENT_QUOTES); | 
| 671: | } else { | 
| 672: | return htmlspecialchars($myts->stripSlashesGPC(date(_DBTIMESTAMPSTRING, $ret)), ENT_QUOTES); | 
| 673: | } | 
| 674: | break 1; | 
| 675: | case 'n': | 
| 676: | case 'none': | 
| 677: | default: | 
| 678: | break 1; | 
| 679: | } | 
| 680: | break; | 
| 681: | default: | 
| 682: | if ($this->vars[$key]['options'] != '' && $ret != '') { | 
| 683: | switch (strtolower($format)) { | 
| 684: | case 's': | 
| 685: | case 'show': | 
| 686: | $selected = explode('|', $ret); | 
| 687: | $options  = explode('|', $this->vars[$key]['options']); | 
| 688: | $i        = 1; | 
| 689: | $ret      = array(); | 
| 690: | foreach ($options as $op) { | 
| 691: | if (in_array($i, $selected)) { | 
| 692: | $ret[] = $op; | 
| 693: | } | 
| 694: | ++$i; | 
| 695: | } | 
| 696: |  | 
| 697: | return implode(', ', $ret); | 
| 698: | case 'e': | 
| 699: | case 'edit': | 
| 700: | $ret = explode('|', $ret); | 
| 701: | break 1; | 
| 702: | default: | 
| 703: | break 1; | 
| 704: | } | 
| 705: | } | 
| 706: | break; | 
| 707: | } | 
| 708: |  | 
| 709: | return $ret; | 
| 710: | } | 
| 711: |  | 
| 712: |  | 
| 713: |  | 
| 714: |  | 
| 715: |  | 
| 716: |  | 
| 717: |  | 
| 718: |  | 
| 719: |  | 
| 720: |  | 
| 721: | public function cleanVars() | 
| 722: | { | 
| 723: | $myts              = \MyTextSanitizer::getInstance(); | 
| 724: | $existing_errors = $this->getErrors(); | 
| 725: | $this->_errors   = array(); | 
| 726: | foreach ($this->vars as $k => $v) { | 
| 727: | $cleanv = $v['value']; | 
| 728: | if (!$v['changed']) { | 
| 729: | } else { | 
| 730: | $cleanv = is_string($cleanv) ? trim($cleanv) : $cleanv; | 
| 731: | switch ($v['data_type']) { | 
| 732: | case XOBJ_DTYPE_TIMESTAMP: | 
| 733: | $cleanv = !is_string($cleanv) && is_numeric($cleanv) ? date(_DBTIMESTAMPSTRING, $cleanv) : date(_DBTIMESTAMPSTRING, strtotime($cleanv)); | 
| 734: | break; | 
| 735: | case XOBJ_DTYPE_TIME: | 
| 736: | $cleanv = !is_string($cleanv) && is_numeric($cleanv) ? date(_DBTIMESTRING, $cleanv) : date(_DBTIMESTRING, strtotime($cleanv)); | 
| 737: | break; | 
| 738: | case XOBJ_DTYPE_DATE: | 
| 739: | $cleanv = !is_string($cleanv) && is_numeric($cleanv) ? date(_DBDATESTRING, $cleanv) : date(_DBDATESTRING, strtotime($cleanv)); | 
| 740: | break; | 
| 741: | case XOBJ_DTYPE_TXTBOX: | 
| 742: | if ($v['required'] && $cleanv != '0' && $cleanv == '') { | 
| 743: | $this->setErrors(sprintf(_XOBJ_ERR_REQUIRED, $k)); | 
| 744: | continue 2; | 
| 745: | } | 
| 746: | if (isset($v['maxlength']) && strlen($cleanv) > (int)$v['maxlength']) { | 
| 747: | $this->setErrors(sprintf(_XOBJ_ERR_SHORTERTHAN, $k, (int)$v['maxlength'])); | 
| 748: | continue 2; | 
| 749: | } | 
| 750: | if (!$v['not_gpc']) { | 
| 751: | $cleanv = $myts->stripSlashesGPC($myts->censorString($cleanv)); | 
| 752: | } else { | 
| 753: | $cleanv = $myts->censorString($cleanv); | 
| 754: | } | 
| 755: | break; | 
| 756: | case XOBJ_DTYPE_TXTAREA: | 
| 757: | if ($v['required'] && $cleanv != '0' && $cleanv == '') { | 
| 758: | $this->setErrors(sprintf(_XOBJ_ERR_REQUIRED, $k)); | 
| 759: | continue 2; | 
| 760: | } | 
| 761: | if (!$v['not_gpc']) { | 
| 762: | $cleanv = $myts->stripSlashesGPC($myts->censorString($cleanv)); | 
| 763: | } else { | 
| 764: | $cleanv = $myts->censorString($cleanv); | 
| 765: | } | 
| 766: | break; | 
| 767: | case XOBJ_DTYPE_SOURCE: | 
| 768: | if (!$v['not_gpc']) { | 
| 769: | $cleanv = $myts->stripSlashesGPC($cleanv); | 
| 770: | } | 
| 771: | break; | 
| 772: | case XOBJ_DTYPE_INT: | 
| 773: | $cleanv = (int)$cleanv; | 
| 774: | break; | 
| 775: |  | 
| 776: | case XOBJ_DTYPE_EMAIL: | 
| 777: | if ($v['required'] && $cleanv == '') { | 
| 778: | $this->setErrors(sprintf(_XOBJ_ERR_REQUIRED, $k)); | 
| 779: | continue 2; | 
| 780: | } | 
| 781: | if ($cleanv != '' && !preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+([\.][a-z0-9-]+)+$/i", $cleanv)) { | 
| 782: | $this->setErrors('Invalid Email'); | 
| 783: | continue 2; | 
| 784: | } | 
| 785: | if (!$v['not_gpc']) { | 
| 786: | $cleanv = $myts->stripSlashesGPC($cleanv); | 
| 787: | } | 
| 788: | break; | 
| 789: | case XOBJ_DTYPE_URL: | 
| 790: | if ($v['required'] && $cleanv == '') { | 
| 791: | $this->setErrors(sprintf(_XOBJ_ERR_REQUIRED, $k)); | 
| 792: | continue 2; | 
| 793: | } | 
| 794: | if ($cleanv != '' && !preg_match("/^http[s]*:\/\//i", $cleanv)) { | 
| 795: | $cleanv = XOOPS_PROT . $cleanv; | 
| 796: | } | 
| 797: | if (!$v['not_gpc']) { | 
| 798: | $cleanv = $myts->stripSlashesGPC($cleanv); | 
| 799: | } | 
| 800: | break; | 
| 801: | case XOBJ_DTYPE_ARRAY: | 
| 802: | $cleanv = (array)$cleanv; | 
| 803: | $cleanv = serialize($cleanv); | 
| 804: | break; | 
| 805: | case XOBJ_DTYPE_STIME: | 
| 806: | case XOBJ_DTYPE_MTIME: | 
| 807: | case XOBJ_DTYPE_LTIME: | 
| 808: | $cleanv = !is_string($cleanv) ? (int)$cleanv : strtotime($cleanv); | 
| 809: | break; | 
| 810: | case XOBJ_DTYPE_FLOAT: | 
| 811: | $cleanv = (float)$cleanv; | 
| 812: | break; | 
| 813: | case XOBJ_DTYPE_DECIMAL: | 
| 814: | $cleanv = (float)$cleanv; | 
| 815: | break; | 
| 816: | case XOBJ_DTYPE_ENUM: | 
| 817: | if (!in_array($cleanv, $v['enumeration'])) { | 
| 818: | $this->setErrors('Invalid Enumeration'); | 
| 819: | continue 2; | 
| 820: | } | 
| 821: | break; | 
| 822: | case XOBJ_DTYPE_UNICODE_TXTBOX: | 
| 823: | if ($v['required'] && $cleanv != '0' && $cleanv == '') { | 
| 824: | $this->setErrors(sprintf(_XOBJ_ERR_REQUIRED, $k)); | 
| 825: | continue 2; | 
| 826: | } | 
| 827: | $cleanv = xoops_convert_encode($cleanv); | 
| 828: | if (isset($v['maxlength']) && strlen($cleanv) > (int)$v['maxlength']) { | 
| 829: | $this->setErrors(sprintf(_XOBJ_ERR_SHORTERTHAN, $k, (int)$v['maxlength'])); | 
| 830: | continue 2; | 
| 831: | } | 
| 832: | if (!$v['not_gpc']) { | 
| 833: | $cleanv = $myts->stripSlashesGPC($myts->censorString($cleanv)); | 
| 834: | } else { | 
| 835: | $cleanv = $myts->censorString($cleanv); | 
| 836: | } | 
| 837: | break; | 
| 838: | case XOBJ_DTYPE_UNICODE_TXTAREA: | 
| 839: | if ($v['required'] && $cleanv != '0' && $cleanv == '') { | 
| 840: | $this->setErrors(sprintf(_XOBJ_ERR_REQUIRED, $k)); | 
| 841: | continue 2; | 
| 842: | } | 
| 843: | $cleanv = xoops_convert_encode($cleanv); | 
| 844: | if (!$v['not_gpc']) { | 
| 845: | $cleanv = $myts->stripSlashesGPC($myts->censorString($cleanv)); | 
| 846: | } else { | 
| 847: | $cleanv = $myts->censorString($cleanv); | 
| 848: | } | 
| 849: | break; | 
| 850: | case XOBJ_DTYPE_UNICODE_EMAIL: | 
| 851: | if ($v['required'] && $cleanv == '') { | 
| 852: | $this->setErrors(sprintf(_XOBJ_ERR_REQUIRED, $k)); | 
| 853: | continue 2; | 
| 854: | } | 
| 855: | if ($cleanv != '' && !preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+([\.][a-z0-9-]+)+$/i", $cleanv)) { | 
| 856: | $this->setErrors('Invalid Email'); | 
| 857: | continue 2; | 
| 858: | } | 
| 859: | $cleanv = xoops_convert_encode($cleanv); | 
| 860: | if (!$v['not_gpc']) { | 
| 861: | $cleanv = $myts->stripSlashesGPC($cleanv); | 
| 862: | } | 
| 863: | break; | 
| 864: | case XOBJ_DTYPE_UNICODE_URL: | 
| 865: | if ($v['required'] && $cleanv == '') { | 
| 866: | $this->setErrors(sprintf(_XOBJ_ERR_REQUIRED, $k)); | 
| 867: | continue 2; | 
| 868: | } | 
| 869: | if ($cleanv != '' && !preg_match("/^http[s]*:\/\//i", $cleanv)) { | 
| 870: | $cleanv = XOOPS_PROT . $cleanv; | 
| 871: | } | 
| 872: | $cleanv = xoops_convert_encode($cleanv); | 
| 873: | if (!$v['not_gpc']) { | 
| 874: | $cleanv = $myts->stripSlashesGPC($cleanv); | 
| 875: | } | 
| 876: | break; | 
| 877: | case XOBJ_DTYPE_UNICODE_ARRAY: | 
| 878: | $cleanv = serialize(array_walk($cleanv, 'xoops_aw_encode')); | 
| 879: | break; | 
| 880: | default: | 
| 881: | break; | 
| 882: |  | 
| 883: | } | 
| 884: | } | 
| 885: | $this->cleanVars[$k] = str_replace('\\"', '"', (string) $cleanv); | 
| 886: | unset($cleanv); | 
| 887: | } | 
| 888: | if (count($this->_errors) > 0) { | 
| 889: | $this->_errors = array_merge($existing_errors, $this->_errors); | 
| 890: |  | 
| 891: | return false; | 
| 892: | } | 
| 893: | $this->_errors = array_merge($existing_errors, $this->_errors); | 
| 894: | $this->unsetDirty(); | 
| 895: |  | 
| 896: | return true; | 
| 897: | } | 
| 898: |  | 
| 899: |  | 
| 900: |  | 
| 901: |  | 
| 902: |  | 
| 903: |  | 
| 904: |  | 
| 905: |  | 
| 906: | public function registerFilter($filtername) | 
| 907: | { | 
| 908: | $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1); | 
| 909: | $GLOBALS['xoopsLogger']->addDeprecated(__METHOD__ . "() is deprecated, called from {$trace[0]['file']}line {$trace[0]['line']}"); | 
| 910: | $this->_filters[] = $filtername; | 
| 911: | } | 
| 912: |  | 
| 913: |  | 
| 914: |  | 
| 915: |  | 
| 916: |  | 
| 917: |  | 
| 918: | public function _loadFilters() | 
| 919: | { | 
| 920: | static $loaded; | 
| 921: | if (isset($loaded)) { | 
| 922: | return null; | 
| 923: | } | 
| 924: | $loaded = 1; | 
| 925: |  | 
| 926: | $path = empty($this->plugin_path) ? __DIR__ . '/filters' : $this->plugin_path; | 
| 927: | if (file_exists($file = $path . '/filter.php')) { | 
| 928: | include_once $file; | 
| 929: | foreach ($this->_filters as $f) { | 
| 930: | if (file_exists($file = $path . '/' . strtolower($f) . 'php')) { | 
| 931: | include_once $file; | 
| 932: | } | 
| 933: | } | 
| 934: | } | 
| 935: | } | 
| 936: |  | 
| 937: |  | 
| 938: |  | 
| 939: |  | 
| 940: |  | 
| 941: |  | 
| 942: |  | 
| 943: |  | 
| 944: |  | 
| 945: |  | 
| 946: |  | 
| 947: |  | 
| 948: |  | 
| 949: |  | 
| 950: | public function loadFilters($method) | 
| 951: | { | 
| 952: | $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1); | 
| 953: | $GLOBALS['xoopsLogger']->addDeprecated(__METHOD__ . "() is deprecated, called from {$trace[0]['file']}line {$trace[0]['line']}"); | 
| 954: |  | 
| 955: | $this->_loadFilters(); | 
| 956: |  | 
| 957: | xoops_load('XoopsCache'); | 
| 958: | $class = get_class($this); | 
| 959: | if (!$modules_active = XoopsCache::read('system_modules_active')) { | 
| 960: |  | 
| 961: | $module_handler = xoops_getHandler('module'); | 
| 962: | $modules_obj    = $module_handler->getObjects(new Criteria('isactive', 1)); | 
| 963: | $modules_active = array(); | 
| 964: | foreach (array_keys($modules_obj) as $key) { | 
| 965: | $modules_active[] = $modules_obj[$key]->getVar('dirname'); | 
| 966: | } | 
| 967: | unset($modules_obj); | 
| 968: | XoopsCache::write('system_modules_active', $modules_active); | 
| 969: | } | 
| 970: | foreach ($modules_active as $dirname) { | 
| 971: | if (file_exists($file = XOOPS_ROOT_PATH . '/modules/' . $dirname . '/filter/' . $class . '.' . $method . '.php')) { | 
| 972: | include_once $file; | 
| 973: | if (function_exists($class . '_' . $method)) { | 
| 974: | call_user_func_array($dirname . '_' . $class . '_' . $method, array(&$this)); | 
| 975: | } | 
| 976: | } | 
| 977: | } | 
| 978: | } | 
| 979: |  | 
| 980: |  | 
| 981: |  | 
| 982: |  | 
| 983: |  | 
| 984: |  | 
| 985: |  | 
| 986: | public function xoopsClone() | 
| 987: | { | 
| 988: | $class = get_class($this); | 
| 989: | $clone = null; | 
| 990: | $clone = new $class(); | 
| 991: | foreach ($this->vars as $k => $v) { | 
| 992: | $clone->assignVar($k, $v['value']); | 
| 993: | } | 
| 994: |  | 
| 995: | $clone->setNew(); | 
| 996: |  | 
| 997: | return $clone; | 
| 998: | } | 
| 999: |  | 
| 1000: |  | 
| 1001: |  | 
| 1002: |  | 
| 1003: | public function __clone() | 
| 1004: | { | 
| 1005: |  | 
| 1006: | $this->setNew(); | 
| 1007: | } | 
| 1008: |  | 
| 1009: |  | 
| 1010: |  | 
| 1011: |  | 
| 1012: |  | 
| 1013: |  | 
| 1014: |  | 
| 1015: |  | 
| 1016: | public function setErrors($err_str) | 
| 1017: | { | 
| 1018: | if (is_array($err_str)) { | 
| 1019: | $this->_errors = array_merge($this->_errors, $err_str); | 
| 1020: | } else { | 
| 1021: | $this->_errors[] = trim($err_str); | 
| 1022: | } | 
| 1023: | } | 
| 1024: |  | 
| 1025: |  | 
| 1026: |  | 
| 1027: |  | 
| 1028: |  | 
| 1029: |  | 
| 1030: |  | 
| 1031: | public function getErrors() | 
| 1032: | { | 
| 1033: | return $this->_errors; | 
| 1034: | } | 
| 1035: |  | 
| 1036: |  | 
| 1037: |  | 
| 1038: |  | 
| 1039: |  | 
| 1040: |  | 
| 1041: |  | 
| 1042: | public function getHtmlErrors() | 
| 1043: | { | 
| 1044: | $ret = '<h4>Errors</h4>'; | 
| 1045: | if (!empty($this->_errors)) { | 
| 1046: | foreach ($this->_errors as $error) { | 
| 1047: | $ret .= $error . '<br>'; | 
| 1048: | } | 
| 1049: | } else { | 
| 1050: | $ret .= 'None<br>'; | 
| 1051: | } | 
| 1052: |  | 
| 1053: | return $ret; | 
| 1054: | } | 
| 1055: |  | 
| 1056: |  | 
| 1057: |  | 
| 1058: |  | 
| 1059: |  | 
| 1060: |  | 
| 1061: |  | 
| 1062: |  | 
| 1063: | public function toArray() | 
| 1064: | { | 
| 1065: | return $this->getValues(); | 
| 1066: | } | 
| 1067: | } | 
| 1068: |  | 
| 1069: |  | 
| 1070: |  | 
| 1071: |  | 
| 1072: |  | 
| 1073: |  | 
| 1074: |  | 
| 1075: |  | 
| 1076: |  | 
| 1077: |  | 
| 1078: |  | 
| 1079: | class XoopsObjectHandler | 
| 1080: | { | 
| 1081: |  | 
| 1082: |  | 
| 1083: |  | 
| 1084: |  | 
| 1085: |  | 
| 1086: | public $db; | 
| 1087: |  | 
| 1088: |  | 
| 1089: |  | 
| 1090: |  | 
| 1091: |  | 
| 1092: |  | 
| 1093: |  | 
| 1094: | public function __construct(XoopsDatabase $db) | 
| 1095: | { | 
| 1096: |  | 
| 1097: | $this->db = $db; | 
| 1098: | } | 
| 1099: |  | 
| 1100: |  | 
| 1101: |  | 
| 1102: |  | 
| 1103: |  | 
| 1104: |  | 
| 1105: |  | 
| 1106: | public function XoopsObjectHandler($db) | 
| 1107: | { | 
| 1108: | $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1); | 
| 1109: | trigger_error("Should call parent::__construct in {$trace[0]['file']} line {$trace[0]['line']},", E_USER_DEPRECATED); | 
| 1110: | self::__construct($db); | 
| 1111: | } | 
| 1112: |  | 
| 1113: |  | 
| 1114: |  | 
| 1115: |  | 
| 1116: |  | 
| 1117: |  | 
| 1118: |  | 
| 1119: | public function create() | 
| 1120: | { | 
| 1121: | } | 
| 1122: |  | 
| 1123: |  | 
| 1124: |  | 
| 1125: |  | 
| 1126: |  | 
| 1127: |  | 
| 1128: |  | 
| 1129: |  | 
| 1130: | public function get($id) | 
| 1131: | { | 
| 1132: | } | 
| 1133: |  | 
| 1134: |  | 
| 1135: |  | 
| 1136: |  | 
| 1137: |  | 
| 1138: |  | 
| 1139: |  | 
| 1140: | public function insert(XoopsObject $object) | 
| 1141: | { | 
| 1142: | } | 
| 1143: |  | 
| 1144: |  | 
| 1145: |  | 
| 1146: |  | 
| 1147: |  | 
| 1148: |  | 
| 1149: |  | 
| 1150: | public function delete(XoopsObject $object) | 
| 1151: | { | 
| 1152: | } | 
| 1153: | } | 
| 1154: |  | 
| 1155: |  | 
| 1156: |  | 
| 1157: |  | 
| 1158: |  | 
| 1159: |  | 
| 1160: |  | 
| 1161: |  | 
| 1162: |  | 
| 1163: | class XoopsPersistableObjectHandler extends XoopsObjectHandler | 
| 1164: | { | 
| 1165: |  | 
| 1166: |  | 
| 1167: | public $table_link; | 
| 1168: |  | 
| 1169: |  | 
| 1170: |  | 
| 1171: |  | 
| 1172: |  | 
| 1173: |  | 
| 1174: |  | 
| 1175: |  | 
| 1176: |  | 
| 1177: |  | 
| 1178: |  | 
| 1179: | public $handler; | 
| 1180: |  | 
| 1181: |  | 
| 1182: |  | 
| 1183: |  | 
| 1184: |  | 
| 1185: |  | 
| 1186: |  | 
| 1187: |  | 
| 1188: |  | 
| 1189: |  | 
| 1190: |  | 
| 1191: |  | 
| 1192: |  | 
| 1193: |  | 
| 1194: | public $handlers = array('read' => null, 'stats' => null, 'joint' => null, 'write' => null, 'sync' => null); | 
| 1195: |  | 
| 1196: |  | 
| 1197: |  | 
| 1198: |  | 
| 1199: |  | 
| 1200: |  | 
| 1201: | public $table; | 
| 1202: |  | 
| 1203: |  | 
| 1204: |  | 
| 1205: |  | 
| 1206: | public $keyName; | 
| 1207: |  | 
| 1208: |  | 
| 1209: |  | 
| 1210: |  | 
| 1211: | public $className; | 
| 1212: |  | 
| 1213: |  | 
| 1214: |  | 
| 1215: |  | 
| 1216: | public $identifierName; | 
| 1217: |  | 
| 1218: |  | 
| 1219: |  | 
| 1220: |  | 
| 1221: | public $field_link; | 
| 1222: |  | 
| 1223: |  | 
| 1224: |  | 
| 1225: |  | 
| 1226: | public $field_object; | 
| 1227: |  | 
| 1228: |  | 
| 1229: |  | 
| 1230: |  | 
| 1231: |  | 
| 1232: |  | 
| 1233: |  | 
| 1234: |  | 
| 1235: |  | 
| 1236: |  | 
| 1237: |  | 
| 1238: | public function __construct(XoopsDatabase $db = null, $table = '', $className = '', $keyName = '', $identifierName = '') | 
| 1239: | { | 
| 1240: | $db    = XoopsDatabaseFactory::getDatabaseConnection(); | 
| 1241: | $table = $db->prefix($table); | 
| 1242: | parent::__construct($db); | 
| 1243: | $this->table     = $table; | 
| 1244: | $this->keyName   = $keyName; | 
| 1245: | $this->className = $className; | 
| 1246: | if ($identifierName) { | 
| 1247: | $this->identifierName = $identifierName; | 
| 1248: | } | 
| 1249: | } | 
| 1250: |  | 
| 1251: |  | 
| 1252: |  | 
| 1253: |  | 
| 1254: |  | 
| 1255: |  | 
| 1256: |  | 
| 1257: |  | 
| 1258: |  | 
| 1259: |  | 
| 1260: |  | 
| 1261: |  | 
| 1262: |  | 
| 1263: | public function XoopsPersistableObjectHandler(XoopsDatabase $db = null, $table = '', $className = '', $keyName = '', $identifierName = '') | 
| 1264: | { | 
| 1265: | $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1); | 
| 1266: | trigger_error("Should call parent::__construct in {$trace[0]['file']} line {$trace[0]['line']},", E_USER_DEPRECATED); | 
| 1267: | self::__construct($db, $table, $className, $keyName, $identifierName); | 
| 1268: | } | 
| 1269: |  | 
| 1270: |  | 
| 1271: |  | 
| 1272: |  | 
| 1273: |  | 
| 1274: |  | 
| 1275: |  | 
| 1276: |  | 
| 1277: |  | 
| 1278: |  | 
| 1279: |  | 
| 1280: |  | 
| 1281: | public function setHandler($handler = null, $args = null, $path = null) | 
| 1282: | { | 
| 1283: | $this->handler = null; | 
| 1284: | if (is_object($handler)) { | 
| 1285: | $this->handler = $handler; | 
| 1286: | } elseif (is_string($handler)) { | 
| 1287: | xoops_load('XoopsModelFactory'); | 
| 1288: | $this->handler = XoopsModelFactory::loadHandler($this, $handler, $args); | 
| 1289: | } | 
| 1290: |  | 
| 1291: | return $this->handler; | 
| 1292: | } | 
| 1293: |  | 
| 1294: |  | 
| 1295: |  | 
| 1296: |  | 
| 1297: |  | 
| 1298: |  | 
| 1299: |  | 
| 1300: |  | 
| 1301: |  | 
| 1302: | public function loadHandler($name, $args = null) | 
| 1303: | { | 
| 1304: | static $handlers; | 
| 1305: | if (!isset($handlers[$name])) { | 
| 1306: | xoops_load('XoopsModelFactory'); | 
| 1307: | $handlers[$name] = XoopsModelFactory::loadHandler($this, $name, $args); | 
| 1308: | } else { | 
| 1309: | $handlers[$name]->setHandler($this); | 
| 1310: | $handlers[$name]->setVars($args); | 
| 1311: | } | 
| 1312: |  | 
| 1313: | return $handlers[$name]; | 
| 1314: |  | 
| 1315: |  | 
| 1316: |  | 
| 1317: |  | 
| 1318: |  | 
| 1319: |  | 
| 1320: |  | 
| 1321: |  | 
| 1322: |  | 
| 1323: |  | 
| 1324: |  | 
| 1325: |  | 
| 1326: | } | 
| 1327: |  | 
| 1328: |  | 
| 1329: |  | 
| 1330: |  | 
| 1331: |  | 
| 1332: |  | 
| 1333: |  | 
| 1334: |  | 
| 1335: |  | 
| 1336: |  | 
| 1337: |  | 
| 1338: | public function __call($name, $args) | 
| 1339: | { | 
| 1340: | if (is_object($this->handler) && is_callable(array($this->handler, $name))) { | 
| 1341: | return call_user_func_array(array($this->handler, $name), $args); | 
| 1342: | } | 
| 1343: | foreach (array_keys($this->handlers) as $_handler) { | 
| 1344: | $handler = $this->loadHandler($_handler); | 
| 1345: | if (is_callable(array($handler, $name))) { | 
| 1346: | return call_user_func_array(array($handler, $name), $args); | 
| 1347: | } | 
| 1348: | } | 
| 1349: |  | 
| 1350: | return null; | 
| 1351: | } | 
| 1352: |  | 
| 1353: |  | 
| 1354: |  | 
| 1355: |  | 
| 1356: |  | 
| 1357: |  | 
| 1358: |  | 
| 1359: |  | 
| 1360: |  | 
| 1361: |  | 
| 1362: |  | 
| 1363: | public function create($isNew = true) | 
| 1364: | { | 
| 1365: | $obj = new $this->className(); | 
| 1366: | if ($isNew === true) { | 
| 1367: | $obj->setNew(); | 
| 1368: | } | 
| 1369: |  | 
| 1370: | return $obj; | 
| 1371: | } | 
| 1372: |  | 
| 1373: |  | 
| 1374: |  | 
| 1375: |  | 
| 1376: |  | 
| 1377: |  | 
| 1378: |  | 
| 1379: |  | 
| 1380: |  | 
| 1381: | public function get($id = null, $fields = null) | 
| 1382: | { | 
| 1383: | $object = null; | 
| 1384: | if (empty($id)) { | 
| 1385: | $object = $this->create(); | 
| 1386: |  | 
| 1387: | return $object; | 
| 1388: | } | 
| 1389: | if (!empty($fields) && \is_array($fields)) { | 
| 1390: | $select = implode(',', $fields); | 
| 1391: | if (!in_array($this->keyName, $fields)) { | 
| 1392: | $select .= ', ' . $this->keyName; | 
| 1393: | } | 
| 1394: | } else { | 
| 1395: | $select = '*'; | 
| 1396: | } | 
| 1397: | $sql = sprintf('SELECT %s FROM %s WHERE %s = %s', $select, $this->table, $this->keyName, $this->db->quote($id)); | 
| 1398: |  | 
| 1399: | $result = $this->db->query($sql); | 
| 1400: | if (!$this->db->isResultSet($result)) { | 
| 1401: | return $object; | 
| 1402: | } | 
| 1403: | if (!$this->db->getRowsNum($result)) { | 
| 1404: | return $object; | 
| 1405: | } | 
| 1406: | $object = $this->create(false); | 
| 1407: | $object->assignVars($this->db->fetchArray($result)); | 
| 1408: |  | 
| 1409: | return $object; | 
| 1410: | } | 
| 1411: |  | 
| 1412: |  | 
| 1413: |  | 
| 1414: |  | 
| 1415: |  | 
| 1416: |  | 
| 1417: |  | 
| 1418: |  | 
| 1419: |  | 
| 1420: |  | 
| 1421: |  | 
| 1422: |  | 
| 1423: |  | 
| 1424: |  | 
| 1425: |  | 
| 1426: | public function insert(XoopsObject $object, $force = true) | 
| 1427: | { | 
| 1428: | $handler = $this->loadHandler('write'); | 
| 1429: |  | 
| 1430: | return $handler->insert($object, $force); | 
| 1431: | } | 
| 1432: |  | 
| 1433: |  | 
| 1434: |  | 
| 1435: |  | 
| 1436: |  | 
| 1437: |  | 
| 1438: |  | 
| 1439: |  | 
| 1440: | public function delete(XoopsObject $object, $force = false) | 
| 1441: | { | 
| 1442: | $handler = $this->loadHandler('write'); | 
| 1443: |  | 
| 1444: | return $handler->delete($object, $force); | 
| 1445: | } | 
| 1446: |  | 
| 1447: |  | 
| 1448: |  | 
| 1449: |  | 
| 1450: |  | 
| 1451: |  | 
| 1452: |  | 
| 1453: |  | 
| 1454: |  | 
| 1455: | public function deleteAll(CriteriaElement $criteria = null, $force = true, $asObject = false) | 
| 1456: | { | 
| 1457: | $handler = $this->loadHandler('write'); | 
| 1458: |  | 
| 1459: | return $handler->deleteAll($criteria, $force, $asObject); | 
| 1460: | } | 
| 1461: |  | 
| 1462: |  | 
| 1463: |  | 
| 1464: |  | 
| 1465: |  | 
| 1466: |  | 
| 1467: |  | 
| 1468: |  | 
| 1469: |  | 
| 1470: |  | 
| 1471: | public function updateAll($fieldname, $fieldvalue, CriteriaElement $criteria = null, $force = false) | 
| 1472: | { | 
| 1473: | $handler = $this->loadHandler('write'); | 
| 1474: |  | 
| 1475: | return $handler->updateAll($fieldname, $fieldvalue, $criteria, $force); | 
| 1476: | } | 
| 1477: |  | 
| 1478: |  | 
| 1479: |  | 
| 1480: |  | 
| 1481: |  | 
| 1482: |  | 
| 1483: |  | 
| 1484: |  | 
| 1485: |  | 
| 1486: |  | 
| 1487: |  | 
| 1488: |  | 
| 1489: |  | 
| 1490: |  | 
| 1491: |  | 
| 1492: |  | 
| 1493: | public function &getObjects(CriteriaElement $criteria = null, $id_as_key = false, $as_object = true) | 
| 1494: | { | 
| 1495: | $handler = $this->loadHandler('read'); | 
| 1496: | $ret     = $handler->getObjects($criteria, $id_as_key, $as_object); | 
| 1497: |  | 
| 1498: | return $ret; | 
| 1499: | } | 
| 1500: |  | 
| 1501: |  | 
| 1502: |  | 
| 1503: |  | 
| 1504: |  | 
| 1505: |  | 
| 1506: |  | 
| 1507: |  | 
| 1508: |  | 
| 1509: |  | 
| 1510: | public function &getAll(CriteriaElement $criteria = null, $fields = null, $asObject = true, $id_as_key = true) | 
| 1511: | { | 
| 1512: | $handler = $this->loadHandler('read'); | 
| 1513: | $ret     = $handler->getAll($criteria, $fields, $asObject, $id_as_key); | 
| 1514: |  | 
| 1515: | return $ret; | 
| 1516: | } | 
| 1517: |  | 
| 1518: |  | 
| 1519: |  | 
| 1520: |  | 
| 1521: |  | 
| 1522: |  | 
| 1523: |  | 
| 1524: |  | 
| 1525: |  | 
| 1526: | public function getList(CriteriaElement $criteria = null, $limit = 0, $start = 0) | 
| 1527: | { | 
| 1528: | $handler = $this->loadHandler('read'); | 
| 1529: | $ret     = $handler->getList($criteria, $limit, $start); | 
| 1530: |  | 
| 1531: | return $ret; | 
| 1532: | } | 
| 1533: |  | 
| 1534: |  | 
| 1535: |  | 
| 1536: |  | 
| 1537: |  | 
| 1538: |  | 
| 1539: |  | 
| 1540: | public function &getIds(CriteriaElement $criteria = null) | 
| 1541: | { | 
| 1542: | $handler = $this->loadHandler('read'); | 
| 1543: | $ret     = $handler->getIds($criteria); | 
| 1544: |  | 
| 1545: | return $ret; | 
| 1546: | } | 
| 1547: |  | 
| 1548: |  | 
| 1549: |  | 
| 1550: |  | 
| 1551: |  | 
| 1552: |  | 
| 1553: |  | 
| 1554: |  | 
| 1555: |  | 
| 1556: |  | 
| 1557: |  | 
| 1558: |  | 
| 1559: |  | 
| 1560: | public function &getByLimit($limit = 0, $start = 0, CriteriaElement $criteria = null, $fields = null, $asObject = true) | 
| 1561: | { | 
| 1562: | $handler = $this->loadHandler('read'); | 
| 1563: | $ret     = $handler->getByLimit($limit, $start, $criteria, $fields, $asObject); | 
| 1564: |  | 
| 1565: | return $ret; | 
| 1566: | } | 
| 1567: |  | 
| 1568: |  | 
| 1569: |  | 
| 1570: |  | 
| 1571: |  | 
| 1572: |  | 
| 1573: |  | 
| 1574: |  | 
| 1575: |  | 
| 1576: |  | 
| 1577: |  | 
| 1578: |  | 
| 1579: |  | 
| 1580: |  | 
| 1581: | public function getCount(CriteriaElement $criteria = null) | 
| 1582: | { | 
| 1583: | $handler = $this->loadHandler('stats'); | 
| 1584: |  | 
| 1585: | return $handler->getCount($criteria); | 
| 1586: | } | 
| 1587: |  | 
| 1588: |  | 
| 1589: |  | 
| 1590: |  | 
| 1591: |  | 
| 1592: |  | 
| 1593: |  | 
| 1594: | public function getCounts(CriteriaElement $criteria = null) | 
| 1595: | { | 
| 1596: | $handler = $this->loadHandler('stats'); | 
| 1597: |  | 
| 1598: | return $handler->getCounts($criteria); | 
| 1599: | } | 
| 1600: |  | 
| 1601: |  | 
| 1602: |  | 
| 1603: |  | 
| 1604: |  | 
| 1605: |  | 
| 1606: |  | 
| 1607: |  | 
| 1608: |  | 
| 1609: |  | 
| 1610: |  | 
| 1611: |  | 
| 1612: |  | 
| 1613: |  | 
| 1614: |  | 
| 1615: |  | 
| 1616: |  | 
| 1617: |  | 
| 1618: | public function &getByLink(CriteriaElement $criteria = null, $fields = null, $asObject = true, $field_link = null, $field_object = null) | 
| 1619: | { | 
| 1620: | $handler = $this->loadHandler('joint'); | 
| 1621: | $ret     = $handler->getByLink($criteria, $fields, $asObject, $field_link, $field_object); | 
| 1622: |  | 
| 1623: | return $ret; | 
| 1624: | } | 
| 1625: |  | 
| 1626: |  | 
| 1627: |  | 
| 1628: |  | 
| 1629: |  | 
| 1630: |  | 
| 1631: |  | 
| 1632: | public function getCountByLink(CriteriaElement $criteria = null) | 
| 1633: | { | 
| 1634: | $handler = $this->loadHandler('joint'); | 
| 1635: | $ret     = $handler->getCountByLink($criteria); | 
| 1636: |  | 
| 1637: | return $ret; | 
| 1638: | } | 
| 1639: |  | 
| 1640: |  | 
| 1641: |  | 
| 1642: |  | 
| 1643: |  | 
| 1644: |  | 
| 1645: |  | 
| 1646: | public function getCountsByLink(CriteriaElement $criteria = null) | 
| 1647: | { | 
| 1648: | $handler = $this->loadHandler('joint'); | 
| 1649: | $ret     = $handler->getCountsByLink($criteria); | 
| 1650: |  | 
| 1651: | return $ret; | 
| 1652: | } | 
| 1653: |  | 
| 1654: |  | 
| 1655: |  | 
| 1656: |  | 
| 1657: |  | 
| 1658: |  | 
| 1659: |  | 
| 1660: |  | 
| 1661: | public function updateByLink($data, CriteriaElement $criteria = null) | 
| 1662: | { | 
| 1663: | $handler = $this->loadHandler('joint'); | 
| 1664: | $ret     = $handler->updateByLink($data, $criteria); | 
| 1665: |  | 
| 1666: | return $ret; | 
| 1667: | } | 
| 1668: |  | 
| 1669: |  | 
| 1670: |  | 
| 1671: |  | 
| 1672: |  | 
| 1673: |  | 
| 1674: |  | 
| 1675: | public function deleteByLink(CriteriaElement $criteria = null) | 
| 1676: | { | 
| 1677: | $handler = $this->loadHandler('joint'); | 
| 1678: | $ret     = $handler->deleteByLink($criteria); | 
| 1679: |  | 
| 1680: | return $ret; | 
| 1681: | } | 
| 1682: |  | 
| 1683: |  | 
| 1684: |  | 
| 1685: |  | 
| 1686: |  | 
| 1687: |  | 
| 1688: |  | 
| 1689: |  | 
| 1690: |  | 
| 1691: |  | 
| 1692: |  | 
| 1693: |  | 
| 1694: |  | 
| 1695: |  | 
| 1696: |  | 
| 1697: |  | 
| 1698: | public function cleanOrphan($table_link = '', $field_link = '', $field_object = '') | 
| 1699: | { | 
| 1700: | $handler = $this->loadHandler('sync'); | 
| 1701: | $ret     = $handler->cleanOrphan($table_link, $field_link, $field_object); | 
| 1702: |  | 
| 1703: | return $ret; | 
| 1704: | } | 
| 1705: |  | 
| 1706: |  | 
| 1707: |  | 
| 1708: |  | 
| 1709: |  | 
| 1710: |  | 
| 1711: | public function synchronization() | 
| 1712: | { | 
| 1713: | $retval = $this->cleanOrphan(); | 
| 1714: |  | 
| 1715: | return $retval; | 
| 1716: | } | 
| 1717: |  | 
| 1718: |  | 
| 1719: |  | 
| 1720: |  | 
| 1721: |  | 
| 1722: |  | 
| 1723: |  | 
| 1724: |  | 
| 1725: |  | 
| 1726: |  | 
| 1727: |  | 
| 1728: | public function convertResultSet($result, $id_as_key = false, $as_object = true) | 
| 1729: | { | 
| 1730: | $GLOBALS['xoopsLogger']->addDeprecated(__METHOD__ . ' is deprecated'); | 
| 1731: |  | 
| 1732: | return false; | 
| 1733: | } | 
| 1734: |  | 
| 1735: | } | 
| 1736: |  |