Skip to main content

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;
    }

 

Related articles