diff --git a/system/blueprints/pages/page.yaml b/system/blueprints/pages/page.yaml index e180fb3d1..7ead3cd9d 100644 --- a/system/blueprints/pages/page.yaml +++ b/system/blueprints/pages/page.yaml @@ -34,7 +34,7 @@ form: type: type: select classes: fancy - label: Page Type + label: Display Template default: default @data-options: '\Grav\Common\Page\Pages::types' validate: diff --git a/system/src/Grav/Common/Filesystem/Folder.php b/system/src/Grav/Common/Filesystem/Folder.php index 41164a2b6..c5b859abf 100644 --- a/system/src/Grav/Common/Filesystem/Folder.php +++ b/system/src/Grav/Common/Filesystem/Folder.php @@ -89,12 +89,17 @@ abstract class Folder $compare = isset($params['compare']) ? 'get' . $params['compare'] : null; $pattern = isset($params['pattern']) ? $params['pattern'] : null; $filters = isset($params['filters']) ? $params['filters'] : null; + $recursive = isset($params['recursive']) ? $params['recursive'] : true; $key = isset($params['key']) ? 'get' . $params['key'] : null; - $value = isset($params['value']) ? 'get' . $params['value'] : 'getSubPathname'; + $value = isset($params['value']) ? 'get' . $params['value'] : ($recursive ? 'getSubPathname' : 'getFilename'); - $directory = new \RecursiveDirectoryIterator($path, - \RecursiveDirectoryIterator::SKIP_DOTS + \FilesystemIterator::UNIX_PATHS + \FilesystemIterator::CURRENT_AS_SELF); - $iterator = new \RecursiveIteratorIterator($directory, \RecursiveIteratorIterator::SELF_FIRST); + if ($recursive) { + $directory = new \RecursiveDirectoryIterator($path, + \RecursiveDirectoryIterator::SKIP_DOTS + \FilesystemIterator::UNIX_PATHS + \FilesystemIterator::CURRENT_AS_SELF); + $iterator = new \RecursiveIteratorIterator($directory, \RecursiveIteratorIterator::SELF_FIRST); + } else { + $iterator = new \FilesystemIterator($path); + } $results = array(); diff --git a/system/src/Grav/Common/Page/Pages.php b/system/src/Grav/Common/Page/Pages.php index 408cc15fa..d111d87f1 100644 --- a/system/src/Grav/Common/Page/Pages.php +++ b/system/src/Grav/Common/Page/Pages.php @@ -316,9 +316,19 @@ class Pages */ static public function types() { - $blueprints = new Blueprints('theme://blueprints/'); + static $types; - return $blueprints->types(); + if (!$types) { + $types = new Types(); + $types->scanBlueprints('theme://blueprints/'); + $types->scanTemplates('theme://templates/'); + + $event = new Event(); + $event->types = $types; + Grav::instance()->fireEvent('onGetPageTemplates', $event); + } + + return $types->toSelect(); } /** diff --git a/system/src/Grav/Common/Page/Types.php b/system/src/Grav/Common/Page/Types.php new file mode 100644 index 000000000..11a35a453 --- /dev/null +++ b/system/src/Grav/Common/Page/Types.php @@ -0,0 +1,65 @@ +items[$type])) { + $this->items[$type] = $blueprint; + } + } + + public function scanBlueprints($path) + { + $options = [ + 'compare' => 'Filename', + 'pattern' => '|\.yaml$|', + 'filters' => [ + 'key' => '|\.yaml$|' + ], + 'key' => 'Filename', + 'value' => 'PathName', + 'recursive' => false + ]; + + $this->items = Folder::all($path, $options) + $this->items; + } + + public function scanTemplates($path) + { + $options = [ + 'compare' => 'Filename', + 'pattern' => '|\.html\.twig$|', + 'filters' => [ + 'value' => '|\.html\.twig$|' + ], + 'value' => 'Filename', + 'recursive' => false + ]; + + foreach (Folder::all($path, $options) as $type) { + $this->register($type); + } + } + + public function toSelect() + { + $list = []; + foreach ($this->items as $name => $file) { + $list[$name] = ucfirst(strtr($name, '_', ' ')); + } + ksort($list); + return $list; + } +}