0

我正在使用 cakephp 2

我很难在 routes.php 中自定义我的路线。

所以就我而言,我有一个 Post 模型和一个 PostsController。索引操作列出了我的所有帖子,每个列出的帖子都是一个可点击的链接,可以转到我的显示操作。所以我的帖子>索引的“标准”路线是:“localhost/cakesite/posts/index”,对于翻译版本,它就像:“localhost/cakesite/eng/posts/index”。对应的修改路由为:“localhost/cakesite/news”和“localhost/cakesite/eng/news”。

现在对于 show 动作,它略有不同,因为我需要传递一些参数,例如 slug 和 id,所以它看起来像这样,无需修改其路由:“localhost/cake/posts/show/75/language:eng”。但我想得到类似:“localhost/cakesite/news/slug-id”和翻译版本:“localhost/cakesite/eng/news/slug-id”。这些都是我无法完成的路线。这个:“localhost/cakesite/news/slug-id”正在工作,但是当我将指针放在链接上时,我得到:“localhost/cake/posts/show/75”但是一旦我点击它,它就会重定向我出现在我的浏览器中的正确网址,例如:“localhost/cake/news/slug-75”。奇怪的是,在鼠标悬停时,重定向的 url 有不同的结果。

所以这是我到目前为止的路线:

// News index
Router::connect('/news',
    array('controller' => 'posts', 'action' => 'index')
    );
Router::connect('/:language/news',
    array('controller' => 'posts', 'action' => 'index'),
    array('language' => '[a-z]{3}','persist'=>array('language'))
    );

// News show
Router::connect('/news/:slug-:id',
    array('controller' => 'posts', 'action' => 'show'),
    array('pass' => array('id', 'slug'),
        'id' => '[0-9]+',
        'slug' => '[a-z0-9\-]+')
    );
Router::connect('/:language/news/:slug-:id',
    array('controller' => 'posts', 'action' => 'show'),
    array('pass' => array('slug','id'), 'language' => '[a-z]{3}', 'slug' => '[a-z0-9\-]+', 'id' => '[0-9]+')
    );

应用助手

class AppHelper extends Helper {

    public function url($url = null, $full = false) {
        if(!isset($url['language']) && isset($this->params['language'])) {
            $url['language'] = $this->params['language'];
        }
        return parent::url($url, $full);
    }
}

从索引到显示的实际链接

$lang=Configure::read('Config.language');
        echo $this->Html->link(
            $this->Html->tag('h1', $v['name_'.$lang], array('class' => 'news_titre')).' '.
            $this->Html->tag('span', $v['created'], array('class' => 'news_date')).' '.
            $this->Html->tag('div', '', array('class' => 'clear_float')).' '.
            $this->Html->tag('span', $this->Html->image("news/".$v['photo'], array( "alt" => $v['name_'.$lang])), array('class' => 'news_thumb')).' '.
            $this->Html->tag('p', $this->Text->truncate(strip_tags($v['content_'.$lang]), 297, array('ellipsis' => '...', 'exact' => false)), array('class' => 'news_contenu')),
            array('action' => 'show',$v['id']), array('class' => 'news_box', 'escape' => false));

我已经放置了 aboce 代码以显示与什么相关的内容,但如果您需要任何其他内容,请告诉我,我将编辑该帖子。那么,有人知道我做错了什么吗?

在此先感谢您的帮助!

4

1 回答 1

0

我认为你的路线大多是正确的。困扰您的是网址的显示。

根据您的最后一段代码,您对 url 进行封装的方式是使用类似的数组

$this->Html->tag( /* etc */, 
                  /*here's the redirection*/ array('action'=>'show', $id), /*etc*/)

尝试将该数组更改为此

$this->Html->tag( /* etc */, 
                  /*here's the redirection*/ array('action'=>'show', 
                                                   'id' => $id,
                                                   'slug' => $slug,
                                                   'language' => $language), /*etc*/)
于 2013-04-26T18:01:20.607 回答