Andrew Fletcher published: 23 June 2022 1 minute read
If you are like me, almost every view I have will have this filter. So I regularly have the need to set a contextual filter programmatically. However, some won't and will have other contextual filters instead.
You can pass through the $view object the contextual filter params using the setArguments() method. Say you want to pass three node nids to the view to filter the results contextually:
$view->setArguments(['324+613+87']);
Continuing this theme, see the environment where this code sits:
/**
* The Document Listing results taking pagination and the filters into account.
*
* @return \Drupal\helpers\Element\View
* View data.
*/
protected function getView($args)
{
$current_page = \Drupal::service('pager.parameters')->findPage();
$helperView = new View();
$view = Views::getView('view_name');
$view->setDisplay('block_name');
$view->setArguments($args);
$view->setCurrentPage($current_page);
$view->execute();
// Get teasers.
foreach ($view->result as $row) {
if (isset($row->_entity)) {
$node = $row->_entity;
$items[] = $this->dataManager->createInstance('document_teaser', ['node' => $node])->getData();
}
}
$helperView->view = $view;
$helperView->items = $items ?? [];
$helperView->pager = $this->alterPager($this->helper->getViewPager($view));
return $helperView;
}