/**
  * 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());
     }
 }
Example #2
0
 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);
 }
Example #3
0
 /**
  * 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);
 }
Example #4
0
 /**
  * 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;
 }