CakePHPFolder
实用程序可以选择对结果进行排序;
http://book.cakephp.org/2.0/en/core-utility-libraries/file-folder.html#Folder::find
App::uses('Folder', 'Utility');
App::uses('Folder', 'Utility');
$myFolder = new Folder('/path/to/directory');
$files = $myFolder->find('*.ctp', true);
foreach ($files as $filename) {
// your code here
}
但是,如果您不想按字母顺序显示页面,请在文件名前加上数字前缀并创建特殊路径,或者不使用文件名进行排序,而是手动指定顺序。
最后,基于视图文件动态创建菜单的唯一原因是自动为您生成菜单。但是,这些更改可能不会经常发生,并且根据您的评论(首选顺序),您确实有一个特定的顺序。
最好的解决方案是手动指定排序顺序。这也将提高性能,因为服务器不必为每个请求进行目录扫描
例如:
/**
* MenuItems
*
* preferable pass this as a viewVar to the View
*
* file => title
*/
$menuItems = array(
'home' => 'HOME',
'blog' => 'BLOG',
....
);
foreach($menuItems as $file => $title) {
// your code here
}
将其移至模型
在您的视图中检索文件列表不是应该执行此操作的位置。最好事先读取文件并通过 viewvar 将它们传递给 View。因为读取文件实际上是“检索数据”,所以您可能希望为此创建一个未连接到数据库表的模型。
例子
应用程序/模型/Menuoption.php
App::uses('Folder', 'Utility');
class Menuoption extends AppModel {
// this model does not use a database table
public $useTable = false;
public function getOptions()
{
// NOTE: or use the 'manually' created menuItems here
$myFolder = new Folder('/path/to/directory');
return $myFolder->find('*.ctp', true);
}
}
在您的控制器内部;例如在 beforeRender() 回调中,或在常规操作中;
public function beforeRender()
{
$this->set('files', ClassRegistry::init('Menuoption')->getOptions());
}
在您的视图中,您现在可以通过$files
变量访问结果;
foreach ($files as $filename) {
// your code here
}