/**
  * If HideUnmatchedFilters is on then remove all filters which are not found in the items by their 'AssociatedFilters' relationship.
  *
  * @param \DataList $filters list of GridListFilter models
  * @param array     $parameters
  * @return \ArrayList
  */
 public function constrainGridListFilters(&$filters, &$parameters = [])
 {
     $out = new \ArrayList();
     if ($this()->{self::SingleFieldName}) {
         $ids = $filters->column('ID');
         if (count($ids)) {
             $items = $this()->GridListItems();
             // this is where we keep track of GridListFilters which have been found on items where ID is the key
             $foundFilters = array_combine($ids, array_fill(0, count($ids), false));
             foreach ($foundFilters as $filterID => &$found) {
                 /** @var \Page|Model $item */
                 foreach ($items as $item) {
                     if ($item->hasExtension(HasGridListFilters::class_name())) {
                         if ($itemFilters = $item->{HasGridListFilters::relationship_name()}()->column('ID')) {
                             if (in_array($filterID, $itemFilters)) {
                                 $found = true;
                                 break;
                             }
                         }
                     }
                 }
             }
             foreach ($filters as $filter) {
                 if (isset($foundFilters[$filter->ID])) {
                     $out->push($filter);
                 }
             }
             $filters = $out;
         }
     }
 }
 /**
  * Provide pages which have
  *
  * @return \DataList
  */
 public function provideGridListItems($parameters = [])
 {
     if ($this()->{self::SingleFieldName}) {
         if ($this()->hasExtension(HasGridListFilters::class_name())) {
             $filterIDs = $this->filterIDs();
             // name of the field on Pages
             $filterField = HasGridListFilters::relationship_name('ID');
             $pages = \Page::get()->filter([$filterField => $filterIDs]);
             // debug help
             $count = $pages->count();
             return $pages;
         }
     }
 }
 /**
  * @return \ArrayList
  */
 protected function items($mode)
 {
     static $items;
     if (!$items) {
         $providers = $this->providers();
         $items = new \ArrayList();
         $service = $this->service();
         $currentFilterID = $service->Filters()->currentFilterID();
         foreach ($providers as $provider) {
             // first we get any items related to the GridList itself , e.g. curated blocks added by HasBlocks
             // this will return an array of SS_Lists
             $lists = $provider->extend('provideGridListItems');
             /** @var \ManyManyList $list */
             foreach ($lists as $itemList) {
                 // filter to current filter if set
                 if ($currentFilterID) {
                     $itemList = $itemList->filter([HasGridListFilters::relationship_name('ID') => $currentFilterID]);
                 }
                 $items->merge($itemList);
             }
         }
         $items->removeDuplicates();
     }
     return $items;
 }
 public function FilterTags()
 {
     return implode(' ', array_merge($this()->{HasGridListFilters::relationship_name()}()->column('ModelTag'), $this()->hasMethod('customFilterTags') ? $this()->customFilterTags() : []));
 }