public function ViewExecutable::build in Drupal 9
Same name and namespace in other branches
- 8 core/modules/views/src/ViewExecutable.php \Drupal\views\ViewExecutable::build()
Builds the query for the view.
Parameters
string $display_id: The display ID of the view.
Return value
bool|null TRUE if the view build process was successful, FALSE if setting the display fails or NULL if the view has been built already.
1 call to ViewExecutable::build()
- ViewExecutable::execute in core/
modules/ views/ src/ ViewExecutable.php - Executes the view's query.
File
- core/
modules/ views/ src/ ViewExecutable.php, line 1196
Class
- ViewExecutable
- Represents a view as a whole.
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.
$module_handler = \Drupal::moduleHandler();
$module_handler
->invokeAll('views_pre_build', [
$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 = [
'query' => '',
'count_query' => '',
'query_args' => [],
];
$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()) {
/** @var \Drupal\views\Plugin\views\exposed_form\ExposedFormPluginInterface $exposed_form */
$exposed_form = $this->display_handler
->getPlugin('exposed_form');
$this->exposed_widgets = $exposed_form
->renderExposedForm();
if (!empty($this->build_info['abort'])) {
$this->built = TRUE;
// Don't execute the query, $form_state, 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
->setGroupOperator($filter_groups['operator']);
foreach ($filter_groups['groups'] as $id => $operator) {
$this->query
->setWhereGroup($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
->buildSort()) {
$this
->_build('sort');
}
// allow the plugin to build second sorts as well.
$this->style_plugin
->buildSortPost();
}
// 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 (\Drupal::config('views.settings')
->get('sql_signature')) {
$this->query
->addSignature($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.
$module_handler
->invokeAll('views_post_build', [
$this,
]);
return TRUE;
}