cb.tables.php
上传用户:stephen_wu
上传日期:2008-07-05
资源大小:1757k
文件大小:44k
源码类别:

网络

开发平台:

Unix_Linux

  1. <?php
  2. /**
  3. * Joomla/Mambo Community Builder
  4. * @version $Id: cb.tables.php 567 2006-11-19 10:05:00Z beat $
  5. * @package Community Builder
  6. * @subpackage cb.tables.php
  7. * @author Beat
  8. * @copyright (C) 2008 Lightning MultiCom SA, www.joomlapolis.com
  9. * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU/GPL version 2
  10. */
  11. // ensure this file is being included by a parent file
  12. if ( ! ( defined( '_VALID_CB' ) || defined( '_JEXEC' ) || defined( '_VALID_MOS' ) ) ) { die( 'Direct Access to this location is not allowed.' ); }
  13. class moscomprofilerPlugin extends comprofilerDBTable {
  14. /** @var int */
  15. var $id = null;
  16. /** @var varchar */
  17. var $name = null;
  18. /** @var varchar */
  19. var $element = null;
  20. /** @var varchar */
  21. var $type = null;
  22. /** @var varchar */
  23. var $folder = null;
  24. /** @var varchar */
  25. var $backend_menu = null;
  26. /** @var tinyint unsigned */
  27. var $access = null;
  28. /** @var int */
  29. var $ordering = null;
  30. /** @var tinyint */
  31. var $published = null;
  32. /** @var tinyint */
  33. var $iscore = null;
  34. /** @var tinyint */
  35. var $client_id = null;
  36. /** @var int unsigned */
  37. var $checked_out = null;
  38. /** @var datetime */
  39. var $checked_out_time = null;
  40. /** @var text */
  41. var $params = null;
  42. /**
  43. * Constructor
  44. */
  45. function moscomprofilerPlugin( &$db ) {
  46. $this->comprofilerDBTable( '#__comprofiler_plugin', 'id', $db );
  47. }
  48. function check() {
  49. $ok = ( $this->name );
  50. if ( ! $ok ) {
  51. $this->_error = "Save not allowed";
  52. }
  53. return $ok;
  54. }
  55. }
  56. class moscomprofilerLists extends comprofilerDBTable {
  57. var $listid = null;
  58. var $title = null;
  59. var $description = null;
  60. var $published = null;
  61. var $default = null;
  62. var $usergroupids = null;
  63. var $useraccessgroupid = null;
  64. var $sortfields = null;
  65. var $filterfields = null;
  66. var $ordering = null;
  67. var $col1title = null;
  68. var $col1enabled = null;
  69. var $col1fields = null;
  70. var $col1captions = null;
  71. var $col2title = null;
  72. var $col2enabled = null;
  73. var $col2fields = null;
  74. var $col2captions = null;
  75. var $col3title = null;
  76. var $col3enabled = null;
  77. var $col3fields = null;
  78. var $col3captions = null;
  79. var $col4title = null;
  80. var $col4enabled = null;
  81. var $col4fields = null;
  82. var $col4captions = null;
  83. /** @var text */
  84. var $params = null;
  85.     /**
  86.     * Constructor
  87.     * @param database A database connector object
  88.     */
  89. function moscomprofilerLists( &$db ) {
  90. $this->comprofilerDBTable( '#__comprofiler_lists', 'listid', $db );
  91. } //end func
  92. function store( $listid=0, $updateNulls=false) {
  93. global $_CB_database, $_POST;
  94. if ( ( ! isset( $_POST['listid'] ) ) || $_POST['listid'] == null || $_POST['listid'] == '' ) {
  95. $this->listid = (int) $listid;
  96. } else {
  97. $this->listid = (int) cbGetParam( $_POST, 'listid', 0 );
  98. }
  99. $sql="SELECT COUNT(*) FROM #__comprofiler_lists WHERE listid = ".  (int) $this->listid;
  100. $_CB_database->SetQuery($sql);
  101. $total = $_CB_database->LoadResult();
  102. if($this->default==1) {
  103. $sql="UPDATE #__comprofiler_lists SET `default` = 0";
  104. $_CB_database->SetQuery($sql);
  105. $_CB_database->query();
  106. }
  107. if ( $total > 0 ) {
  108. // existing record
  109. $ret = $this->_db->updateObject( $this->_tbl, $this, $this->_tbl_key, $updateNulls );
  110. } else {
  111. // new record
  112. $sql="SELECT MAX(ordering) FROM #__comprofiler_lists";
  113. $_CB_database->SetQuery($sql);
  114. $max = $_CB_database->LoadResult();
  115. $this->ordering=$max+1;
  116. $this->listid = null;
  117. $ret = $this->_db->insertObject( $this->_tbl, $this, $this->_tbl_key );
  118. }
  119. if ( !$ret ) {
  120. $this->_error = get_class( $this )."::store failed <br />" . $this->_db->getErrorMsg();
  121. return false;
  122. } else {
  123. return true;
  124. }
  125. }
  126. } //end class
  127. class moscomprofilerFields extends comprofilerDBTable {
  128.    var $fieldid = null;
  129.    var $name = null;
  130.    var $tablecolumns = null;
  131.    var $table = null;
  132.    var $title = null;
  133.    var $description = null;
  134.    var $type = null;
  135.    var $maxlength = null;
  136.    var $size = null;
  137.    var $required = null;
  138.    var $tabid = null;
  139.    var $ordering = null;
  140.    var $cols = null;
  141.    var $rows = null;
  142.    var $value = null;
  143.    var $default = null;
  144.    var $published = null;
  145.    var $registration = null;
  146.    var $profile = null;
  147.    var $displaytitle = null;
  148.    var $readonly = null;
  149.    var $searchable = null;
  150.    var $calculated = null;
  151.    var $sys = null;
  152.    var $pluginid = null;
  153.    var $params = null;
  154.     /**
  155.     * Constructor
  156.     * @param database A database connector object
  157.     */
  158. function moscomprofilerFields( &$db ) {
  159. $this->comprofilerDBTable( '#__comprofiler_fields', 'fieldid', $db );
  160. }
  161. function store( $fieldid = 0, $updateNulls = false ) {
  162. global $_CB_database;
  163. $this->fieldid = $fieldid;
  164. $fieldHandler = new cbFieldHandler();
  165. $sql = 'SELECT COUNT(*) FROM #__comprofiler_fields WHERE fieldid = ' . (int) $this->fieldid;
  166. $_CB_database->SetQuery( $sql );
  167. $total = $_CB_database->LoadResult();
  168. if ( $total > 0 ) {
  169. // existing record:
  170. $ret = $this->_db->updateObject( $this->_tbl, $this, $this->_tbl_key, $updateNulls ); // escapes values
  171. if ( $ret ) {
  172. $ret = $fieldHandler->adaptSQL( $this );
  173. }
  174. } else {
  175. // new record:
  176. $sql = 'SELECT COUNT(*) FROM #__comprofiler_fields WHERE name = ' . $_CB_database->Quote( $this->name );
  177. $_CB_database->SetQuery($sql);
  178. if ( $_CB_database->LoadResult() > 0 ) {
  179. $this->_error = "The field name ".$this->name." is already in use!";
  180. return false;
  181. }
  182. $sql = 'SELECT MAX(ordering) FROM #__comprofiler_fields WHERE tabid = ' . (int) $this->tabid;
  183. $_CB_database->SetQuery( $sql );
  184. $max = $_CB_database->LoadResult();
  185. $this->ordering = $max + 1;
  186. $this->fieldid = null;
  187. $this->table = $fieldHandler->getMainTable( $this );
  188. $this->tablecolumns = implode( ',', $fieldHandler->getMainTableColumns( $this ) );
  189. $ret = $fieldHandler->adaptSQL( $this );
  190. if ($ret) {
  191. $ret = $this->_db->insertObject( $this->_tbl, $this, $this->_tbl_key ); // do inserObject last to keep insertId intact
  192. }
  193. }
  194. if ( ! $ret ) {
  195. $this->_error = get_class( $this ) . "::store failed: " . addslashes( str_replace( "n", 'n', $this->_error . ' ' . $this->_db->getErrorMsg() ) );
  196. return false;
  197. } else {
  198. return true;
  199. }
  200. }
  201. /**
  202. * Delete method for fields deleting also fieldvalues, but not the data column in the comprofiler table.
  203. * For that, deleteColumn() method must be called separately.
  204. *
  205. * @param id of row to delete
  206. * @return true if successful otherwise returns and error message
  207. */
  208. function deleteDataDescr( $oid = null ) {
  209. $ret = true;
  210. $fieldHandler = new cbFieldHandler();
  211. $ret = $fieldHandler->adaptSQL( $this, false );
  212. if ( $ret ) {
  213. $ret = $this->delete( $oid );
  214. }
  215. return $ret;
  216. }
  217. /**
  218. * Delete method for fields deleting also fieldvalues, but not the data column in the comprofiler table.
  219. * For that, deleteDataDescr() method must be called instead.
  220. *
  221. * @param id of row to delete
  222. * @return true if successful otherwise returns and error message
  223. */
  224. function delete( $oid = null ) {
  225. $k = $this->_tbl_key;
  226. if ( $oid ) {
  227. $this->$k = (int) $oid;
  228. }
  229. $result = true;
  230. //Find all fieldValues related to the field
  231. $this->_db->setQuery( "SELECT `fieldvalueid` FROM #__comprofiler_field_values WHERE `fieldid`=" . (int) $this->$k );
  232. $fieldvalues = $this->_db->loadObjectList();
  233. $rowFieldValues = new moscomprofilerFieldValues($this->_db);
  234. if ( count( $fieldvalues ) > 0 ) {
  235. //delete each field value related to a field
  236. foreach ( $fieldvalues AS $fieldvalue ) {
  237. $result = $rowFieldValues->delete( $fieldvalue->fieldvalueid ) && $result;
  238. }
  239. }
  240. //Now delete the field itself without deleting the user data, preserving it for reinstall
  241. //$this->deleteColumn( $this->table, $this->name ); // this would delete the user data
  242. $result = parent::delete( $this->$k ) && $result;
  243. return $result;
  244. }
  245. /**
  246.  * Returns the database columns used by the field
  247.  *
  248.  * @return array    Names of columns
  249.  */
  250. function getTableColumns() {
  251. if ( $this->tablecolumns !== null ) {
  252. if ( $this->tablecolumns === '' ) {
  253. return array();
  254. } else {
  255. return explode( ',', $this->tablecolumns );
  256. }
  257. } else {
  258. return array( $this->name ); // pre-CB 1.2 database structure support
  259. }
  260. }
  261. /**
  262.  * OBSOLETE DO NOT USE: kept in 1.2 for compatibility reasons only
  263.  * @access private
  264.  */
  265. function createColumn( $table, $column, $type) {
  266. global $_CB_database;
  267. if ( ( $table == '' ) || ( $type == '' ) ) {
  268. return true;
  269. }
  270. $sql = "SELECT * FROM " . $_CB_database->NameQuote( $table ) . " LIMIT 1";
  271. $_CB_database->setQuery($sql);
  272. $obj = null;
  273. if ( ! ( $_CB_database->loadObject( $obj ) && array_key_exists( $column, $obj ) ) ) {
  274. $sql = "ALTER TABLE " . $_CB_database->NameQuote( $table )
  275.  . "n ADD " . $_CB_database->NameQuote( $column ) . " " . $type; // don't escape type, as default text values are quoted
  276. $_CB_database->SetQuery( $sql );
  277. $ret = $_CB_database->query();
  278. if ( !$ret ) {
  279. $this->_error .= get_class( $this )."::createColumn failed <br />" . $this->_db->getErrorMsg();
  280. return false;
  281. } else {
  282. return true;
  283. }
  284. } else {
  285. return $this->changeColumn( $table, $column, $type);
  286. }
  287. }
  288. /**
  289.  * OBSOLETE DO NOT USE: kept in 1.2 for compatibility reasons only
  290.  * @access private
  291.  */
  292. function changeColumn( $table, $column, $type, $oldColName = null ) {
  293. global $_CB_database;
  294. if ( ( $table == '' ) || ( $type == '' ) ) {
  295. return true;
  296. }
  297. if ( $oldColName === null ) {
  298. $oldColName = $column;
  299. }
  300. $sql = "ALTER TABLE " . $_CB_database->NameQuote( $table )
  301. . "n CHANGE " . $_CB_database->NameQuote( $oldColName )
  302. . " " . $_CB_database->NameQuote( $column )
  303. . " " . $type; // don't escape type, as default text values are quoted
  304. $_CB_database->SetQuery( $sql );
  305. $ret = $_CB_database->query();
  306. if ( !$ret ) {
  307. $this->_error .= get_class( $this )."::changeColumn failed <br />" . $this->_db->getErrorMsg();
  308. return false;
  309. } else {
  310. return true;
  311. }
  312. }
  313. /**
  314.  * OBSOLETE DO NOT USE: kept in 1.2 for compatibility reasons only
  315.  * @access private
  316.  */
  317. function deleteColumn( $table, $column) {
  318. global $_CB_database;
  319. $sql = "ALTER TABLE " . $_CB_database->NameQuote( $table)
  320. . "n DROP " .  $_CB_database->NameQuote( $column)
  321. ;
  322. $_CB_database->SetQuery($sql);
  323. $ret = $_CB_database->query();
  324. if ( !$ret ) {
  325. $this->_error .= get_class( $this )."::deleteColumn failed <br />" . $this->_db->getErrorMsg();
  326. return false;
  327. } else {
  328. return true;
  329. }
  330. }
  331. } //end class
  332. class moscomprofilerTabs extends comprofilerDBTable {
  333.    var $tabid = null;
  334.    var $title = null;
  335.    var $description = null;
  336.    var $ordering = null;
  337.    var $ordering_register = null;
  338.    var $width = null;
  339.    var $enabled = null;
  340.    var $pluginclass = null;
  341.    var $pluginid = null;
  342.    var $fields = null;
  343.    var $params = null;
  344.    /** @var int  system tab: >=1: from comprofiler core: can't be deleted. ==2: always enabled. ==3: collecting element (menu+status): rendered at end. */
  345.    var $sys = null;
  346.    var $displaytype = null;
  347.    var $position = null;
  348.    var $useraccessgroupid = null;
  349.     /**
  350.     * Constructor
  351.     * @param database A database connector object
  352.     */
  353. function moscomprofilerTabs( &$db ) {
  354. $this->comprofilerDBTable( '#__comprofiler_tabs', 'tabid', $db );
  355. } //end func
  356. function store( $tabid, $updateNulls=false) {
  357. global $_CB_database, $_POST;
  358. if ( ( ! isset( $_POST['tabid'] ) ) || $_POST['tabid'] == null || $_POST['tabid'] == '' ) {
  359. $this->tabid = (int) $tabid;
  360. } else {
  361. $this->tabid = (int) cbGetParam( $_POST, 'tabid', 0 );
  362. }
  363. $sql = "SELECT COUNT(*) FROM #__comprofiler_tabs WHERE tabid = ". (int) $this->tabid;
  364. $_CB_database->SetQuery($sql);
  365. $total = $_CB_database->LoadResult();
  366. if ( $total > 0 ) {
  367. // existing record
  368. $ret = $this->_db->updateObject( $this->_tbl, $this, $this->_tbl_key, $updateNulls ); // escapes values!
  369. } else {
  370. $sql = "SELECT MAX(ordering) FROM #__comprofiler_tabs";
  371. $_CB_database->SetQuery($sql);
  372. $max = $_CB_database->LoadResult();
  373. $this->ordering = $max + 1;
  374. // new record
  375. $this->tabid = null;
  376. $ret = $this->_db->insertObject( $this->_tbl, $this, $this->_tbl_key );
  377. }
  378. if ( !$ret ) {
  379. $this->_error = get_class( $this )."::store failed <br />" . $this->_db->getErrorMsg();
  380. return false;
  381. } else {
  382. return true;
  383. }
  384. }
  385. } //end class
  386. class moscomprofilerFieldValues extends comprofilerDBTable {
  387.    var $fieldvalueid = null;
  388.    var $fieldid = null;
  389.    var $fieldtitle = null;
  390.    var $ordering = null;
  391.    var $sys = null;
  392.     /**
  393.     * Constructor
  394.     * @param database A database connector object
  395.     */
  396. function moscomprofilerFieldValues( &$db ) {
  397. $this->comprofilerDBTable( '#__comprofiler_field_values', 'fieldvalueid', $db );
  398. } //end func
  399. function store( $fieldvalueid=0, $updateNulls=false) {
  400. global $_CB_database, $_POST;
  401. if ( ( ! isset( $_POST['fieldvalueid'] ) ) || $_POST['fieldvalueid'] == null || $_POST['fieldvalueid'] == '' ) {
  402. $this->fieldvalueid = (int) $fieldvalueid;
  403. } else {
  404. $this->fieldvalueid = (int) cbGetParam( $_POST, 'fieldvalueid', 0 );
  405. }
  406. $sql = "SELECT COUNT(*) FROM #__comprofiler_field_values WHERE fieldvalueid = " . (int) $this->fieldvalueid;
  407. $_CB_database->SetQuery($sql);
  408. $total = $_CB_database->LoadResult();
  409. if ( $total > 0 ) {
  410. // existing record
  411. $ret = $this->_db->updateObject( $this->_tbl, $this, $this->_tbl_key, $updateNulls );
  412. } else {
  413. // new record
  414. $this->fieldvalueid = null;
  415. $ret = $this->_db->insertObject( $this->_tbl, $this, $this->_tbl_key );
  416. }
  417. if ( !$ret) {
  418. $this->_error = get_class( $this )."::store failed <br />" . $this->_db->getErrorMsg();
  419. return false;
  420. } else {
  421. return true;
  422. }
  423. }
  424. } //end class
  425. class moscomprofiler extends comprofilerDBTable {
  426. // IMPORTANT: ALL VARIABLES HERE MUST BE NULL in order to not be updated if not set.
  427. var $id = null;
  428. var $user_id = null;
  429. var $firstname = null;
  430. var $middlename = null;
  431. var $lastname = null;
  432. var $hits = null;
  433. var $message_last_sent = null;
  434. var $message_number_sent = null;
  435. var $avatar = null;
  436. var $avatarapproved = null;
  437. var $approved = null;
  438. var $confirmed = null;
  439. var $lastupdate = null;
  440. var $registeripaddr = null;
  441. var $cbactivation = null;
  442. var $banned = null;
  443. var $banneddate = null;
  444. var $unbanneddate = null;
  445. var $bannedby = null;
  446. var $unbannedby = null;
  447. var $bannedreason = null;
  448. var $acceptedterms = null;
  449.     /**
  450.     * Constructor
  451.     * @param database A database connector object
  452.     */
  453. function moscomprofiler( &$db ) {
  454. $this->comprofilerDBTable( '#__comprofiler', 'id', $db );
  455. }
  456. /**
  457. * Inserts a new row in the database table
  458. *
  459. * @param  boolean  $updateNulls  TRUE: null object variables are also updated, FALSE: not.
  460. * @return boolean                TRUE if successful otherwise FALSE
  461. */
  462. function storeNew( $updateNulls = false ) {
  463. $ok = $this->_db->insertObject( $this->_tbl, $this, $this->_tbl_key );
  464. if ( ! $ok ) {
  465. $this->_error = strtolower(get_class($this))."::storeNew failed: " . $this->_db->getErrorMsg();
  466. }
  467. return $ok;
  468. }
  469. /**
  470.  * OBSOLETE AND BUGGY: DO NOT USE
  471.  * KEPT FOR 3PD COMPATIBILITY ONLY
  472.  */
  473. function storeExtras( $id=0, $updateNulls=false) {
  474. global $_CB_database, $_POST;
  475. if ( ( ! isset( $_POST['id'] ) ) || $_POST['id'] == null || $_POST['id'] == '' ) {
  476. $this->id = (int) $id;
  477. } else {
  478. $this->id = (int) cbGetParam( $_POST, 'id', 0 );
  479. }
  480. $sql = "SELECT count(*) FROM #__comprofiler WHERE id = ". (int) $this->id;
  481. $_CB_database->SetQuery($sql);
  482. $total = $_CB_database->LoadResult();
  483. if ( $total > 0 ) {
  484. // existing record
  485. $ret = $this->_db->updateObject( $this->_tbl, $this, $this->_tbl_key, $updateNulls ); // escapes values
  486. } else {
  487. // new record
  488. $sql = "SELECT MAX(id) FROM #__users";
  489. $_CB_database->SetQuery($sql);
  490. $last_id = $_CB_database->LoadResult();
  491. $this->id = $last_id;
  492. $this->user_id = $last_id;
  493. $ret = $this->_db->insertObject( $this->_tbl, $this, $this->_tbl_key ); // escapes values
  494. }
  495. if ( !$ret ) {
  496. $this->_error = get_class( $this )."::store failed <br />" . $this->_db->getErrorMsg();
  497. return false;
  498. } else {
  499. return true;
  500. }
  501. }
  502. /**
  503. * Merges two object into one by reference ( avoids "_db", "_tbl", "_tbl_key", and $o2->($o2->_tbl_key) )
  504. *   @static function:
  505. * @param object $o1 first object
  506. * @param object $o2 second object
  507. * @return object
  508. */
  509. function & dbObjectsMerge( &$o1, &$o2 ) {
  510. $r = new stdClass();
  511. $class_vars = get_object_vars($o1);
  512. foreach ($class_vars as $name => $value) {
  513. if (($name != "_db") and ($name != "_tbl") and ($name != "_tbl_key")) {
  514. $r->$name =& $o1->$name;
  515. }
  516. }
  517. $class_vars = get_object_vars($o2);
  518. $k = $o2->_tbl_key;
  519. foreach ($class_vars as $name => $value) {
  520. if (($name != $k) and ($name != "_db") and ($name != "_tbl") and ($name != "_tbl_key")) {
  521. $r->$name =& $o2->$name;
  522. }
  523. }
  524. return $r;
  525. }
  526. } // class moscomprofiler
  527. /**
  528.  * WIP: EXPERIMENTAL: use at your own risk, no backwards compatibility guarrantee
  529.  *
  530.  * Class for single cbUser object
  531.  *
  532.  */
  533. class moscomprofilerUser extends moscomprofiler  {
  534. /** @var string */
  535. var $name = null;
  536. /** @var string */
  537. var $username = null;
  538. /** @var string */
  539. var $email = null;
  540. /** @var string */
  541. var $password = null;
  542. /** @var string */
  543. var $usertype = null;
  544. /** @var int */
  545. var $block = null;
  546. /** @var int */
  547. var $sendEmail = null;
  548. /** @var int */
  549. var $gid = null;
  550. /** @var datetime */
  551. var $registerDate = null;
  552. /** @var datetime */
  553. var $lastvisitDate = null;
  554. /** @var string */
  555. var $activation = null;
  556. /** @var string */
  557. var $params = null;
  558. var $_cmsUserTable = '#__users';
  559. var $_cmsUserTableKey = 'id';
  560. var $_cmsUserTableUsername = 'username';
  561. var $_cmsUserTableEmail = 'email';
  562. /** CMS User object
  563.  *  @var mosUser */
  564. var $_cmsUser = null;
  565. /** CB user table row
  566.  *  @var moscomprofiler */
  567. var $_comprofilerUser = null;
  568. /** CB Tabs
  569.  *  @var cbTabs */
  570. var $_cbTabs = null;
  571. var $_nonComprofilerVars  = array( 'name', 'username', 'email', 'password', 'params' ,  'usertype', 'block', 'sendEmail', 'gid', 'registerDate', 'activation', 'lastvisitDate' );
  572. var $_frontendNonComprofilerVars = array( 'name', 'username', 'email', 'password', 'params' );
  573. /**
  574.  * Constructor
  575.  *
  576.  * @param  CBdatabase $db
  577.  * @return moscomprofilerUser
  578.  */
  579. function moscomprofilerUser( &$db ) {
  580. parent::moscomprofiler( $db );
  581. }
  582. /**
  583. * Loads user from database
  584. *
  585. * @param  int  $oid  [optional] User id
  586. * @return boolean    TRUE: success, FALSE: error in database access
  587. */
  588. function load( $oid = null ) {
  589. $k = $this->_tbl_key;
  590. if ($oid !== null) {
  591. $this->$k = (int) $oid;
  592. }
  593. $oid = $this->$k;
  594. if ( $oid === null ) {
  595. return false;
  596. }
  597. //BB fix : resets default values to all object variables, because NULL SQL fields do not overide existing variables !
  598. //Note: Prior to PHP 4.2.0, Uninitialized class variables will not be reported by get_class_vars().
  599. $class_vars = get_class_vars(get_class($this));
  600. foreach ( $class_vars as $name => $value ) {
  601. if (($name != $k) and ($name != "_db") and ($name != "_tbl") and ($name != "_tbl_key")) {
  602. $this->$name = $value;
  603. }
  604. }
  605. $this->reset();
  606. //end of BB fix.
  607. /*
  608. $query = "SELECT *"
  609. . "n FROM " . $this->_tbl . " c, " . $this->_cmsUserTable . " u"
  610. . "n WHERE c." . $this->_tbl_key . " = u." . $this->_cmsUserTableKey
  611. . " AND c." . $this->_tbl_key . " = " . (int) $oid
  612. ;
  613. $this->_db->setQuery( $query );
  614. // the following is needed for being able to edit a backend user in CB from CMS which is not yet synchronized with CB:
  615. */
  616. $query = 'SELECT *'
  617. . "n FROM " . $this->_cmsUserTable . ' AS u'
  618. . "n LEFT JOIN " . $this->_tbl . ' AS c ON c.' . $this->_tbl_key . ' = u.' . $this->_cmsUserTableKey
  619. . " WHERE u." . $this->_cmsUserTableKey . ' = ' . (int) $oid
  620. ;
  621. $this->_db->setQuery( $query );
  622. $arr = $this->_db->loadAssoc( );
  623. if ( $arr === null ) {
  624. $query = 'SELECT *'
  625. . "n FROM " . $this->_tbl . ' AS c'
  626. . "n LEFT JOIN " . $this->_cmsUserTable . ' AS u ON c.' . $this->_tbl_key . ' = u.' . $this->_cmsUserTableKey
  627. . " WHERE c." . $this->_tbl_key . ' = ' . (int) $oid
  628. ;
  629. $this->_db->setQuery( $query );
  630. $arr = $this->_db->loadAssoc( );
  631. }
  632. if ( $arr !== null ) {
  633. foreach ( $arr as $kk => $v ) {
  634. $this->$kk = $v;
  635. }
  636. // in case the left join is null, the second loaded id will be NULL and override id:
  637. $this->$k = (int) $oid;
  638. if ( checkJversion() == 0 ) {
  639. if ( checkJversion( 'dev_level' ) < 11 ) {
  640. // revert effect of _cbMakeHtmlSafe on user save in older joomla/mambo versions:
  641. $this->name = unHtmlspecialchars( $this->name );
  642. }
  643. }
  644. return true;
  645. } else {
  646. return false;
  647. }
  648. }
  649. /**
  650. * Loads user username from database
  651. *
  652. * @param  string   $username
  653. * @return boolean    TRUE: success, FALSE: error in database access
  654. */
  655. function loadByUsername( $username ) {
  656. return $this->_loadBy_field( $username, $this->_cmsUserTableUsername );
  657. }
  658. /**
  659. * Loads user username from database
  660. *
  661. * @param  string   $username
  662. * @return boolean    TRUE: success, FALSE: error in database access
  663. */
  664. function loadByEmail( $username ) {
  665. return $this->_loadBy_field( $username, $this->_cmsUserTableEmail );
  666. }
  667. /**
  668. * Loads first user from database according to a given field
  669. * @access private
  670. *
  671. * @param  string   $fieldValue
  672. * @param  string   $fieldName   Name of database field
  673. * @return boolean    TRUE: success, FALSE: error in database access
  674. */
  675. function _loadBy_field( $fieldValue, $fieldName ) {
  676. if ( $fieldValue == null ) {
  677. return false;
  678. }
  679. //BB fix : resets default values to all object variables, because NULL SQL fields do not overide existing variables !
  680. //Note: Prior to PHP 4.2.0, Uninitialized class variables will not be reported by get_class_vars().
  681. $class_vars = get_class_vars(get_class($this));
  682. foreach ($class_vars as $name => $value) {
  683. if ( ($name != $this->_tbl_key) and ($name != "_db") and ($name != "_tbl") and ($name != "_tbl_key") ) {
  684. $this->$name = $value;
  685. }
  686. }
  687. $this->reset();
  688. //end of BB fix.
  689. $query = 'SELECT *'
  690. . "n FROM " . $this->_cmsUserTable . ' AS u'
  691. . "n LEFT JOIN " . $this->_tbl . ' AS c ON c.' . $this->_tbl_key . ' = u.' . $this->_cmsUserTableKey
  692. . " WHERE u." . $this->_db->NameQuote( $fieldName ) . ' = ' . $this->_db->Quote( $fieldValue )
  693. . " LIMIT 1"
  694. ;
  695. $this->_db->setQuery( $query );
  696. $arr = $this->_db->loadAssoc( );
  697. if ( $arr ) {
  698. foreach ( $arr as $k => $v ) {
  699. $this->$k = $v;
  700. }
  701. return true;
  702. } else {
  703. return false;
  704. }
  705. }
  706. function bindSafely( &$array, $ui, $reason, &$oldUserComplete ) {
  707. global $_CB_framework, $ueConfig, $_PLUGINS;
  708. // Some basic sanitizations and securitizations: usertype will be re-computed based on gid in store()
  709. $this->id = (int) $this->id;
  710. $this->gid = (int) $this->gid;
  711. if ( ! $this->gid ) {
  712. $this->gid = null;
  713. }
  714. if ( $ui == 1 ) {
  715. if ( $this->id ) {
  716. // Front-end edit user: no changes in gid/usertype and confirmed/approved states
  717. $this->gid = (int) $oldUserComplete->gid;
  718. $this->usertype = $oldUserComplete->usertype;
  719. $this->block = (int) $oldUserComplete->block;
  720. $this->sendEmail = (int) $oldUserComplete->sendEmail;
  721. $this->confirmed = (int) $oldUserComplete->confirmed;
  722. $this->approved = (int) $oldUserComplete->approved;
  723. } else {
  724. // Front-end user registration: handle this here, so it is available to all plugins:
  725. $this->usertype = $_CB_framework->getCfg( 'new_usertype' );
  726. $this->gid = $_CB_framework->acl->get_group_id( $this->usertype, 'ARO' );
  727. if ( $ueConfig['reg_admin_approval'] == 0) {
  728. $this->approved = 1;
  729. } else {
  730. $this->approved = 0;
  731. $this->block = 1;
  732. if ( $ueConfig['reg_confirmation'] == 0 ) {
  733. $this->confirmed = 1;
  734. } else {
  735. $this->confirmed = 0;
  736. $this->block = 1;
  737. }
  738. if ( ( $this->confirmed == 1 ) && ( $this->approved == 1 ) ) {
  739. $this->block = 0;
  740. } else {
  741. $this->block = 1;
  742. }
  743. $this->sendEmail = 0;
  744. }
  745. // Nb.: Backend user edit and new user are handled in core plugin CBfield_userparams field handler class
  746. }
  747. // By default, don't touch the hashed password, unless a new password is set by the saveTabsContents binding:
  748. $this->password = null;
  749. $this->_original_email = $this->email; // needed for checkSafely()
  750. // Process the fields in form by CB field plugins:
  751. $_PLUGINS->loadPluginGroup('user');
  752. $this->_cbTabs = new cbTabs( 0, $ui, null, false );
  753. $this->_cbTabs->saveTabsContents( $this, $array, $reason );
  754. $errors = $_PLUGINS->getErrorMSG( false );
  755. if ( count( $errors ) > 0 ) {
  756. $this->_error = $errors;
  757. return false;
  758. }
  759. // Now do CMS-specific stuff, specially bugs-workarounds:
  760. $postCopy = array();
  761. if ( $ui == 1 ) {
  762. $vars = $this->_frontendNonComprofilerVars;
  763. } else {
  764. $vars = $this->_nonComprofilerVars;
  765. }
  766. foreach ( $vars as $k ) {
  767. if ( isset( $this->$k ) ) {
  768. $postCopy[$k] = $this->$k;
  769. }
  770. }
  771. if ( isset( $postCopy['password'] ) ) {
  772. $postCopy['verifyPass'] = $postCopy['password']; // Mambo and Joomla 1.0 has it in password2 and checks it in bind() !
  773. $postCopy['password2'] = $postCopy['password']; // Joomla 1.5 has it in password2 and checks it in bind() !
  774. }
  775. $this->_mapUsers();
  776. $row =& $this->_cmsUser;
  777. $pwd = $this->password; // maybe cleartext at that stage.
  778. if ( $pwd == '' ) {
  779. $pwd = null; // empty: don't update/change
  780. $this->password = null;
  781. }
  782. $rowBindResult = $row->bind( $postCopy ); // in Joomla 1.5, this modifies $postCopy and hashes password !
  783. if ( ! $rowBindResult ) {
  784. if ( checkJversion() == 1 ) {
  785. $this->_error = $row->getErrors();
  786. foreach ( array_keys( $this->_error ) as $ek ) {
  787. $this->_error[$ek] = stripslashes( $this->_error[$ek] );
  788. }
  789. } else {
  790. $this->_error = array( stripslashes( $row->getError() ) );
  791. }
  792. return false;
  793. }
  794. // Finally, emulate a pre-joomla 1.0.11 bug where jos_users was wtih htmlspecialchars ! :
  795. if ( checkJversion() == 0 ) {
  796. if ( checkJversion( 'dev_level' ) < 11 ) {
  797. _cbMakeHtmlSafe($row);
  798. }
  799. }
  800. $row->password = $pwd; // J1.0: no htmlspecialchars on password, J1.5: restore cleartext password at this stage.
  801. return true;
  802. }
  803. function checkSafely() {
  804. global $_CB_framework;
  805. if ( $this->_cmsUser === null ) {
  806. $this->_mapUsers();
  807. }
  808. $row =& $this->_cmsUser;
  809. if ( is_callable( array( $row, 'check' ) ) ) {
  810. // fix a joomla 1.0 bug preventing from saving profile without changing email if site switched from uniqueemails = 0 to = 1 and duplicates existed
  811. $original_uniqueemail = $_CB_framework->getCfg( 'uniquemail' );
  812. if ( $_CB_framework->getCfg( 'uniquemail' ) && ( $row->email == $this->_original_email ) ) {
  813. global $mosConfig_uniquemail; // this is voluntarily a MAMBO/JOOMLA 1.0 GLOBAL TO FIX A BUG
  814. $mosConfig_uniquemail = 0; // this is voluntarily a MAMBO/JOOMLA 1.0 GLOBAL TO FIX A BUG
  815. }
  816. $rowCheckResult = $row->check();
  817. if ( $original_uniqueemail && ( $row->email == $this->_original_email ) ) {
  818. $mosConfig_uniquemail = $original_uniqueemail; // this is voluntarily a MAMBO/JOOMLA 1.0 GLOBAL TO FIX A BUG
  819. }
  820. if ( ! $rowCheckResult ) {
  821. $this->_error = ( checkJversion() == 1 ? stripslashes( implode( '<br />', $row->getErrors() ) ) : stripslashes( $row->getError() ) );
  822. return false;
  823. }
  824. }
  825. return true;
  826. }
  827. /**
  828. * If table key (id) is NULL : inserts new rows
  829. * otherwise updates existing row in the database tables
  830. *
  831. * Can be overridden or overloaded by the child classes
  832. *
  833. * @param  boolean  $updateNulls  TRUE: null object variables are also updated, FALSE: not.
  834. * @return boolean                TRUE if successful otherwise FALSE
  835. */
  836. function store( $updateNulls = false ) {
  837. global $_CB_framework, $_CB_database, $ueConfig;
  838. // insure usertype is in sync with gid:
  839. if ( checkJversion() == 1 ) {
  840. $query = 'SELECT name'
  841. . "n FROM #__core_acl_aro_groups"
  842. . "n WHERE id = " . (int) $this->gid
  843. ;
  844. } else {
  845. $query = 'SELECT name'
  846. . "n FROM #__core_acl_aro_groups"
  847. . "n WHERE group_id = " . (int) $this->gid
  848. ;
  849. }
  850. $_CB_database->setQuery( $query );
  851. $this->usertype = $_CB_database->loadResult();
  852. // creates CMS and CB objects:
  853. $this->_mapUsers();
  854. // remove the previous email set in bindSafely() and needed for checkSafely():
  855. unset( $this->_original_email );
  856. $isNew = ( $this->id == null );
  857. // stores first into CMS to get id of user if new:
  858. if ( is_callable( array( $this->_cmsUser, 'store' ) ) ) {
  859. $result = $this->_cmsUser->store( $updateNulls );
  860. if ( ! $result ) {
  861. $this->_error = $this->_cmsUser->getError();
  862. }
  863. } else {
  864. $result = $this->_cmsUser->save(); // Joomla 1.5 native
  865. if ( ! $result ) {
  866. $this->_error = $this->_cmsUser->getError();
  867. if ( class_exists( 'JText' ) ) {
  868. $this->_error = JText::_( $this->_error );
  869. }
  870. }
  871. }
  872. if ( $result ) {
  873. // synchronize id and user_id:
  874. if ( $this->id == 0 ) {
  875. if ( $this->_cmsUser->id == 0 ) {
  876. // this is only for mambo 4.5.0 backwards compatibility. 4.5.2.3 $row->store() updates id on insert
  877. $sql = 'SELECT id FROM #__users WHERE username = ' . $_CB_database->Quote( $this->username);
  878. $_CB_database->setQuery( $sql );
  879. $this->_cmsUser->id = (int) $_CB_database->loadResult();
  880. }
  881. $this->id = $this->_cmsUser->id;
  882. $this->_comprofilerUser->id = $this->_cmsUser->id;
  883. }
  884. if ( ( $this->confirmed == 0 ) && ( $this->cbactivation == '' ) && ( $ueConfig['reg_confirmation'] != 0 ) ) {
  885. $randomHash = md5( cbMakeRandomString() );
  886. $scrambleSeed = (int) hexdec(substr( md5 ( $_CB_framework->getCfg( 'secret' ) . $_CB_framework->getCfg( 'db' ) ), 0, 7));
  887. $scrambledId = $scrambleSeed ^ ( (int) $this->id );
  888. $this->cbactivation = 'reg' . $randomHash . sprintf( '%08x', $scrambledId );
  889. }
  890. // stores CB user into comprofiler: if new, inserts, otherwise updates:
  891. if ( $this->user_id == 0 ) {
  892. $this->user_id = $this->_cmsUser->id;
  893. $this->_comprofilerUser->user_id = $this->user_id;
  894. $result = $this->_comprofilerUser->storeNew( $updateNulls );
  895. } else {
  896. $result = $this->_comprofilerUser->store( $updateNulls );
  897. }
  898. if ( ! $result ) {
  899. $this->_error = $this->_comprofilerUser->getError();
  900. }
  901. }
  902. return $result;
  903. }
  904. /**
  905.  * Saves a new or existing CB+CMS user
  906.  * WARNINGS:
  907.  * - You must verify authorization of user to perform this (user checkCBpermissions() )
  908.  * - You must $this->load() existing user first
  909.  *
  910.  * @param  array   $array   Raw unfiltered input, typically $_POST
  911.  * @param  int     $ui      1 = Front-end (limitted rights), 2 = Backend (almost unlimitted), 0 = automated (full)
  912.  * @param  string  $reason
  913.  * @return boolean
  914.  */
  915. function saveSafely( &$array, $ui, $reason ) {
  916. global $_CB_framework, $_CB_database, $ueConfig, $_PLUGINS;
  917. // Get current user state and store it into $oldUserComplete:
  918. $oldUserComplete = new moscomprofilerUser( $this->_db );
  919. foreach ( get_object_vars( $this ) as $k => $v) {
  920. if( substr( $k, 0, 1 ) != '_' ) { // ignore internal vars
  921. $oldUserComplete->$k = $this->$k;
  922. }
  923. }
  924. // 1) Process and validate the fields in form by CB field plugins:
  925. // 2) Bind the fields to CMS User:
  926. $bindResults = $this->bindSafely( $array, $ui, $reason, $oldUserComplete );
  927. if ( $bindResults ) {
  928. // During bindSafely, in saveTabContents, the validations have already taken place, for mandatory fields.
  929. if ( ( $this->name == '' ) && ( $this->username == '' ) && ( $this->email != '' ) ) {
  930. $this->username = $this->email;
  931. $this->_cmsUser->username = $this->username;
  932. }
  933. // Checks that name is set. If not, uses the username as name, as Mambo/Joola mosUser::store() uses name for ACL
  934. // and ACL bugs with no name.
  935. if ( $this->name == '' ) {
  936. $this->name = $this->username;
  937. $this->_cmsUser->name = $this->name;
  938. } elseif ( $this->username == '' ) {
  939. $this->username = $this->name;
  940. $this->_cmsUser->username = $this->username;
  941. }
  942. if ( ! $this->checkSafely() ) {
  943. $bindResults = false;
  944. }
  945. }
  946. // For new registrations or backend user creations, set registration date and password if neeeded:
  947. $isNew = ( ! $this->id );
  948. $newCBuser = ( $oldUserComplete->user_id == null );
  949. if ( $isNew ) {
  950. $this->registerDate = date('Y-m-d H:i:s');
  951. }
  952. if ( $bindResults ) {
  953. if ( $isNew ) {
  954. if ( $this->password == null ) {
  955. $this->password = cbMakeRandomString( 10, true );
  956. $ueConfig['emailpass'] = 1; // set this global to 1 to force password to be sent to new users.
  957. }
  958. }
  959. // In backend only: if group has been changed and where original group was a Super Admin: check if there is at least a super-admin left:
  960. if ( $ui == 2 ) {
  961. $myGid = userGID( $_CB_framework->myId() );
  962. if ( ! $isNew ) {
  963. if ( $this->gid != $oldUserComplete->gid ) {
  964. if ( $oldUserComplete->gid == 25 ) {
  965. // count number of active super admins
  966. $query = 'SELECT COUNT( id )'
  967. . "n FROM #__users"
  968. . "n WHERE gid = 25"
  969. . "n AND block = 0"
  970. ;
  971. $_CB_database->setQuery( $query );
  972. $count = $_CB_database->loadResult();
  973. if ( $count <= 1 ) {
  974. // disallow change if only one Super Admin exists
  975. $this->_error = 'You cannot change this users Group as it is the only active Super Administrator for your site';
  976. return false;
  977. }
  978. }
  979. $user_group = strtolower( $_CB_framework->acl->get_group_name( $oldUserComplete->gid, 'ARO' ) );
  980. if ( ( $user_group == 'super administrator' && $myGid != 25 ) ) {
  981. // disallow change of super-Admin by non-super admin
  982. $this->_error = 'You cannot change this users Group as you are not a Super Administrator for your site';
  983. return false;
  984. } elseif ( $this->id == $_CB_framework->myId() && $myGid == 25 ) {
  985. // CB-specific: disallow change of own Super Admin group:
  986. $this->_error = 'You cannot change your own Super Administrator status for your site';
  987. return false;
  988. } else if ( $myGid == 24 && $oldUserComplete->gid == 24 ) {
  989. // disallow change of super-Admin by non-super admin
  990. $this->_error = 'You cannot change the Group of another Administrator as you are not a Super Administrator for your site';
  991. return false;
  992. } // ensure user can't add group higher than themselves done below
  993. }
  994. }
  995. // Security check to avoid creating/editing user to higher level than himself: CB response to artf4529.
  996. if ( ! in_array( $this->gid, getChildGIDS( $myGid ) ) ) {
  997. $this->_error = 'illegal attempt to set user at higher level than allowed !';
  998. return false;
  999. }
  1000. }
  1001. }
  1002. if ( $reason == 'profile' ) {
  1003. if ( $ui == 1 ) {
  1004. $_PLUGINS->trigger( 'onBeforeUserUpdate', array( &$this, &$this, &$oldUserComplete, &$oldUserComplete ) );
  1005. } elseif ( $ui == 2 ) {
  1006. if ( $isNew || $newCBuser ) {
  1007. $_PLUGINS->trigger( 'onBeforeNewUser', array( &$this, &$this, false ) );
  1008. } else {
  1009. $_PLUGINS->trigger( 'onBeforeUpdateUser', array( &$this, &$this, &$oldUserComplete ) );
  1010. }
  1011. }
  1012. } elseif ( $reason = 'register' ) {
  1013. $_PLUGINS->trigger( 'onBeforeUserRegistration', array( &$this, &$this ) );
  1014. }
  1015. $beforeResult = ! $_PLUGINS->is_errors();
  1016. if ( ! $beforeResult ) {
  1017. $this->_error = $_PLUGINS->getErrorMSG( false ); // $_PLUGIN collects all error messages, incl. previous ones.
  1018. }
  1019. // Saves tab plugins:
  1020. // on edits, user params and block/email/approved/confirmed are done in cb.core predefined fields.
  1021. // So now calls this and more (CBtabs are already created in $this->bindSafely() ).
  1022. $pluginTabsResult = true;
  1023. if ( $reason == 'profile' ) {
  1024. $this->_cbTabs->savePluginTabs( $this, $array );
  1025. $pluginTabsResult = ! $_PLUGINS->is_errors();
  1026. if ( ! $pluginTabsResult ) {
  1027. $this->_error = $_PLUGINS->getErrorMSG( false ); // $_PLUGIN collects all error messages, incl. previous ones.
  1028. }
  1029. }
  1030. if ( $bindResults && $beforeResult && $pluginTabsResult ) {
  1031. // Hashes password for CMS storage:
  1032. $clearTextPassword = $this->password;
  1033. if ( $clearTextPassword ) {
  1034. $hashedPassword = cbHashPassword( $clearTextPassword );
  1035. $this->password = $hashedPassword;
  1036. }
  1037. // Stores user if it's a new user:
  1038. if ( $isNew ) {
  1039. if ( ! $this->store() ) {
  1040. return false;
  1041. }
  1042. }
  1043. // Restores cleartext password for the saveRegistrationPluginTabs:
  1044. $this->password = $clearTextPassword;
  1045. }
  1046. if ( $reason == 'register' ) {
  1047. // call here since we got to have a user id:
  1048. $registerResults = array();
  1049. $registerResults['tabs'] = $this->_cbTabs->saveRegistrationPluginTabs( $this, $array );
  1050. if ( $_PLUGINS->is_errors() ) {
  1051. if ( $bindResults && $beforeResult && $pluginTabsResult ) {
  1052. $plugins_error = $_PLUGINS->getErrorMSG( false ); // $_PLUGIN collects all error messages, incl. previous ones.
  1053. if ( $isNew ) {
  1054. // if it was a new user, and plugin gave error, revert the creation:
  1055. $this->delete();
  1056. }
  1057. $this->_error = $plugins_error;
  1058. } else {
  1059. $this->_error = $_PLUGINS->getErrorMSG( false ); // $_PLUGIN collects all error messages, incl. previous ones.
  1060. }
  1061. $pluginTabsResult = false;
  1062. }
  1063. }
  1064. if ( ! ( $bindResults && $beforeResult && $pluginTabsResult ) ) {
  1065. // Normal error exit point:
  1066. $_PLUGINS->trigger( 'onSaveUserError', array( &$this, $this->_error, $reason ) );
  1067. $this->_error = implode( '<br />', $this->_error );
  1068. return false;
  1069. }
  1070. // Stores the user (again if it's a new as the plugins might have changed the user record):
  1071. if ( $clearTextPassword ) {
  1072. $this->password = $hashedPassword;
  1073. }
  1074. if ( ! $this->store() ) {
  1075. return false;
  1076. }
  1077. // Restores cleartext password for the onAfter and activation events:
  1078. $this->password = $clearTextPassword;
  1079. // update the ACL:
  1080. if ( $ui != 1 ) {
  1081. if ( checkJversion() == 1 ) {
  1082. $query = 'SELECT id FROM #__core_acl_aro WHERE value = ' . (int) $this->id;
  1083. } else {
  1084. $query = 'SELECT aro_id FROM #__core_acl_aro WHERE value = ' . (int) $this->id;
  1085. }
  1086. $_CB_database->setQuery( $query );
  1087. $aro_id = $_CB_database->loadResult();
  1088. $query = 'UPDATE #__core_acl_groups_aro_map'
  1089. . "n SET group_id = " . (int) $this->gid
  1090. . "n WHERE aro_id = " . (int) $aro_id
  1091. ;
  1092. $_CB_database->setQuery( $query );
  1093. if ( ! $_CB_database->query() ) {
  1094. $this->_error = $_CB_database->stderr();
  1095. return false;
  1096. }
  1097. }
  1098. // Update current sessions state if there is a change in gid:
  1099. if ( ( $ui != 1 ) && ! $isNew ) {
  1100. $sessionGid = 1;
  1101. if ( $_CB_framework->acl->is_group_child_of( $this->usertype, 'Registered', 'ARO' ) || $_CB_framework->acl->is_group_child_of( $this->usertype, 'Public Backend', 'ARO' ) ) {
  1102. // Authors, Editors, Publishers and Super Administrators are part of the Special Group:
  1103. $sessionGid = 2;
  1104. }
  1105. $query = 'UPDATE #__session '
  1106. . "n SET usertype = " . $_CB_database->Quote( $this->usertype )
  1107. . ', gid = ' . (int) $sessionGid
  1108. . "n WHERE userid = " . (int) $this->id
  1109. ;
  1110. //TBD: here maybe jaclplus fields update if JACLplus installed....
  1111. $_CB_database->setQuery( $query );
  1112. $_CB_database->query();
  1113. }
  1114. // Triggers onAfter and activateUser events:
  1115. if ( $reason == 'profile' ) {
  1116. if ( $ui == 1 ) {
  1117. $_PLUGINS->trigger( 'onAfterUserUpdate', array( &$this, &$this, true ) );
  1118. } elseif ( $ui == 2 ) {
  1119. if ( $isNew || $newCBuser ) {
  1120. if ( $isNew ) {
  1121. $ueConfig['emailpass'] = 1; // set this global to 1 to force password to be sent to new users.
  1122. }
  1123. $_PLUGINS->trigger( 'onAfterNewUser', array( $this, $this, false, true ) );
  1124. if ( $this->block == 0 && $this->approved == 1 && $this->confirmed ) {
  1125. activateUser( $this, 2, 'NewUser', false, $isNew );
  1126. }
  1127. } else {
  1128. $_PLUGINS->trigger( 'onAfterUpdateUser', array( $this, $this, true ) );
  1129. if ( ( ! ( ( $oldUserComplete->approved == 1 || $oldUserComplete->approved == 2 ) && $oldUserComplete->confirmed ) )
  1130.  && ($this->approved == 1 && $this->confirmed ) )
  1131. {
  1132. activateUser( $this, 2, 'UpdateUser', false );
  1133. }
  1134. }
  1135. }
  1136. } elseif ( $reason == 'register' ) {
  1137. $registerResults['after'] = $_PLUGINS->trigger( 'onAfterUserRegistration', array( $this, $this, true ) );
  1138. $registerResults['ok'] = true;
  1139. return $registerResults;
  1140. }
  1141. return true;
  1142. }
  1143. /**
  1144. * Deletes this record (no checks)
  1145. *
  1146. * @param  int      $oid   Key id of row to delete (otherwise it's the one of $this)
  1147. * @return boolean         TRUE if OK, FALSE if error
  1148. */
  1149. function delete( $oid = null ) {
  1150. $k = $this->_tbl_key;
  1151. if ( $oid ) {
  1152. $this->$k = (int) $oid;
  1153. }
  1154. $result = cbDeleteUser( $this->$k );
  1155. if ( ! is_bool( result ) ) {
  1156. $this->_error = $result;
  1157. $result = false;
  1158. }
  1159. return $result;
  1160. }
  1161. function checkin( $oid = null ) {
  1162. $this->_mapUsers();
  1163. // Checks-in the row (on the CMSes where applicable):
  1164. if ( is_callable( array( $this->_cmsUser, 'checkin' ) ) ) {
  1165. return $this->_cmsUser->checkin();
  1166. } else {
  1167. return true;
  1168. }
  1169. }
  1170. function _mapUsers() {
  1171. global $_CB_framework;
  1172. if ( $this->_cmsUser === null ) {
  1173. $this->_cmsUser = $_CB_framework->_getCmsUserObject();
  1174. }
  1175. if ( $this->_comprofilerUser === null ) {
  1176. $this->_comprofilerUser = new moscomprofiler( $this->_db );
  1177. }
  1178. //Note: Prior to PHP 4.2.0, Uninitialized class variables will not be reported by get_object_vars(), which is ok here
  1179. foreach ( get_object_vars( $this ) as $name => $value ) {
  1180. if ( $name[0] != '_' ) {
  1181. if ( in_array( $name, $this->_nonComprofilerVars ) ) {
  1182. $this->_cmsUser->$name = $value;
  1183. } else {
  1184. $this->_comprofilerUser->$name = $value;
  1185. }
  1186. }
  1187. }
  1188. $this->_cmsUser->id = $this->id;
  1189. $this->_comprofilerUser->id = $this->id;
  1190. $this->_comprofilerUser->user_id = $this->id;
  1191. }
  1192. }
  1193. class moscomprofilerUserReport extends comprofilerDBTable {
  1194.    var $reportid = null;
  1195.    var $reporteduser = null;
  1196.    var $reportedbyuser = null;
  1197.    var $reportedondate = null;
  1198.    var $reportexplaination = null;
  1199.    var $reportedstatus = null;
  1200.     /**
  1201.     * Constructor
  1202.     * @param database A database connector object
  1203.     */
  1204. function moscomprofilerUserReport( &$db ) {
  1205. $this->comprofilerDBTable( '#__comprofiler_userreports', 'reportid', $db );
  1206. }
  1207. /**
  1208.  * Deletes all user reports from that user and for that user (called on user delete)
  1209.  *
  1210.  * @param int $userId
  1211.  * @return boolean true if ok, false with warning on sql error
  1212.  */
  1213. function deleteUserReports( $userId ) {
  1214. global $_CB_database;
  1215. $sql='DELETE FROM #__comprofiler_userreports WHERE reporteduser = '.(int) $userId.' OR reportedbyuser = '.(int) $userId;
  1216. $_CB_database->SetQuery($sql);
  1217. if (!$_CB_database->query()) {
  1218. echo 'SQL error' . $_CB_database->stderr(true);
  1219. return false;
  1220. }
  1221. return true;
  1222. }
  1223. } //end class
  1224. ?>