summaryrefslogtreecommitdiff
path: root/includes/classes/ContactType.php
blob: 1933d49b1477b904cad3f392dd181000a4f4e8c2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
<?php
/**
 * Contact type registry — loads the sort_order=0 xref groups (person/business subtypes)
 * and exposes them for use in list filters and the contact edit form.
 *
 * @package contact
 */
namespace Bitweaver\Contact;

use Bitweaver\BitBase;

class ContactType extends BitBase {
	public $mContactType;

	public function __construct() {
		parent::__construct();
	}

	/**
	 * Populate $this->mContactType from liberty_xref_item (sort_order=0 groups)
	 * and assign 'contContactTypes' to Smarty for use in list/filter templates.
	 */
	public function setup() {
		global $gBitUser, $gBitSmarty;

			$roles = array_keys($gBitUser->mRoles ?? []) ?: [-1];
			$bindVars = [];
			$bindVars = array_merge( $bindVars, $roles, [ $gBitUser->mUserId ] );

			$sql = "SELECT r.`item`, r.`cross_ref_title`
					FROM `".BIT_DB_PREFIX."liberty_xref_item` r
					JOIN `".BIT_DB_PREFIX."liberty_xref_group` t ON t.`x_group` = r.`x_group` AND t.`content_type_guid` = r.`content_type_guid`
					LEFT OUTER JOIN `".BIT_DB_PREFIX."users_roles_map` purm ON ( purm.`user_id`=".$gBitUser->mUserId." ) AND ( purm.`role_id`=r.`role_id` )
					WHERE r.`content_type_guid` = 'contact' AND t.`sort_order` = 0 AND (r.`role_id` IN(". implode(',', array_fill(0, count($roles), '?')) ." ) OR purm.`user_id`=?)
					ORDER BY r.`item`";

		$result = $this->mDb->query( $sql, $bindVars );

		while( $res = $result->fetchRow() ) {
			$this->mContactType[ $res['item']] = $res['cross_ref_title'];
		}

//		asort($this->mContactType);
		$gBitSmarty->assign( 'contContactTypes', $this->mContactType );
	}

	/**
	 * Merge contact_type_guid from the request into the session store,
	 * persisting the selection as a user preference for registered users.
	 *
	 * @param array $pRequest  Raw $_REQUEST data.
	 * @param array $pStore    Session/list filter hash; modified in place.
	 */
	public function processRequestHash(&$pRequest, &$pStore) {
		global $gBitUser;
		if( !empty( $pRequest["contact_type_guid"] ) ) {
			if( $gBitUser->isRegistered() ) {
				$gBitUser->storePreference( 'contact_default_guids', serialize( $pRequest['contact_type_guid'] ) );
			}
			$pStore['contact_type_guid'] = $pRequest["contact_type_guid"];
		} elseif( !isset( $pStore['content_type_guid'] ) && $gBitUser->getPreference( 'contact_default_guids' ) && $gBitUser->isRegistered() ) {
			$pStore['contact_type_guid'] = unserialize( $gBitUser->getPreference( 'contact_default_guids' ) );
		} elseif( !isset( $pStore['content_type_guid'] ) ) {
			$pStore['contact_type_guid'] = [];
		} elseif( isset( $pRequest["refresh"] ) && !isset( $pRequest["contact_type_guid"] ) ) {
			$pStore['contact_type_guid'] = [];
		}
	}

	/**
	 * Return liberty_xref_group rows for the contact content type.
	 *
	 * @param  array|null $pOptionHash  Optional filters: active_role (int), title (string).
	 * @return array                    Rows with num_types appended.
	 */
	public static function getContactTypeList( $pOptionHash=NULL ) {
		global $gBitSystem;

		$where = '';
		$bindVars = [];
		if( !empty( $pOptionHash['active_role'] ) ) {
			$where = " WHERE cxt.`role_id` = ? ";
			$bindVars[] = $pOptionHash['active_role'];
		}
		if ( !empty(  $pOptionHash['title'] ) ) {
			$where = " WHERE cxt.`title` = ? ";
			$bindVars[] = $pOptionHash['title'];
		}

		$guidWhere = " cxt.`content_type_guid` = 'contact' ";
		$where     = $where ? $where . " AND $guidWhere" : " WHERE $guidWhere";

		$query = "SELECT cxt.*
				 FROM `".BIT_DB_PREFIX."liberty_xref_group` cxt
				 $where ORDER BY cxt.`sort_order`";

		$result = $gBitSystem->mDb->query( $query, $bindVars );

		$ret = [];

		while( $res = $result->fetchRow() ) {
			$res["num_types"] = $gBitSystem->mDb->getOne(
				"SELECT COUNT(*) FROM `".BIT_DB_PREFIX."liberty_xref_item` WHERE `x_group` = ? AND `content_type_guid` = 'contact'",
				[ $res["x_group"] ]
			);
			$ret[] = $res;
		}

		return $ret;
	}
}