2012-12-06 134 views
0

我做了一個幫助程序,它返回給定頁面的URL。CakePHP 2.2.4:幫助使用組件/幫助器的簡單鏈接

助手文件:

public function PageURL($link = null, $category = null, $page = null){ 

      if($link){ 
       $link = strtolower(str_replace(' ', '-', $link)); 
       $page_url = "http://www.domain.com/$link"; 
      } 
      else{ 
       $page_url = "http://www.domain.com/$category/$page"; 
      } 
       return $page_url; 
     } 

(順便說一下,有一個變量,我可以代替使用http://www.domain.com如full_site_url,BASE_URL等?)

這是我的觀點看起來像當我將參數傳遞給幫手:

<?php echo $this->Html->link($page['Page']['title'], $this->Custom->PageuRL($page['Page']['link'], $page['Category']['directory'], $page['Page']['id'])); ?> 

這是很多寫的每一次。

我創建了一個組件,它提取我想要去的頁面的URL。它目前在AppController上實現,所以我可以很好地顯示當前頁面的URL,但我想在視圖內或助手內部使用它來顯示另一個頁面的URL。

public function TestPageURL($page = null) { 


App::uses('ClassRegistry', 'Utility'); 
$pagesModel = ClassRegistry::init('Page'); 
$matchedpage = $pagesModel->find('first', array(
    'conditions' => array('Page.id' => $page), 'recursive' => '0' 
)); 


     if($matchedpage['Page']['link']){ 
      $pagelink = strtolower(str_replace(' ', '-', $matchedpage['Page']['link'])); 
      $page_url = "http://www.domain.com/" . $pagelink; 
     } 
     else{ 
      $page_url = "http://www.domain.com/" . $matchedpage['Page']['Category']['directory'] . $matchedpage['Page']['id']; 

     } 

     return $page_url; 

} // end page url 

用這種方法,我只需要傳遞一個參數給組件。

我知道在助手中使用組件並不好,我不確定它是否允許在此版本的CakePHP中使用,但它會使創建鏈接變得更簡單。有誰知道我怎麼可以在助手中使用這個組件,或者讓助手以我只需要傳遞頁面變量的相同方式進行操作?

編輯:好吧,這對我很有用,它可能會被所有人都皺起眉頭,因爲它涉及到在助手中做查詢,但它真的簡化了事情。我會看看它是否會減慢我的網站。

我仍然對如何改善這一問題提出建議。

public function TestPageURL($page = null) { 


    $pagesModel = ClassRegistry::init('Page'); 
    $matchedPage = $pagesModel ->find('first', array(
     'conditions' => array('Page.id' => $page), 'recursive' => '1' 
    )); 

      if($matchedPage ['Page']['link']){ 
       $link = strtolower(str_replace(' ', '-', $matchedPage['Page']['link'])); 
       $page_url = "http://www.domain.com/$link"; 
      } 
      else{ 
       $page_url = "http://www.domain.com/" . $matchedPage['Page']['Category']['directory'] . '/' .$matchedPage['Page']['id']; 
      } 


      return $page_url; 

    } 

回答

0

我會建議在控制器中獲取數據時,在模型中創建的URL。順便說一下,您可以使用Router::url來檢索完整的基本網址。

實施例(未測試的)型號:

public function findPagesIncludingURLs() 
{ 
    $pages = $this->find('all'); // or whatever you want to retreive 

    $base = Router::url('/', true); 
    foreach($pages as &$page) 
    { 
     $url = null; 
     if($page['Page']['link']) 
     { 
      $url = strtolower(str_replace(' ', '-', $page['Page']['link'])); 
     } 
     else 
     { 
      $url = $page['Page']['Category']['directory'] . '/' . $page['Page']['id']; 
     } 

     $page['Page']['url'] = $base . $url; 
    } 

    return $pages; 
} 

控制器:

$this->set('pages', $this->Page->findPagesIncludingURLs()); 

檢視:

echo $this->Html->link($page['Page']['title'], $page['Page']['url']);