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`=".(int)($gBitUser->mUserId ?? 0)." ) 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;
}
}
|