2013-03-13 26 views
0

如何更改文件系統中文件的順序?我正在使用Fetch。如何更改服務器上文件的順序?

我問的原因是因爲我有一個菜單欄,通過「pages」文件夾中的內容自動列出我的網站中的頁面。我在提取時看到它的方式是按照字母順序「blog.ctp,games.ctp,home.ctp,news.ctp」。所以我期望菜單欄將頁面列爲「博客遊戲首頁新聞」,而是將它們列爲「遊戲新聞博客首頁」。最終,我希望訂單成爲「主頁遊戲博客新聞」。如何更改文件的順序?

這是我的代碼,以防它有用。但我的代碼不是問題......我只需要知道如何更改文件夾「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>'; 

    } 
} 
+0

在這裏看到:[排序和顯示目錄列表按字母順序使用執行opendir()在PHP(http://stackoverflow.com/questions/884974/sort-and-display-directory-list-alphabetically-using- opendir在php) – 2013-03-13 09:45:07

+0

馬特我想要一個自定義的排序,而不是按字母順序。我只是提出了一個意見,我認爲他們會按字母順序默認,但是我的表達他們是以其他順序。 – 2013-03-13 11:31:13

回答

1

在開頭或結尾爲文件名添加優先級標誌。即GAMES_1,HOME_2 ... etc ...使用PHP sort()排序文件名數組,並使用substr($ filename,-2)替換文件名中的最後兩個字符。

+0

這是一個很好的解決方法,謝謝。我仍然想知道是否可以簡單地手動更改文件的順序。我不希望文件的名稱來定義順序,我想要訂單來定義順序。 – 2013-03-13 11:34:42

+0

這個解決方案可以讓你設置手動命令給你的文件名,給你更多的靈活性。 – 2013-03-13 11:37:18

+0

我知道你的答案會起作用,如果需要我會實現它,但是改變文件名將打破cakephp約定,所以我寧願不這樣做。我想簡單地將我想要被讀取的文件拖到文件列表的頂部,導致PHP首先讀取第一個文件,第二個文件第二個,等等......但是Fetch不讓我點擊並拖動文件以手動更改訂單。如果無法通過Fetch或其他方法執行此操作,我將執行您的工作,因爲這是一個很好的解決方案。 – 2013-03-13 11:43:04

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。由於讀取文件實際上是「檢索數據」,因此您可能需要爲此創建一個未連接到數據庫表的模型。

示例

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 

} 
相關問題