0

私はcakephp 2を使用しています

routes.php でルートをカスタマイズするのに苦労しています。

私の場合、Post モデルと PostsController があります。index アクションはすべての投稿を一覧表示し、一覧表示された各投稿はクリック可能なリンクで、show アクションに移動します。したがって、posts>index の「標準」ルートは「localhost/cakesite/posts/index」で、翻訳版は「localhost/cakesite/eng/posts/index」のようになります。対応する変更されたルートは、「localhost/cakesite/news」および「localhost/cakesite/eng/news」です。

slug や id などのパラメーターを渡す必要があるため、show アクションの場合は少し異なります。そのため、ルートを変更しないと、"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。マウスオーバーすると、リダイレクトされた 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の表示です。

コードの最後のビットによると、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 に答える