2011-12-05 79 views
2

如何建立從類別和子類別的導航菜單,就像這樣:如何創建動態導航菜單的CakePHP

http://mysite/categories/view/1/2

我試過菜單生成器1.01,但它僅適用於ACL用戶。 我也讀過這tutorial,但它沒有幫助。

+0

你不unerstand我,, – user1080247

+2

這聽起來像你要找人來爲你的程序的菜單,是不是有可能你會收到一個答案在這裏的一個問題。這有點像問「我如何構建管理工具?」。 – Dave

回答

21

您的第一個鏈接不起作用。

坦率地說,我甚至不知道我明白你想要做什麼。您提供的第二個鏈接 - 我承認我只查看了第一個代碼段 - 不使用數據庫表。如果你希望你的菜單是動態的,就像在基於控制器的動作一樣,這是有道理的。如果你希望它是「動態的」,就像你想要對CRUD訪問的菜單項進行動態控制一樣(你知道CRUD代表什麼,對嗎?),這是一個不同的(真正簡單的)故事。

這是最基本的,可以想象的簡單的例子。在我的沙箱Cake 1.3.12安裝中,我在十五分鐘內從字面上把它們一起拍了下來。我很確定我得到了Cake 2的所有名稱,但是有些調整可能是必要的。我試圖削減絕對的基礎知識,並儘可能保持代碼的清晰。按照適合你的方式進行構建。請參閱食譜並記住隨時遵循Cake約定。

  1. 與像menus的名稱創建一個表。
  2. 創建一個名爲menu.php的模型。
  3. 創建MenusController.php
  4. 創建/Views/Menus目錄和/views/Elements/Menus

    CREATE TABLE menusid INT(11)無符號NOT NULL的auto_increment, name VARCHAR(255)NOT NULL默認 '', controller VARCHAR(255)NOT NULL, action VARCHAR(255)NOT NULL, created datetime NOT NULL, modified datetime default NULL, PRIMARY KEY(id) )ENGINE = InnoDB DEFAULT CHARSET = utf8;

型號代碼 - Menu.php:

<? 
class Menu extends AppModel { 
    var $name = 'Menu'; 
} 

控制器代碼 - MenusController.php:

<? 
class MenusController extends AppController { 
var $name = 'Menus'; 

function index() { 
    if (isset($this->params['requested']) && $this->params['requested'] == true) { 
     $menus = $this->Menu->find('all'); 
     return $menus; 
    } else { 
     $this->set('menus', $this->Menu->find('all')); 
    } 
} 

function add() { 
    if (!empty($this->data)) { 
     if ($this->Menu->save($this->data)) { 
      $this->Session->setFlash(__('The menu item has been saved', true)); 
     } 
    } 
} 

    // Build out additional CRUD functionality, 
    // for example edit/view/delete, as desired. 

} 

每MenusController行動需要在[動作名稱] .ctp文件/view/menus/

因此創建/views/menus/index.ctp/views/menus/add.ctp。你放入/views/menus/index.ctp的內容甚至不是非常重要,而/ views/menus/add。CTP是根據需要將用於增加新的菜單項形式:

<div class="menus form"> 
<?php echo $this->Form->create('Menu');?> 
    <fieldset> 
     <legend><?php __('Add Menu Item'); ?></legend> 
<?php 
    echo $this->Form->input('name'); 
    echo $this->Form->input('controller'); 
    echo $this->Form->input('action'); 
?> 
    </fieldset> 
    <?php echo $this->Form->end(__('Submit', true));?> 
</div> 

現在,創建/views/elements/menus/main.ctp

<ul class="header main-menu"> 
<? if (!isset($menus) || empty($menus)) : 
     $menus = $this->requestAction('/menus/index'); 
    endif; 
    foreach($menus as $menu) : 
?> 
    <li> 
    <?="<a href='".DS.$menu['Menu']['controller'].DS.$menu['Menu']['action']."'>".$menu['Menu']['name']."</a>"; ?> 
    </li> 
<? endforeach; ?> 
</ul> 

最後,將元素佈局所以它出現在無論哪個視圖,每一頁。如果您使用的是默認的蛋糕佈局,那意味着您應該編輯/views/layouts/default.ctp。你可能想把這個東西放在合適的地方,比如<div id="header">元素。插入element()電話如下:

<div id="header"> 
    <!-- whatever markup, code, etc. you may have in the header is fine. --> 
    <?= $this->element('menus/main'); ?> 
</div> 
<!-- ...the rest of your layout continues... --> 

這可能是必要的造型添加到您的元素,使之可讀。根據需要將樣式添加到您可能具有的任何樣式表(默認爲cake.generic.css)。

HTH。 The cookbook是你的朋友。

+0

感謝satywilder,實在不行我嘗試另一種東西,它做工精良 – user1080247

+2

我喜歡這個答案感謝 –

+0

人們簡單地說,它不工作,這是工作......我討厭這樣的人。 –