星期五, 6月 18, 2010

利用Zend_Navigation達到Menu、breadcrumbs及sitemap

主要做法就是在xml裡配置階層結構
步驟就照著reference的範例做
不過有遇到些問題,所以有問題的地方有特別註釋

1.設定Bootstrap.php
protected function _initNavigation()
{
$this->bootstrap('layout');
$layout = $this->getResource('layout');
//$view = $layout->getView(); //加了這行...會導致在layout.phtml呼叫helper會掛...所以..註解掉...
$config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav'); //指定要讀取的架構檔,命名為navigation.xml

$container = new Zend_Navigation($config);
Zend_Registry::set("Zend_Navigation", $container); //範例裡沒加,但沒加又跑不動...怪...
//$view->navigation($container); //嗯...也是能動咧...
}

2.編寫階層結構xml
path: application/configs/navigation.xml (xml檔名取命跟Bootstrap裡load的地方一樣)
<?xml version="1.0" encoding="UTF-8"?>
<configdata>
<nav>
<home>
<label>Home</label>
<uri>/</uri>
</home>
<courses>
<label>球場管理</label>
<uri>/courses/</uri>
<pages>
<add>
<label>新增球場</label>
<uri>/courses/add/</uri>
</add>
<edit>
<label>編輯球場</label>
<uri>/courses/edit/</uri>
</edit>
</pages>
</courses>
<about>
<label>關於我們</label>
<uri>/index/about/</uri>
</about>
</nav>
</configdata>

3.設定layout.phtml
<body>
...
<?php echo $this->navigation()->Menu()?>
<?php echo $this->navigation()->breadcrumbs()->setLinkLast(false)->setMinDepth(0)->render(); ?>
...

4.設定Controller
在每個controller的init裡加上以下程式碼
public function init()
{
//navigation
$uri = $this->_request->getPathInfo(); //原作是寫這樣啦,不過遇到有參數的uri就噴了
$uri = $this->_request->getControllerName()."/". $this->_request->getActionName(); //我把比對的uri改成這樣,也不怕最後有沒有斜線結尾

$activeNav = $this->view->navigation()->findByUri(strtolower($uri)); //避免大小寫問題,全轉為小寫
$activeNav->active = true;
//$activeNav->setClass("active"); //uri沒配對到時 會出現error,所以...
}


錯誤訊息
$activeNav->setClass("active");
出現Fatal error: Call to undefined method stdClass::setClass() ...
是因為uri對應失敗,所以無法設定class為active

xml裡放網站根目錄是比較正確的做法
不應該把會變動的前置資料夾放在裡面 ex. project/public
只不過這樣會導致zend_navigation產生的鏈結會從根開始跑 就會找不到位置

比較好的做法應該是該鏈結加上$this->_request->getBaseUrl()."/"
只是不知從哪去改... echo前去改...應該有更好的方法...找到再po上來

另外一個問題是如果... 鏈結需有必要的參數...
就還得要再將參數組成uri...

Reference
Zend_Navigation – creating a menu, a sitemap and breadcrumbs 用錄影的 不錯...

沒有留言: