2012-04-20 14 views
0

私はコントローラ 'package'、関数 'tour_package'、パラメータ '1'を持つurlを持っています。 http://www.mysite.in/package/tour_packages/1 ここで、パラメータはidとして設定されています。これを達成するためにどのようにcodeigniterのpretty url設定

http://www.mysite.in/package/tour_packages/African

http://www.mysite.in/package/tour_packages/2 :私は、対応するURL文字列 http://www.mysite.in/package/tour_packages/American

など別の例でそれを変更する必要がありますか?

+0

ますが、新しいURLにリダイレクトして、それを変更するか、「アメリカ」と「アフリカ」の代わりに「1」と「2」を使用したいですか? – Patroklo

答えて

1

最初に私は使用するURLリンクを変更しますurl_title()(urlヘルパー)。データベースの呼び出しであると推定したIDのテキスト値を使用してクエリを作成すると、

のようになります(たとえば、id1のレコードがname = "America"の場合)。

echo 'http://www.mysite.in/package/tour-packages/'.url_title($name); 

となります。

http://www.mysite.in/package/tour-packages/American 

この拡張ルータクラスを追加すると、ダッシュが自動的に再フォーマットされ、下線が引かれます。

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 
class MY_Router extends CI_Router { 

    function set_class($class) { 
     $this->class = str_replace('-', '_', $class); 
    } 

    function set_method($method) { 
     $this->method = str_replace('-', '_', $method); 
    } 

    function _validate_request($segments) { 
     // Does the requested controller exist in the root folder? 
     if (file_exists(APPPATH.'controllers/'.str_replace('-', '_', $segments[0]).EXT)) { 
      return $segments; 
     } 
     // Is the controller in a sub-folder? 
     if (is_dir(APPPATH.'controllers/'.$segments[0])) {  
      // Set the directory and remove it from the segment array 
      $this->set_directory($segments[0]); 
      $segments = array_slice($segments, 1); 

      if (count($segments) > 0) { 
       // Does the requested controller exist in the sub-folder? 
       if (! file_exists(APPPATH.'controllers/'.$this->fetch_directory().str_replace('-', '_', $segments[0]).EXT)) { 
        show_404($this->fetch_directory().$segments[0]); 
       } 
      } else { 
       $this->set_class($this->default_controller); 
       $this->set_method('index'); 

       // Does the default controller exist in the sub-folder? 
       if (! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.EXT)) { 
        $this->directory = ''; 
        return array(); 
       } 

      } 

      return $segments; 
     } 

     // Can't find the requested controller... 
     show_404($segments[0]); 
    } 
} 

次に、ルートファイルにエントリを追加できます(config)。何かのようなもの;

$route['package/tour_package/(:any)'] = "package/lookup_by_name/$1"; 

その後、lookup_by_name($名)と呼ばれるパッケージコントローラにメソッドを作成する必要があります。 このメソッドは、名前値からIDを取得するデータベースに対してSQLクエリを実行する必要があります。その後、ビューをロードしたり、必要な操作を続けたりすることができます。

例えば

public function lookup_by_id($name) { 
    // sql to get id from database record 

    // load the view? 
    $this->view($id); 
} 

public function view($id) { 
    // sql to load full record from id 
    $this->load->view('foo', $data); 
} 
+0

IDを単に名前に置き換えているようだから、データベースに「slug」という列を追加して、それを 'url_title($ name)'に設定するだけではどうでしょう。そこからIDの代わりにスラッグを選択するだけです – danneth

+0

@dannethあなたの提案は有効ですが、レコードを選択するのは重要ではありません。私の答えは、ルックアップ付きのカスタムルートを使用する方法を示しています。 – Rooneyl

+0

それは実際にはきれいに見える、私はそれについて自分自身について考えたことはないだろう。 – danneth