From 31f74adb709c092c69b40181ed7cd14a9e36a2ca Mon Sep 17 00:00:00 2001 From: Samuel Georges Date: Mon, 21 Mar 2016 19:15:26 +1100 Subject: [PATCH] suppressDirectories -> ignoreDirectories Add support for wildcards in ignoreDirectories --- modules/cms/widgets/TemplateList.php | 65 +++++++++++++++++++--------- 1 file changed, 45 insertions(+), 20 deletions(-) diff --git a/modules/cms/widgets/TemplateList.php b/modules/cms/widgets/TemplateList.php index b474e27ca..5322689d9 100644 --- a/modules/cms/widgets/TemplateList.php +++ b/modules/cms/widgets/TemplateList.php @@ -1,6 +1,7 @@ vars['toolbarClass'] = $toolbarClass; return $this->makePartial('body', [ - 'data'=>$this->getData() + 'data' => $this->getData() ]); } @@ -143,6 +144,7 @@ class TemplateList extends WidgetBase // // Methods for the internal use // + protected function getData() { /* @@ -150,21 +152,15 @@ class TemplateList extends WidgetBase */ $items = call_user_func($this->dataSource); - $normalizedItems = []; - foreach ($items as $item) { - if ($this->suppressDirectories) { - $fileName = $item->getBaseFileName(); - $dir = dirname($fileName); - - if (in_array($dir, $this->suppressDirectories)) { - continue; - } - } - - $normalizedItems[] = $this->normalizeItem($item); + if ($items instanceof \October\Rain\Support\Collection) { + $items = $items->all(); } - usort($normalizedItems, function ($a, $b) { + $items = $this->removeIgnoredDirectories($items); + + $items = array_map([$this, 'normalizeItem'], $items); + + usort($items, function ($a, $b) { return strcmp($a->fileName, $b->fileName); }); @@ -178,10 +174,10 @@ class TemplateList extends WidgetBase /* * Exact */ - foreach ($normalizedItems as $index => $item) { + foreach ($items as $index => $item) { if ($this->itemContainsWord($searchTerm, $item, true)) { $filteredItems[] = $item; - unset($normalizedItems[$index]); + unset($items[$index]); } } @@ -189,14 +185,14 @@ class TemplateList extends WidgetBase * Fuzzy */ $words = explode(' ', $searchTerm); - foreach ($normalizedItems as $item) { + foreach ($items as $item) { if ($this->itemMatchesSearch($words, $item)) { $filteredItems[] = $item; } } } else { - $filteredItems = $normalizedItems; + $filteredItems = $items; } /* @@ -232,6 +228,35 @@ class TemplateList extends WidgetBase return $result; } + protected function removeIgnoredDirectories($items) + { + if (!$this->ignoreDirectories) { + return $items; + } + + $ignoreCache = []; + + $items = array_filter($items, function($item) use (&$ignoreCache) { + $fileName = $item->getBaseFileName(); + $dirName = dirname($fileName); + + if (isset($ignoreCache[$dirName])) { + return false; + } + + foreach ($this->ignoreDirectories as $ignoreDir) { + if (File::fileNameMatch($dirName, $ignoreDir)) { + $ignoreCache[$dirName] = true; + return false; + } + } + + return true; + }); + + return $items; + } + protected function normalizeItem($item) { $description = null;