2013-03-22 71 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

相关问题