/** * Returns all elements in system as list * * @param $pb_root_elements_only boolean If true, then only root elements are returned; default is false * @param $pm_table_name_or_num mixed Optional table name or number to filter list with. If specified then only elements that have a type restriction to the table are returned. If omitted (default) then all elements, regardless of type restrictions, are returned. * @param $pm_type_name_or_id mixed Optional type code or type_id to restrict elements to. If specified then only elements that have a type restriction to the specified table and type are returned. * @param $pb_use_cache boolean Optional control for list cache; if true [default] then the will be cached for the request; if false the list will be generated from the database. The list is always generated at least once in the current request - there is no inter-request caching * @param $pa_data_types array Optional list of element data types to filter on. * * @return array A List of elements. Each list item is an array with keys set to field names; there is one additional value added with key "display_label" set to the display label of the element in the current locale */ public static function getElementsAsList($pb_root_elements_only = false, $pm_table_name_or_num = null, $pm_type_name_or_id = null, $pb_use_cache = true, $pb_return_stats = false, $pb_index_by_element_code = false, $pa_data_types = null) { $o_dm = Datamodel::load(); $vn_table_num = $o_dm->getTableNum($pm_table_name_or_num); $vs_cache_key = md5($pm_table_name_or_num . '/' . $pm_type_name_or_id . '/' . ($pb_root_elements_only ? '1' : '0') . '/' . ($pb_index_by_element_code ? '1' : '0') . print_R($pa_data_types, true)); if ($pb_use_cache && ca_metadata_elements::$s_element_list_cache[$vs_cache_key]) { if ($pb_return_stats && isset(ca_metadata_elements::$s_element_list_cache[$vs_cache_key]['ui_counts']) || !$pb_return_stats) { return ca_metadata_elements::$s_element_list_cache[$vs_cache_key]; } } if ($pb_return_stats) { $va_counts_by_attribute = ca_metadata_elements::getUIUsageCounts(); $va_restrictions_by_attribute = ca_metadata_elements::getTypeRestrictionsAsList(); } $vo_db = new Db(); $va_wheres = array(); $va_where_params = array(); if ($pb_root_elements_only) { $va_wheres[] = 'cme.parent_id is NULL'; } if ($vn_table_num) { $va_wheres[] = 'cmtr.table_num = ?'; $va_where_params[] = (int) $vn_table_num; if ($pm_type_name_or_id) { $t_list_item = new ca_list_items(); if (!is_numeric($pm_type_name_or_id)) { $t_list_item->load(array('idno' => $pm_type_name_or_id)); } else { $t_list_item->load((int) $pm_type_name_or_id); } $va_type_ids = array(); if ($vn_type_id = $t_list_item->getPrimaryKey()) { $va_type_ids[$vn_type_id] = true; if ($qr_children = $t_list_item->getHierarchy($vn_type_id, array())) { while ($qr_children->nextRow()) { $va_type_ids[$qr_children->get('item_id')] = true; } } $va_wheres[] = '((cmtr.type_id = ?) OR (cmtr.include_subtypes = 1 AND cmtr.type_id IN (?)))'; $va_where_params[] = (int) $vn_type_id; $va_where_params[] = $va_type_ids; } } $vs_wheres = ' WHERE ' . join(' AND ', $va_wheres); $qr_tmp = $vo_db->query("\n\t\t\t\tSELECT cme.*\n\t\t\t\tFROM ca_metadata_elements cme\n\t\t\t\tINNER JOIN ca_metadata_type_restrictions AS cmtr ON cme.hier_element_id = cmtr.element_id\n\t\t\t\t{$vs_wheres}\n\t\t\t", $va_where_params); } else { if (sizeof($va_wheres)) { $vs_wheres = ' WHERE ' . join(' AND ', $va_wheres); } else { $vs_wheres = ''; } $qr_tmp = $vo_db->query("\n\t\t\t\tSELECT * \n\t\t\t\tFROM ca_metadata_elements cme\n\t\t\t\t{$vs_wheres}\n\t\t\t"); } $va_return = array(); $t_element = new ca_metadata_elements(); $va_element_ids = array(); while ($qr_tmp->nextRow()) { $vn_element_id = $qr_tmp->get('element_id'); $vs_element_code = $qr_tmp->get('element_code'); $vs_datatype = $qr_tmp->get('datatype'); if (is_array($pa_data_types) && !in_array($vs_datatype, $pa_data_types)) { continue; } foreach ($t_element->getFields() as $vs_field) { $va_record[$vs_field] = $qr_tmp->get($vs_field); } $va_record['settings'] = caUnserializeForDatabase($qr_tmp->get('settings')); if ($pb_return_stats) { $va_record['ui_counts'] = $va_counts_by_attribute[$vs_code = $qr_tmp->get('element_code')]; $va_record['restrictions'] = $va_restrictions_by_attribute[$vs_code]; } $va_return[$vn_element_id] = $va_record; } // Get labels $va_labels = $t_element->getPreferredDisplayLabelsForIDs(array_keys($va_return)); foreach ($va_labels as $vn_id => $vs_label) { $va_return[$vn_id]['display_label'] = $vs_label; } if ($pb_index_by_element_code) { $va_return_proc = array(); foreach ($va_return as $vn_id => $va_element) { $va_return_proc[$va_element['element_code']] = $va_element; } $va_return = $va_return_proc; } return ca_metadata_elements::$s_element_list_cache[$vs_cache_key] = sizeof($va_return) > 0 ? $va_return : false; }