【问题标题】:How do I change the order of files on my server?如何更改服务器上文件的顺序?
【发布时间】:2013-03-13 09:41:55
【问题描述】:

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

我问的原因是因为我有一个菜单栏,它会根据“页面”文件夹中的内容自动列出我网站中的页面。我在获取时看到的方式是按字母顺序“blog.ctp、games.ctp、home.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>';

    }
}

【问题讨论】:

标签: php filesystems cakephp-2.0 fetch


【解决方案1】:

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

【讨论】:

  • 这是一个很好的解决方法,谢谢。我仍然想知道是否可以手动更改文件的顺序。我不要文件名定义顺序,我要顺序定义顺序。
  • 这项变通方案将使您能够为文件名设置手动顺序,从而为您提供更大的灵活性....
  • 我知道您的答案会起作用,如果需要,我会实施它,但更改文件名会破坏 cakephp 约定,所以我不想这样做。我只想能够将我想首先读取的文件拖到文件列表的顶部,导致 PHP 首先读取第一个文件,第二个文件,等等......但是 Fetch 不允许我点击并拖动文件以手动更改顺序。如果使用 Fetch 或其他方法都无法做到这一点,我将实施您的工作,因为这是一个很好的解决方案。
  • 这种情况下你可以试试 PHP 的 usort() 函数,编写自己的排序函数...
  • 更改文件名打破了 CakePHP 的约定,定义我自己的排序函数违背了我所做的目的。从现在开始,我正在 CakePHP 框架中构建一个功能,以便在我的所有网站上使用。此功能将读取我的文件系统中的“页面”文件夹,该文件夹将包含我网站中的所有主要页面。然后它会自动生成指向我标题中页面的链接。如何访问文件系统以更改文件的顺序,以便它以不同的顺序读取文件? Fetch 不允许我更改文件的顺序。
【解决方案2】:

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 

}

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

最后,基于视图文件动态创建菜单的唯一原因是自动为您生成菜单。但是,这些更改可能不会经常发生,并且根据您的评论(首选顺序),您确实有一个特定的顺序。

最好的解决方案是手动指定排序顺序。这也将提高性能,因为服务器不必为每个请求

进行目录扫描

例如:

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

示例

app/Model/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 

}

【讨论】:

    猜你喜欢
    • 2012-12-07
    • 2013-12-11
    • 1970-01-01
    • 2017-08-29
    • 2020-08-18
    • 2021-04-28
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多