2017-07-28 23 views
2


ここでは少しガイダンスが必要です。私はCodeigniter 3を使用しています。 セグメントルーティングではMVC fwなので、どのようにレコードのnameが表示されるカスタムルートを作成することができるかを知りたい(カテゴリ、製品、投稿など)データベースからid/nameの代わりにid segmentが必要です。データベースから返されるか、またはプレビューする必要があるレコードを特定するには、idが必要です。Codeigniterを上書きする方法IDと名前の代わりにちょうど名前を表示するためのルート

コントローラ

class Categories extends CI_Controller 
{ 
    function __construct() 
    { 
     parent::__construct(); 
     $this->load->model('CategoryM'); 
    } 

    public function index(){ 
     $data = array(
      'category_list' => $this->CategoryM->listAll() 
      ); 

     $this->load->view('test/category_list', $data); 
    } 

    public function preview() 
    { 
     $categoryId = $this->uri->segment(2); 

     $data = array (
      'previewByCategory' => $this->CategoryM->previewByCategory($categoryId) 
      ); 

     $this->load->view('public/preview_by_category', $data); 
    } 

モデル

<?php 

    class CategoryM extends CI_Model { 

     public function listAll() { 

      $query = $this->db 
      ->select('*') 
      ->from('categories') 
      ->where('parentid', NULL, TRUE) 
      ->order_by('name', 'asc') 
      ->get(); 

      if($query->num_rows() > 0) { 
       return $query->result(); 
      }else{ 
       return false; 
      } 

      public function previewByCategory($categoryId=''){ 

       $query = $this->db 
       ->select(/* posts and categories data */) 
       ->from('categories') 
       ->join('posts', 'posts.categoryID = categories.id', 'left') 
       ->where('categories.id', $categoryId) 
       ->get(); 
       if($query->num_rows() > 0){ 
        return $query->result(); 
       }else{ 
        return false; 
       } 
      } 

     } 

ビュー

<?php if($category_list):?> 
    <?php foreach($category_list as $category):?> 
     <h3> 
      <a href="<?php echo base_url() . strtolower(url_title($category->name) . '/' . $category->id);?>"> 
       <?php echo $category->name;?> 
      </a> 
     </h3> 
    <?php endforeach;?> 
<?php endif;?> 

マイルート

私はいくつかのコード例を掲載します私が欲しい

// Category routes 
$route['categories'] = 'categories/index'; 
$route['(:any)/(:num)'] = 'categories/preview/$1'; 

は、そのカテゴリのグループからすべての製品を一覧表示されますちょうど

www.mywebsite/categoryname 

を表示する代わりに、ルート

www.mywebsite/categoryname/categoryid/ 

です。しかし、どのようにURLでIDなしでこれを行うには。私の質問が広すぎるとすみません。前もって感謝します。

+0

もののみ –

+0

どのように意味ユニークである場合は、この 'categoryname'を行うことができますか? IDなしのカテゴリ名の値に基づいてデータをフェッチするには? – Goran

答えて

2

Codeigniterでは、ルートでのデータベースアクセスを取得できません。
ただし、データベースインスタンスを手動で作成することはできます。

カテゴリコントローラでroutes.phpの

$slug= ($this->uri->segment(1)) ? $this->uri->segment(1) : false; 
if($slug){ 
    //include your database 
    require_once(BASEPATH."/database/DB.php"); 
    $db=& DB(); 
    $category = $this->db 
       ->select('name') 
       ->from('categories') 
       ->where('parentid', NULL, TRUE) 
       ->where('name',$slug) 
       ->get()->row(); 
    if($category){ 
    //$category->name must be unique in database 
    $route[$category->name] = 'categories/index'; 
    } 

} 

class Categories extends CI_Controller 
{ 
    function __construct() 
    { 
     parent::__construct(); 
     $this->load->model('CategoryM'); 
    } 

    public function index(){ 
     echo $category_name=$this->uri->segment(1); 
    } 
} 

URL

WWW。名前がMyWebSite /区分名

//if categoryname exist in category 

出力:

カテゴリ名

+0

私はIDと名前の値を混在させてカスタムスラッグを作っていましたが、ルートでdbをロードしようとしたことはありませんでした。ありがとう – Goran

2

まず、列としてカテゴリテーブルに追加する必要があります。具体的には、URIとして妥当性が確認されるurl_titleです。その後、私はこれがあなたのために働くだろう願っていますあなたのroute.php

// Category routes 
$route['categories'] = 'categories/index'; 
$route['(:any)'] = 'categories/$1'; // $1 pass the utl_title value to Categories/preview($url_title) 

とあなたのコントローラ

public function preview($url_title=null) { 
    $categoryId = $this->uri->segment(2); 

    $data = array (
     'previewByCategory' => $this->CategoryM->previewByCategory($url_title) 
     ); 

    $this->load->view('public/preview_by_category', $data); 
} 

し、モデル

public function previewByCategory($url_title=''){ 
    $query = $this->db 
    ->select(/* posts and categories data */) 
    ->from('categories') 
    ->join('posts', 'posts.categoryID = categories.id', 'left') 
    ->where('categories.url_title', $url_title) 
    ->get(); 
    if($query->num_rows() > 0){ 
     return $query->result(); 
    }else{ 
     return false; 
    } 
} 

を変更する必要があります。私はそれをテストしていないので、私の投稿されたコードは構文エラーがあることに注意してください。

関連する問題