2013-03-22 78 views
3

我有一個名爲article的模塊。它存在於collowing文件夾中:在沒有路由的情況下執行Yii模塊

- protected 
     - modules 
      - article 
       - controllers 
        ArticleController.php 
       - views 
         -article 
      articleModule.php 

因爲我在製作CMS。我選擇不使用直接鏈接到控制器或操作。這意味着調用example.com/article/article/index。不行。由於CMS將URL請求視爲頁面。 (所以它尋找一個名爲'索引'的頁面,其中包含父項'article'和'article'。這樣的頁面不存在。

CMS爲有效頁面加載塊,並且爲其中一個塊加載執行該文章的模塊。我試圖用

Yii::app()->runController($route). 

然而,對於這一點,你需要的路線。

是否有可能運行一個模塊,這樣使該模塊的工作方式相同要去網址的例子。 com/article/article?

或者如果那是不可能的。 o我設置了Url管理器,以便它可以處理頁面?與乾淨的網址。以下是一些示例:

example.com/join_us 
example.com/join_us/contact 
example.com/news/ 
example.com/countries/us/healthcare 

以上是用戶可以創建和更改的頁面。很久以來我一直在與此搏鬥。通常這將是一件容易的事情。但Yii很難。主要是因爲控制器或模塊鏈接到路線。

+0

這不是真的清楚自己想要什麼。是否所有的URL只能從一個動作提供(在'modules/article'中)?如果不是,應排除哪些網址? – 2013-03-22 11:58:21

+0

向我們展示您的urlManager規則 – soju 2013-03-22 12:24:18

+0

@MichaelHärtlHarti 使用get參數標準索引操作和所有其他操作 – Minahalmon 2013-03-23 08:09:47

回答

1

把這個在您的主要配置:

'urlManager'=>array(
    'urlFormat'=>'path', 
     'showScriptName'=>false, 
     'caseSensitive'=>false, 
    'rules'=>array(
     'gii'=>'gii', 
     '<controller:\w+>/<id:\d+>'=>'<controller>/view', 
     '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>', 
     '<controller:\w+>/<action:\w+>'=>'<controller>/<action>', 
     '<action>'=>'site/<action>', 
    ), 
), 

這在.htaccess文件:

 
RewriteEngine on 

如果一個目錄或文件是否存在,直接使用它:

 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 

...否則轉發給index.php

 
RewriteRule . index.php 
+0

@Virtlink爲什麼你評價我的回答 – Gunnit 2013-03-22 14:31:48

+0

是的,爲什麼我會這樣?我不知道,一定是別人。我只編輯它。 – Virtlink 2013-03-22 14:34:15

+0

@Virtlink感謝您的建議。像about_us這樣的鏈接現在轉到siteController中的一個動作。並且現在我需要在siteController中執行一個操作。子頁面也不能像join_us/contact那樣工作。你能解釋一下這個想法嗎?再次感謝您的答覆。我試圖實現的是運行模塊,如果它們存在於該文件夾中。否則,發送一個url和sub url到一個標準的控制器讓我們說siteController。這將檢查它是否是有效頁面。這是我目前的想法。 – Minahalmon 2013-03-23 08:33:18

1

您可以將所有內容都路由到文章控制器。 Yii使用從上到下的規則,所以首先定義一些特定的規則,最後像catch-all規則。這應該工作:

// Url manager rules 
// Some of example non-article rules 
'login' => 'userModule/user/login' 
'logout' => 'userModule/user/login' 
// Below regex rule catch any string and pass it to $_GET['ariticlePath'] 
// and executes action `article` of controller `article` of module `article` 
'<ariticlePath:.+>' => 'article/article/article' 

在文章的行動,你可以做任何你想通過$_GET['ariticlePath']

邊注:爲了避免內容索引的兩倍,我建議使用元canonical,因此與查詢字符串或者其他一些用戶可能進入,有些可能是僞造的網址將不被視爲由谷歌複製的內容。

編輯:作爲燒酒sugested,articlePath也可以被綁定爲行動PARAM:

... 
public function actionArticle($articlePath) 
... 
+1

+1,但不要使用'$ _GET ['articlePath']',你只需要添加'$ articlePath'參數到你的控制器動作函數 – soju 2013-03-22 15:51:28

+0

不錯,似乎是一個新功能,因爲我正在閱讀基礎知識:) – 2013-03-22 17:55:17

+0

還在忙着讓他上班。我已經把上面的三條規則寫進去了。並將我的(。*)規則移除到pageController。但它現在進入登錄頁面。因爲這是它的第一條規則。我試圖填充index.php /?articlepath = get。但現在它轉到由siteController處理的標準Yii歡迎視圖 – Minahalmon 2013-03-23 08:18:03

相關問題