/** * testSubpanelDisplay * * @dataProvider subpanelProvider */ public function testSubPanelDisplay($subpanel) { $subpanel_def = new aSubPanel("testpanel", $subpanel, $this->bean); if (isset($subpanel['default_hidden']) && $subpanel['default_hidden'] === true) { $this->assertTrue($subpanel_def->isDefaultHidden()); } else { $this->assertFalse($subpanel_def->isDefaultHidden()); } }
function CustomaSubPanel($name, $instance_properties, $parent_bean, $reload = false, $original_only = false, $search_query = '', $collections = array()) { $this->_instance_properties = $instance_properties; if (isset($instance_properties['collection_list'])) { $this->base_collection_list = $instance_properties['collection_list']; } if (!empty($collections) && isset($instance_properties['collection_list'])) { foreach ($instance_properties['collection_list'] as $cname => $value) { if (!in_array($value['module'], $collections)) { unset($instance_properties['collection_list'][$cname]); } } } if (!$this->isCollection()) { $table = strtolower($instance_properties['module']); $search_query = str_replace('meetings', $table, $search_query); } $this->search_query = $search_query; parent::aSubPanel($name, $instance_properties, $parent_bean, $reload, $original_only); }
/** * Constructs a query to fetch data for supanels and list views * * It constructs union queries for activities subpanel. * * @param SugarBean $parentbean constructing queries for link attributes in this bean * @param string $order_by Optional, order by clause * @param string $sort_order Optional, sort order * @param string $where Optional, additional where clause * @param int $row_offset * @param int $limit * @param int $max * @param int $show_deleted * @param aSubPanel $subpanel_def * * @return array * * Internal Function, do not overide. */ function get_union_related_list($parentbean, $order_by = "", $sort_order = '', $where = "", $row_offset = 0, $limit = -1, $max = -1, $show_deleted = 0, $subpanel_def) { $secondary_queries = array(); global $layout_edit_mode, $beanFiles, $beanList; if (isset($_SESSION['show_deleted'])) { $show_deleted = 1; } $final_query = ''; $final_query_rows = ''; $subpanel_list = array(); if ($subpanel_def->isCollection()) { $subpanel_def->load_sub_subpanels(); $subpanel_list = $subpanel_def->sub_subpanels; } else { $subpanel_list[] = $subpanel_def; } $first = true; //Breaking the building process into two loops. The first loop gets a list of all the sub-queries. //The second loop merges the queries and forces them to select the same number of columns //All columns in a sub-subpanel group must have the same aliases //If the subpanel is a datasource function, it can't be a collection so we just poll that function for the and return that foreach ($subpanel_list as $this_subpanel) { if ($this_subpanel->isDatasourceFunction() && empty($this_subpanel->_instance_properties['generate_select'])) { $shortcut_function_name = $this_subpanel->get_data_source_name(); $parameters = $this_subpanel->get_function_parameters(); if (!empty($parameters)) { //if the import file function is set, then import the file to call the custom function from if (is_array($parameters) && isset($parameters['import_function_file'])) { //this call may happen multiple times, so only require if function does not exist if (!function_exists($shortcut_function_name)) { require_once $parameters['import_function_file']; } //call function from required file $tmp_final_query = $shortcut_function_name($parameters); } else { //call function from parent bean $tmp_final_query = $parentbean->{$shortcut_function_name}($parameters); } } else { $tmp_final_query = $parentbean->{$shortcut_function_name}(); } if (!$first) { $final_query_rows .= ' UNION ALL ( ' . $parentbean->create_list_count_query($tmp_final_query, $parameters) . ' )'; $final_query .= ' UNION ALL ( ' . $tmp_final_query . ' )'; } else { $final_query_rows = '(' . $parentbean->create_list_count_query($tmp_final_query, $parameters) . ')'; $final_query = '(' . $tmp_final_query . ')'; $first = false; } } } //If final_query is still empty, its time to build the sub-queries if (empty($final_query)) { $subqueries = SugarBean::build_sub_queries_for_union($subpanel_list, $subpanel_def, $parentbean, $order_by); $all_fields = array(); foreach ($subqueries as $i => $subquery) { $query_fields = $GLOBALS['db']->getSelectFieldsFromQuery($subquery['select']); foreach ($query_fields as $field => $select) { if (!in_array($field, $all_fields)) { $all_fields[] = $field; } } $subqueries[$i]['query_fields'] = $query_fields; } $first = true; //Now ensure the queries have the same set of fields in the same order. foreach ($subqueries as $subquery) { $subquery['select'] = "SELECT"; foreach ($all_fields as $field) { if (!isset($subquery['query_fields'][$field])) { $subquery['select'] .= " NULL {$field},"; } else { $subquery['select'] .= " {$subquery['query_fields'][$field]},"; } } $subquery['select'] = substr($subquery['select'], 0, strlen($subquery['select']) - 1); //Put the query into the final_query $query = $subquery['select'] . " " . $subquery['from'] . " " . $subquery['where']; if (!$first) { $query = ' UNION ALL ( ' . $query . ' )'; $final_query_rows .= " UNION ALL "; } else { $query = '(' . $query . ')'; $first = false; } $query_array = $subquery['query_array']; $select_position = strpos($query_array['select'], "SELECT"); $distinct_position = strpos($query_array['select'], "DISTINCT"); if (!empty($subquery['params']['distinct']) && !empty($subpanel_def->table_name)) { $query_rows = "( SELECT count(DISTINCT " . $subpanel_def->table_name . ".id)" . $subquery['from_min'] . $query_array['join'] . $subquery['where'] . ' )'; } elseif ($select_position !== false && $distinct_position != false) { $query_rows = "( " . substr_replace($query_array['select'], "SELECT count(", $select_position, 6) . ")" . $subquery['from_min'] . $query_array['join'] . $subquery['where'] . ' )'; } else { //resort to default behavior. $query_rows = "( SELECT count(*)" . $subquery['from_min'] . $query_array['join'] . $subquery['where'] . ' )'; } if (!empty($subquery['secondary_select'])) { $subquerystring = $subquery['secondary_select'] . $subquery['secondary_from'] . $query_array['join'] . $subquery['where']; if (!empty($subquery['secondary_where'])) { if (empty($subquery['where'])) { $subquerystring .= " WHERE " . $subquery['secondary_where']; } else { $subquerystring .= " AND " . $subquery['secondary_where']; } } $secondary_queries[] = $subquerystring; } $final_query .= $query; $final_query_rows .= $query_rows; } } if (!empty($order_by)) { $isCollection = $subpanel_def->isCollection(); if ($isCollection) { /** @var aSubPanel $header */ $header = $subpanel_def->get_header_panel_def(); $submodule = $header->template_instance; $suppress_table_name = true; } else { $submodule = $subpanel_def->template_instance; $suppress_table_name = false; } if (!empty($sort_order)) { $order_by .= ' ' . $sort_order; } $order_by = $parentbean->process_order_by($order_by, $submodule, $suppress_table_name); if (!empty($order_by)) { $final_query .= ' ORDER BY ' . $order_by; } } if (isset($layout_edit_mode) && $layout_edit_mode) { $response = array(); if (!empty($submodule)) { $submodule->assign_display_fields($submodule->module_dir); $response['list'] = array($submodule); } else { $response['list'] = array(); } $response['parent_data'] = array(); $response['row_count'] = 1; $response['next_offset'] = 0; $response['previous_offset'] = 0; return $response; } return $parentbean->process_union_list_query($parentbean, $final_query, $row_offset, $limit, $max, '', $subpanel_def, $final_query_rows, $secondary_queries); }
/** * Applies pagination window to union queries used by list view and subpanels, * executes the query and returns fetched data. * * Internal function, do not override. * @param object $parent_bean * @param string $query query to be processed. * @param int $row_offset * @param int $limit optional, default -1 * @param int $max_per_page Optional, default -1 * @param string $where Custom where clause. * @param aSubPanel $subpanel_def definition of sub-panel to be processed * @param string $query_row_count * @param array $secondary_queries * @return array $fetched data. */ public function process_union_list_query($parent_bean, $query, $row_offset, $limit = -1, $max_per_page = -1, $where = '', $subpanel_def, $query_row_count = '', $secondary_queries = array()) { $db = DBManagerFactory::getInstance('listviews'); /** * if the row_offset is set to 'end' go to the end of the list */ $toEnd = strval($row_offset) == 'end'; global $sugar_config; $use_count_query = false; $processing_collection = $subpanel_def->isCollection(); $GLOBALS['log']->debug("process_union_list_query: " . $query); if ($max_per_page == -1) { $max_per_page = $sugar_config['list_max_entries_per_subpanel']; } if (empty($query_row_count)) { $query_row_count = $query; } $distinct_position = strpos($query_row_count, "DISTINCT"); if ($distinct_position != false) { $use_count_query = true; } $performSecondQuery = true; if (empty($sugar_config['disable_count_query']) || $toEnd) { $rows_found = $this->_get_num_rows_in_query($query_row_count, $use_count_query); if ($rows_found < 1) { $performSecondQuery = false; } if (!empty($rows_found) && (empty($limit) || $limit == -1)) { $limit = $max_per_page; } if ($toEnd) { $row_offset = floor(($rows_found - 1) / $limit) * $limit; } } else { if (empty($limit) || $limit == -1) { $limit = $max_per_page + 1; $max_per_page = $limit; } } if (empty($row_offset)) { $row_offset = 0; } $list = array(); $previous_offset = $row_offset - $max_per_page; $next_offset = $row_offset + $max_per_page; if ($performSecondQuery) { if (!empty($limit) && $limit != -1 && $limit != -99) { $result = $db->limitQuery($query, $row_offset, $limit, true, "Error retrieving {$parent_bean->object_name} list: "); } else { $result = $db->query($query, true, "Error retrieving {$this->object_name} list: "); } //use -99 to return all // get the current row $index = $row_offset; $row = $db->fetchByAssoc($result); $post_retrieve = array(); $isFirstTime = true; while ($row) { $function_fields = array(); if ($index < $row_offset + $max_per_page || $max_per_page == -99) { if ($processing_collection) { $current_bean = $subpanel_def->sub_subpanels[$row['panel_name']]->template_instance; if (!$isFirstTime) { $class = get_class($subpanel_def->sub_subpanels[$row['panel_name']]->template_instance); $current_bean = new $class(); } } else { $current_bean = $subpanel_def->template_instance; if (!$isFirstTime) { $class = get_class($subpanel_def->template_instance); $current_bean = new $class(); } } $isFirstTime = false; //set the panel name in the bean instance. if (isset($row['panel_name'])) { $current_bean->panel_name = $row['panel_name']; } foreach ($current_bean->field_defs as $field => $value) { if (isset($row[$field])) { $current_bean->{$field} = $this->convertField($row[$field], $value); unset($row[$field]); } elseif (isset($row[$this->table_name . '.' . $field])) { $current_bean->{$field} = $this->convertField($row[$this->table_name . '.' . $field], $value); unset($row[$this->table_name . '.' . $field]); } else { $current_bean->{$field} = ""; unset($row[$field]); } if (isset($value['source']) && $value['source'] == 'function') { $function_fields[] = $field; } } foreach ($row as $key => $value) { $current_bean->{$key} = $value; } foreach ($function_fields as $function_field) { $value = $current_bean->field_defs[$function_field]; $can_execute = true; $execute_params = array(); $execute_function = array(); if (!empty($value['function_class'])) { $execute_function[] = $value['function_class']; $execute_function[] = $value['function_name']; } else { $execute_function = $value['function_name']; } foreach ($value['function_params'] as $param) { if (empty($value['function_params_source']) or $value['function_params_source'] == 'parent') { if (empty($this->{$param})) { $can_execute = false; } elseif ($param == '$this') { $execute_params[] = $this; } else { $execute_params[] = $this->{$param}; } } elseif ($value['function_params_source'] == 'this') { if (empty($current_bean->{$param})) { $can_execute = false; } elseif ($param == '$this') { $execute_params[] = $current_bean; } else { $execute_params[] = $current_bean->{$param}; } } else { $can_execute = false; } } if ($can_execute) { if (!empty($value['function_require'])) { require_once $value['function_require']; } $current_bean->{$function_field} = call_user_func_array($execute_function, $execute_params); } } if (!empty($current_bean->parent_type) && !empty($current_bean->parent_id)) { if (!isset($post_retrieve[$current_bean->parent_type])) { $post_retrieve[$current_bean->parent_type] = array(); } $post_retrieve[$current_bean->parent_type][] = array('child_id' => $current_bean->id, 'parent_id' => $current_bean->parent_id, 'parent_type' => $current_bean->parent_type, 'type' => 'parent'); } //$current_bean->fill_in_additional_list_fields(); $list[$current_bean->id] = $current_bean; } // go to the next row $index++; $row = $db->fetchByAssoc($result); } //now handle retrieving many-to-many relationships if (!empty($list)) { foreach ($secondary_queries as $query2) { $result2 = $db->query($query2); $row2 = $db->fetchByAssoc($result2); while ($row2) { $id_ref = $row2['ref_id']; if (isset($list[$id_ref])) { foreach ($row2 as $r2key => $r2value) { if ($r2key != 'ref_id') { $list[$id_ref]->{$r2key} = $r2value; } } } $row2 = $db->fetchByAssoc($result2); } } } if (isset($post_retrieve)) { $parent_fields = $this->retrieve_parent_fields($post_retrieve); } else { $parent_fields = array(); } if (!empty($sugar_config['disable_count_query']) && !empty($limit)) { //C.L. Bug 43535 - Use the $index value to set the $rows_found value here $rows_found = isset($index) ? $index : $row_offset + count($list); if (count($list) >= $limit) { array_pop($list); } if (!$toEnd) { $next_offset--; $previous_offset++; } } } else { $parent_fields = array(); } $response = array(); $response['list'] = $list; $response['parent_data'] = $parent_fields; $response['row_count'] = $rows_found; $response['next_offset'] = $next_offset; $response['previous_offset'] = $previous_offset; $response['current_offset'] = $row_offset; $response['query'] = $query; return $response; }