public function ViewExecutable::build in Views (for Drupal 7) 8.3
Build the query for the view.
1 call to ViewExecutable::build()
- ViewExecutable::execute in lib/
Drupal/ views/ ViewExecutable.php - Execute the view's query.
File
- lib/
Drupal/ views/ ViewExecutable.php, line 964 - Definition of Drupal\views\ViewExecutable.
Class
- ViewExecutable
- An object to contain all of the data to generate a view, plus the member functions to build the view query, execute the query and render the output.
Namespace
Drupal\viewsCode
public function build($display_id = NULL) {
if (!empty($this->built)) {
return;
}
if (empty($this->current_display) || $display_id) {
if (!$this
->setDisplay($display_id)) {
return FALSE;
}
}
// Let modules modify the view just prior to building it.
foreach (module_implements('views_pre_build') as $module) {
$function = $module . '_views_pre_build';
$function($this);
}
// Attempt to load from cache.
// @todo Load a build_info from cache.
$start = microtime(TRUE);
// If that fails, let's build!
$this->build_info = array(
'query' => '',
'count_query' => '',
'query_args' => array(),
);
$this
->initQuery();
// Call a module hook and see if it wants to present us with a
// pre-built query or instruct us not to build the query for
// some reason.
// @todo: Implement this. Use the same mechanism Panels uses.
// Run through our handlers and ensure they have necessary information.
$this
->initHandlers();
// Let the handlers interact with each other if they really want.
$this
->_preQuery();
if ($this->display_handler
->usesExposed()) {
$exposed_form = $this->display_handler
->getPlugin('exposed_form');
$this->exposed_widgets = $exposed_form
->render_exposed_form();
if (form_set_error() || !empty($this->build_info['abort'])) {
$this->built = TRUE;
// Don't execute the query, but rendering will still be executed to display the empty text.
$this->executed = TRUE;
return empty($this->build_info['fail']);
}
}
// Build all the relationships first thing.
$this
->_build('relationship');
// Set the filtering groups.
if (!empty($this->filter)) {
$filter_groups = $this->display_handler
->getOption('filter_groups');
if ($filter_groups) {
$this->query
->set_group_operator($filter_groups['operator']);
foreach ($filter_groups['groups'] as $id => $operator) {
$this->query
->set_where_group($operator, $id);
}
}
}
// Build all the filters.
$this
->_build('filter');
$this->build_sort = TRUE;
// Arguments can, in fact, cause this whole thing to abort.
if (!$this
->_buildArguments()) {
$this->build_time = microtime(TRUE) - $start;
$this
->attachDisplays();
return $this->built;
}
// Initialize the style; arguments may have changed which style we use,
// so waiting as long as possible is important. But we need to know
// about the style when we go to build fields.
if (!$this
->initStyle()) {
$this->build_info['fail'] = TRUE;
return FALSE;
}
if ($this->style_plugin
->usesFields()) {
$this
->_build('field');
}
// Build our sort criteria if we were instructed to do so.
if (!empty($this->build_sort)) {
// Allow the style handler to deal with sorting.
if ($this->style_plugin
->build_sort()) {
$this
->_build('sort');
}
// allow the plugin to build second sorts as well.
$this->style_plugin
->build_sort_post();
}
// Allow area handlers to affect the query.
$this
->_build('header');
$this
->_build('footer');
$this
->_build('empty');
// Allow display handler to affect the query:
$this->display_handler
->query($this->display_handler
->useGroupBy());
// Allow style handler to affect the query:
$this->style_plugin
->query($this->display_handler
->useGroupBy());
// Allow exposed form to affect the query:
if (isset($exposed_form)) {
$exposed_form
->query();
}
if (config('views.settings')
->get('sql_signature')) {
$this->query
->add_signature($this);
}
// Let modules modify the query just prior to finalizing it.
$this->query
->alter($this);
// Only build the query if we weren't interrupted.
if (empty($this->built)) {
// Build the necessary info to execute the query.
$this->query
->build($this);
}
$this->built = TRUE;
$this->build_time = microtime(TRUE) - $start;
// Attach displays
$this
->attachDisplays();
// Let modules modify the view just after building it.
foreach (module_implements('views_post_build') as $module) {
$function = $module . '_views_post_build';
$function($this);
}
return TRUE;
}