CakePHP 1.3:使用Route获取以下URL格式/ news / 06/27/12 / slug-slug-slug

时间:2012-06-28 03:00:34

标签: cakephp

所有

我目前在我的应用程序中设置了slug,我生成以下链接:

http://www.domain.com/article/my-first-news-article

除了view使用slug代替id之外,这是我用来实现这一目标的当前路线:

Router::connect('/article/*',array('controller' => 'articles', 'action' => 'view'));

但是,我希望通过将已发布的日期添加到URL中来进行更多改进,如下所示:

http://www.domain.com/article/2012/06/27/my-first-news-article

我从CakePHP手册中获得了以下代码,但它似乎不起作用:

        Router::connect(
        '/article/:year/:month/:day/:slug',
        array(
              'controller' => 'articles',
              'action' => 'view'
        ),
        array(
            'year' => '[12][0-9]{3}',
            'month' => '0[1-9]|1[012]',
            'day' => '0[1-9]|[12][0-9]|3[01]'
        )
    );

为此,我真的不在乎将什么日期传递给视图。我只关心通过的slu ..然后我将使用function view($slug)查找文章并显示它。但是,网址必须为http://www.domain.com/2012/06/27/slug-slug-slug

谢谢....

3 个答案:

答案 0 :(得分:1)

$ this-> Html-> link()调用如何在您要在链接中使用日期的地方显示?

您是否在那里添加了所需的参数?

$this->Html->link('Article', array('year' => 2012, 'month' => 01, 'day' => 01, 'action' => 'view', 'slug' => $article['Article']['slug']));

答案 1 :(得分:1)

为了完整起见,并且因为其他人可能也对此感兴趣,我将向您展示我对类似问题的解决方案:

我想要格式为

的网址
http://mydomain.com/blog/2012/06/slug-slug-slug

即。 /博客/ YYYY / MM /蛞蝓

为此,我使用

// view a post by year and month and title
Router::connect('/blog/:year/:month/:title/*', array(
  'controller' => 'posts',
  'action' => 'view'
), array(
  'year' => '[12][0-9]{3}',
  'month' => '0[1-9]|1[012]',
  'title' => '[a-z0-9-]+'
));

根据以下规则,您可以确保输入正确的格式。它还可以防止用户输入& " %等值作为slugs。

标题之后的/ *甚至允许其他参数,例如对于分页,当您的博客条目有多个页面(http://mydomain.com/blog/2012/06/slug/page:2)时。

我也意识到设置"传递"数组并不是必需的(至少在CakePHP 2.0中)。您可以通过$ this - >直接访问参数。请求 - > params [' year']等。

答案 2 :(得分:0)

经过更多的研究和试验,我能够弄明白。

以下路线可以接受这样的网址:

http://www.mydomain.com/article/2009/06/10/my-first-article-in-mydomain-dot-com

事实上,设置日期并不重要,它仍然有用。它也可能是,

http://www.mydomain.com/article/06/10/2012/my-first-article-in-mydomain-dot-com

Router::connect(
        '/article/:year/:month/:day/:slug',
        array(
              'controller' => 'articles',
              'action' => 'view'
        ),
        array(
            'pass' => array('slug')
        )   
    );