public function getDisplaysAsXML() { $t_display = new ca_bundle_displays(); /** @var Datamodel $o_dm */ $o_dm = Datamodel::load(); $this->opt_locale = new ca_locales(); $va_displays = $t_display->getBundleDisplays(); $vs_buf = "<displays>\n"; foreach ($va_displays as $vn_i => $va_display_by_locale) { $va_locales = array_keys($va_display_by_locale); $va_info = $va_display_by_locale[$va_locales[0]]; if (!$t_display->load($va_info['display_id'])) { continue; } $vs_buf .= "\t<display code='" . ($va_info['display_code'] && preg_match('!^[A-Za-z0-9_]+$!', $va_info['display_code']) ? $va_info['display_code'] : 'display_' . $va_info['display_id']) . "' type='" . $o_dm->getTableName($va_info['table_num']) . "' system='" . $t_display->get('is_system') . "'>\n"; $vs_buf .= "\t\t<labels>\n"; foreach ($va_display_by_locale as $vn_locale_id => $va_display_info) { if (strlen($this->opt_locale->localeIDToCode($vn_locale_id)) > 0) { $vs_buf .= "\t\t\t<label locale='" . $this->opt_locale->localeIDToCode($vn_locale_id) . "'><name>" . caEscapeForXML($va_display_info['name']) . "</name></label>\n"; } } $vs_buf .= "\t\t</labels>\n"; $va_settings = $t_display->getSettings(); if (sizeof($va_settings) > 0) { $vs_buf .= "\t\t<settings>\n"; foreach ($va_settings as $vs_setting => $vm_val) { if (is_array($vm_val)) { foreach ($vm_val as $vn_i => $vn_val) { $vs_buf .= "\t\t\t<setting name='{$vs_setting}'><![CDATA[" . $vn_val . "]]></setting>\n"; } } else { $vs_buf .= "\t\t\t<setting name='{$vs_setting}'><![CDATA[" . $vm_val . "]]></setting>\n"; } } $vs_buf .= "\t\t</settings>\n"; } // User and group access $va_users = $t_display->getUsers(); if (sizeof($va_users) > 0) { $vs_buf .= "\t\t<userAccess>\n"; foreach ($va_users as $va_user_info) { $vs_buf .= "\t\t\t<permission user='******' access='" . $this->_convertUserGroupAccessToString(intval($va_user_info['access'])) . "'/>\n"; } $vs_buf .= "\t\t</userAccess>\n"; } $va_groups = $t_display->getUserGroups(); if (sizeof($va_groups) > 0) { $vs_buf .= "\t\t<groupAccess>\n"; foreach ($va_groups as $va_group_info) { $vs_buf .= "\t\t\t<permission group='" . $va_group_info["code"] . "' access='" . $this->_convertUserGroupAccessToString(intval($va_group_info['access'])) . "'/>\n"; } $vs_buf .= "\t\t</groupAccess>\n"; } $va_placements = $t_display->getPlacements(); $vs_buf .= "<bundlePlacements>\n"; foreach ($va_placements as $vn_placement_id => $va_placement_info) { $vs_buf .= "\t\t<placement code='" . preg_replace("![^A-Za-z0-9_]+!", "_", $va_placement_info['bundle_name']) . "'><bundle>" . $va_placement_info['bundle_name'] . "</bundle>\n"; $va_settings = caUnserializeForDatabase($va_placement_info['settings']); if (is_array($va_settings)) { $vs_buf .= "<settings>\n"; foreach ($va_settings as $vs_setting => $vm_value) { switch ($vs_setting) { case 'label': if (is_array($vm_value)) { foreach ($vm_value as $vn_locale_id => $vm_locale_specific_value) { if (preg_match("/^[a-z]{2,3}\\_[A-Z]{2,3}\$/", $vn_locale_id)) { // locale code $vs_locale_code = $vn_locale_id; } else { if (!($vs_locale_code = $this->opt_locale->localeIDToCode($vn_locale_id))) { $vs_locale_code = 'en_US'; } } $vs_buf .= "<setting name='label' locale='" . $vs_locale_code . "'>" . caEscapeForXML($vm_locale_specific_value) . "</setting>\n"; } } break; case 'restrict_to_relationship_types': if (is_array($vm_value)) { foreach ($vm_value as $vn_val) { $t_rel_type = new ca_relationship_types($vn_val); if ($t_rel_type->getPrimaryKey()) { $vs_value = $t_rel_type->get('type_code'); $vs_buf .= "\t\t\t\t<setting name='{$vs_setting}'><![CDATA[" . $vs_value . "]]></setting>\n"; } } } break; case 'restrict_to_types': if (is_array($vm_value)) { foreach ($vm_value as $vn_val) { $t_item = new ca_list_items($vn_val); if ($t_item->getPrimaryKey()) { $vs_value = $t_item->get('idno'); $vs_buf .= "\t\t\t\t<setting name='{$vs_setting}'><![CDATA[" . $vs_value . "]]></setting>\n"; } } } break; default: if (is_array($vm_value)) { foreach ($vm_value as $vn_i => $vn_val) { $vs_buf .= "\t\t\t\t<setting name='{$vs_setting}'><![CDATA[" . $vn_val . "]]></setting>\n"; } } else { $vs_buf .= "\t\t\t\t<setting name='{$vs_setting}'><![CDATA[" . $vm_value . "]]></setting>\n"; } break; } } $vs_buf .= "</settings>\n"; } $vs_buf .= "\t\t</placement>\n"; } $vs_buf .= "</bundlePlacements>\n"; $vs_buf .= "\t</display>\n"; } $vs_buf .= "</displays>\n"; return $vs_buf; }
/** * Determines if user has access to a display at a specified access level. * * @param int $pn_user_id user_id of user to check display access for * @param int $pn_user_access type of access required. Use __CA_BUNDLE_DISPLAY_READ_ACCESS__ for read-only access or __CA_BUNDLE_DISPLAY_EDIT_ACCESS__ for editing (full) access * @param int $pn_display_id The id of the display to check. If omitted then currently loaded display will be checked. * @return bool True if user has access, false if not */ public function haveAccessToDisplay($pn_user_id, $pn_user_access, $pn_display_id = null) { if ($pn_display_id) { $vn_display_id = $pn_display_id; $t_disp = new ca_bundle_displays($vn_display_id); if ($this->inTransaction()) { $t_disp->setTransaction($this->getTransaction()); } $vn_display_user_id = $t_disp->get('user_id'); } else { $vn_display_user_id = $this->get('user_id'); $t_disp = $this; } if (!$vn_display_id && !($vn_display_id = $t_disp->getPrimaryKey())) { return true; // new display } if (isset(ca_bundle_displays::$s_have_access_to_display_cache[$vn_display_id . '/' . $pn_user_id . '/' . $pn_user_access])) { return ca_bundle_displays::$s_have_access_to_display_cache[$vn_display_id . '/' . $pn_user_id . '/' . $pn_user_access]; } if ($vn_display_user_id == $pn_user_id) { // owners have all access return ca_bundle_displays::$s_have_access_to_display_cache[$vn_display_id . '/' . $pn_user_id . '/' . $pn_user_access] = true; } if ((bool) $t_disp->get('is_system') && $pn_user_access == __CA_BUNDLE_DISPLAY_READ_ACCESS__) { // system displays are readable by all return ca_bundle_displays::$s_have_access_to_display_cache[$vn_display_id . '/' . $pn_user_id . '/' . $pn_user_access] = true; } $o_db = $this->getDb(); $qr_res = $o_db->query("\n\t\t\tSELECT dxg.display_id \n\t\t\tFROM ca_bundle_displays_x_user_groups dxg \n\t\t\tINNER JOIN ca_user_groups AS ug ON dxg.group_id = ug.group_id\n\t\t\tINNER JOIN ca_users_x_groups AS uxg ON uxg.group_id = ug.group_id\n\t\t\tWHERE \n\t\t\t\t(dxg.access >= ?) AND (uxg.user_id = ?) AND (dxg.display_id = ?)\n\t\t", (int) $pn_user_access, (int) $pn_user_id, (int) $vn_display_id); if ($qr_res->numRows() > 0) { return ca_bundle_displays::$s_have_access_to_display_cache[$vn_display_id . '/' . $pn_user_id . '/' . $pn_user_access] = true; } $qr_res = $o_db->query("\n\t\t\tSELECT dxu.display_id \n\t\t\tFROM ca_bundle_displays_x_users dxu\n\t\t\tINNER JOIN ca_users AS u ON dxu.user_id = u.user_id\n\t\t\tWHERE \n\t\t\t\t(dxu.access >= ?) AND (u.user_id = ?) AND (dxu.display_id = ?)\n\t\t", (int) $pn_user_access, (int) $pn_user_id, (int) $vn_display_id); if ($qr_res->numRows() > 0) { return ca_bundle_displays::$s_have_access_to_display_cache[$vn_display_id . '/' . $pn_user_id . '/' . $pn_user_access] = true; } return ca_bundle_displays::$s_have_access_to_display_cache[$vn_display_id . '/' . $pn_user_id . '/' . $pn_user_access] = false; }
public function getDisplaysAsXML($pa_options = null) { $t_display = new ca_bundle_displays(); $o_dm = Datamodel::load(); $this->opt_locale = new ca_locales(); $va_displays = $t_display->getBundleDisplays(); $vs_buf = "<displays>\n"; foreach ($va_displays as $vn_i => $va_display_by_locale) { $va_locales = array_keys($va_display_by_locale); $va_info = $va_display_by_locale[$va_locales[0]]; if (!$t_display->load($va_info['display_id'])) { continue; } $vs_buf .= "\t<display code='" . ($va_info['display_code'] && preg_match('!^[A-Za-z0-9_]+$!', $va_info['display_code']) ? $va_info['display_code'] : 'display_' . $va_info['display_id']) . "' type='" . $o_dm->getTableName($va_info['table_num']) . "' system='" . $t_display->get('is_system') . "'>\n"; $vs_buf .= "\t\t<labels>\n"; foreach ($va_display_by_locale as $vn_locale_id => $va_display_info) { if (strlen($this->opt_locale->localeIDToCode($vn_locale_id)) > 0) { $vs_buf .= "\t\t\t<label locale='" . $this->opt_locale->localeIDToCode($vn_locale_id) . "'><name>" . caEscapeForXML($va_display_info['name']) . "</name></label>\n"; } } $vs_buf .= "\t\t</labels>\n"; $va_placements = $t_display->getPlacements(); //print_R(($va_placements)); $vs_buf .= "<bundlePlacements>\n"; foreach ($va_placements as $vn_placement_id => $va_placement_info) { $vs_buf .= "\t\t<placement code='" . preg_replace("![^A-Za-z0-9_]+!", "_", $va_placement_info['bundle_name']) . "'><bundle>" . $va_placement_info['bundle_name'] . "</bundle>\n"; $va_settings = caUnserializeForDatabase($va_placement_info['settings']); if (is_array($va_settings)) { $vs_buf .= "<settings>\n"; foreach ($va_settings as $vs_setting => $vm_value) { switch ($vs_setting) { case 'label': //restrict_to_relationship_types if (is_array($vm_value)) { foreach ($vm_value as $vn_locale_id => $vm_locale_specific_value) { $vs_buf .= "<setting name='label' locale='" . $this->opt_locale->localeIDToCode($vn_locale_id) . "'>" . caEscapeForXML($vm_locale_specific_value) . "</setting>\n"; } } break; default: if (is_array($vm_value)) { foreach ($vm_value as $vn_i => $vn_val) { $vs_buf .= "\t\t\t\t<setting name='{$vs_setting}'>" . caEscapeForXML($vn_val) . "</setting>\n"; } } else { $vs_buf .= "\t\t\t\t<setting name='{$vs_setting}'>" . caEscapeForXML($vm_value) . "</setting>\n"; } break; } } $vs_buf .= "</settings>\n"; } $vs_buf .= "\t\t</placement>\n"; } $vs_buf .= "</bundlePlacements>\n"; $vs_buf .= "\t</display>\n"; } $vs_buf .= "</displays>\n"; //print_R($va_displays); return $vs_buf; }