2011-08-10 4 views
1

私は、CakePHPを使用して簡単なポートフォリオを構築し、それはのようなURLがあるしている:私は何をしたいかdomain.com/portfolio/82/This_is_an_itemCakePHPの:フレンドリーインフレクタを使用して、URLとIDなし

と、URLからIDを削除しています。どうすればいい?ここで

は、ビューのための私のコントローラのコードです:

function view ($id, $slug) 
{ 
    $post = $this->Portfolio->read(null, $id)); 

    $this->set(compact('post')); 
} 

、ここでリンクジェネレータです:

<?php echo $this->Html->link($post['Portfolio']['title'], 
     array('admin' => false, 'controller' => 'portfolio', 'action' => 'view', $post['Portfolio']['id'], Inflector::slug($post['Portfolio']['title'])), 
     array('title' => $post['Portfolio']['title'])); ?> 

私はいくつかの並べ替えを行うには、コントローラのメソッドを変更する必要があります推測していますタイトルを見つける?

ご協力いただければ幸いです。ありがとう

答えて

1

idを完全に削除することはできますが、slugが一意であることを確認する必要があります(inUnique検証ルールはオプションです)。ポストを保存するとき、あなたがそのままタイトルを保持したい場合は、「スラグ」フィールドに保存することができます(「title」フィールド上Inflector::slug()を使用します。

$this->data['Portfolio']['slug'] = Inflector::slug($this->data['Portfolio']['title'])

function view ($slug){ 
    $post = $this->Portfolio->find('first', array('conditions'=>array('Portfolio.slug'=>$slug)))); 
    $this->set(compact('post')); 
} 

とリンクについて:

<?php echo $this->Html->link($post['Portfolio']['title'], 
    array('admin' => false, 'controller' => 'portfolio', 'action' => 'view', $post['Portfolio']['slug']), 
    array('title' => $post['Portfolio']['title'])); 
+0

これは良いですね。あなたは私がスラグを救う方法を私に見せてもらえますか?これを正しく行うには、データベースにタイトルフィールドとスラッグフィールドがありますか?乾杯 – Cameron

+0

私は答えを編集しました。そして2番目の質問にはい。それを叩いた後にタイトルを返せないからです。 –

2

私は、タイトルと一緒にデータベースにスラッグを保存します。そうすれば、一度しか作成する必要がありません。また、スラッグからタイトルへのユニークなリンクを得ることもできないこともあるので、試してみるのは最善の方法です。

簡単な処理のために、差し込み可能な動作を使用できます。https://gist.github.com/338096(またはGoogleのみ)を参照してください。

更新

あなたはhttps://gist.github.com/338096からSluggableビヘイビアを使用する場合は、あなただけのいくつかのステップ実行する必要があります(アプリ/モデル/行動のsluggable.phpとして保存):あなたのプロフィールでは

をモデルクラスの追加設定を上書きする場合var $actsAs = array('Sluggable');または

var $actsAs = array(
    'Sluggable' => array(
     'fields' => 'title', 
     'scope' => false, 
     'conditions' => false, 
     'slugfield' => 'slug', 
     'separator' => '-', 
     'overwrite' => false, 
     'length' => 256, 
     'lower' => true 
    ) 
); 

データベースで、slugという列をプロファイルテーブルに追加します。

プロファイルを保存すると、自動的にスラッグフィールドに塗りつぶしが追加されるため、特別な操作を行う必要はありません。

+0

どのように私のようなスラグを作成しますタイトル、それをDBに保存してからURLとして使用しますか?コード例は素晴らしいでしょう:)ありがとう – Cameron

+0

私はより多くの情報といくつかのコードで私の答えを更新しました。 – Arjan

+0

「slug」と呼ばれる新しい列に変曲したタイトルを保存して、それをURLとして使用するだけでいいですか?もしそうなら、どうやって邪魔にならないような行動をとる必要はありませんか? – Cameron