如何修改文件系统中文件的顺序?我正在使用Fetch
我问的原因是因为我有一个菜单栏,自动列出我的网站上的页面是什么在"页"文件夹。在我看来,它们是按字母顺序排列的。"ctp、游戏。ctp,回家。ctp, news.ctp"。所以我希望菜单栏将页面显示为"BLOG GAMES HOME NEWS",但实际上却是"GAMES NEWS BLOG HOME"。最终我希望订单是"HOME GAMES BLOG NEWS"。如何更改文件的顺序?
这里是我的代码,如果它是有用的。但我的代码不是问题…我只是想知道如何更改"Pages"文件夹中的文件顺序。if ($handle=opendir('../View/Pages/'))
{
while (false !== ($entry = readdir($handle)))
{
if(strpos($entry,".ctp")!==False)
echo "<div class='menubarItem'>".$this->Html->link(substr($entry,0,-4),
array('controller'=>'pages','action'=>'display',substr($entry,0,-4)),
array('escape' => false)).'</div>';
}
}
在文件名的开头或结尾添加一个优先级标志。例如GAMES_1, HOME_2等等……使用PHP Sort()对文件名数组进行排序,并使用substr($filename, -2)替换文件名中的最后两个字符。
CakePHP Folder
实用程序有对结果排序的选项;
http://book.cakephp.org/2.0/en/core-utility-libraries/file-folder.html文件夹::找到
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
}
但是,如果您不想按字母顺序显示页面,可以在文件名前加上一个数字并创建一个特殊的路由,或者不使用文件名进行排序,而是手动指定顺序。
最后,基于View文件动态创建菜单的唯一原因是自动为您生成菜单。然而,有可能这些更改不会经常发生,并且根据您的注释(首选顺序),您确实在脑海中有一个特定的顺序。
最好的解决方案是手动指定排序顺序。这也将提高性能,因为服务器不需要对每个请求
进行目录扫描。例如:/**
* 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。因为读取文件实际上是"检索数据",所以您可能需要为此创建一个没有连接到数据库表的Model。
例子app/模型/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);
}
}
在你的控制器中;例如,在beforeerender()回调中,或在常规操作中;
public function beforeRender()
{
$this->set('files', ClassRegistry::init('Menuoption')->getOptions());
}
中,您现在可以通过$files
变量访问结果;
foreach ($files as $filename) {
// your code here
}