3

我有一个名为 article 的模块。它存在于以下文件夹中:

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

因为我正在制作一个CMS。我选择不使用直接链接到控制器或操作。这意味着调用 example.com/article/article/index。不会工作。由于 CMS 将 url 请求视为页面。(所以它会寻找一个名为 'index' 的页面,其中包含父级 'article' 和 'article'。这样的页面不存在。

CMS 为有效页面加载块,对于其中一个块,我想执行文章模块。我尝试使用

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

但是,为此,您需要一条路线。

是否可以运行这样的模块,以使模块的工作方式与访问 url example.com/article/article 相同?

或者,如果这是不可能的。如何设置 Url Manager 以便它可以处理页面?使用干净的 URL。这里有些例子:

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

以上是用户可以创建和更改的页面。我已经为此苦苦挣扎了很长时间。通常这将是一件容易的事情。但是 Yii 很难做到。主要是因为控制器或模块链接到路由。

4

2 回答 2

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文件中:

重写引擎开启

如果目录或文件存在,直接使用:

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

...否则转发给index.php

重写规则。索引.php
于 2013-03-22T13:37:19.393 回答
1

您可以将所有内容路由到文章控制器。Yii 使用的规则是从上到下的,所以首先定义一些具体的规则,最后定义一些类似于包罗万象的规则。这应该有效:

// 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'

在文章操作中,您可以使用 pass 做任何您想做的事情$_GET['ariticlePath']

旁注:为避免内容的双重索引,我建议使用 meta canonical,因此一些可能带有查询字符串的虚假 URL 或某些用户可能输入的任何内容,不会被谷歌视为重复内容。

编辑:正如烧酒所建议的,articlePath也可以绑定为动作参数:

...
public function actionArticle($articlePath)
...
于 2013-03-22T15:16:40.230 回答