如何更改服务器上的文件顺序?

时间:2013-03-13 09:41:56

标签: php filesystems cakephp-2.0 fetch

如何更改文件系统中文件的顺序?我正在使用Fetch。

我问的原因是因为我有一个菜单栏,可以通过“pages”文件夹中的内容自动列出我网站中的页面。我在fetch上看到它的方式,它们按字母顺序排列“blog.ctp,games.ctp,home.ctp,news.ctp”。所以我希望菜单栏能够将这些页面列为“BLOG GAMES HOME NEWS”,而是将它们列为“GAMES NEWS BLOG HOME”。最终我希望订单成为“家庭游戏博客新闻”。如何更改文件的顺序?

这是我的代码,以防它有用。但我的代码不是问题...我只需要知道如何更改文件夹“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>';

    }
}

2 个答案:

答案 0 :(得分:1)

在开头或结尾为您的文件名添加优先级标志。即GAMES_1,HOME_2 ...等...使用PHP sort()对文件名数组进行排序,并使用substr($ filename,-2)替换文件名中的最后两个字符。

答案 1 :(得分:0)

CakePHP Folder实用程序可以选择对结果进行排序;

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 

}

但是,如果您不想按字母顺序显示页面,请在文件名前加上数字并创建特殊路径,或者使用文件名进行排序,但手动指定顺序

最后,基于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。因为读取文件实际上是“检索数据”,所以您可能希望为此创建一个未连接到数据库表的模型。

例如

应用程序/型号/ 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 

}