/** * 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() : [])); }