如何在Codeigniter中进行路由

如何在Codeigniter中进行路由,codeigniter,routing,Codeigniter,Routing,我在CI中遇到路由问题 我有一个控制器,其参数支持类别和子类别 category$1/subcategory$2 我想出了这样的条目,但它们不太管用 $route['(:any)'] = 'ads/cat/$1'; $route['(:any)/(:any)'] = 'ads/cat/$1/$2'; $route['(:any)/(:any)/(:num)'] = 'ads/cat/$1/$2/$3'; 在我添加分页之前,一切都正常-$3 我的意思是分页仅适用于category/

我在CI中遇到路由问题

我有一个控制器,其参数支持类别和子类别

category$1/subcategory$2
我想出了这样的条目,但它们不太管用

$route['(:any)'] = 'ads/cat/$1';   
$route['(:any)/(:any)'] = 'ads/cat/$1/$2';   
$route['(:any)/(:any)/(:num)'] = 'ads/cat/$1/$2/$3';
在我添加分页之前,一切都正常-
$3

我的意思是分页仅适用于
category/subcategory/10…
但当我打开
category/10
时,它将10视为第二个参数,而不是分页

如何让它工作

这是我的控制器的代码:

public function cat( $cat_alias, $subcat_alias = null)
    {
        $this->load->library('pagination');
        $limit = 10 ;

        if (!empty($subcat_alias)) {
        $start = ($this->uri->segment(3)) ? $this->uri->segment(3) : 0;
        }
        else 
        {
        $start = ($this->uri->segment(2)) ? $this->uri->segment(2) : 0;
        }

        if (isset($_GET['city'])) 
        {
        $city = $_GET['city'];

        }

        $where = array( 'catalogue' => $cat_alias );
        $ad_category = $this->Site_model->get_single( 'categories' , $where );
        $children = $this->Site_model->get_childrens($ad_category->id);

        foreach ($children as $child) 
        {
            $childs[] = $child->id;
        }


        if ( !empty( $ad_category ) )
        {

            if (!empty($subcat_alias)) 
                {

                $where = array( 'catalogue' => $subcat_alias );
                $ad_category2 = $this->Site_model->get_single( 'categories' , $where );

                $data['meta']['title'] = $ad_category2->title;
                $data['meta']['desc'] = $ad_category2->description;

                $where = array('category_id' => $ad_category2->id);

                }

                else
                {

                $where = array( 'category_id' => $childs );
                $data['meta']['title'] = $ad_category->title;
                $data['meta']['desc'] = $ad_category->description;
                }

            $ads = $this->Site_model->get( 'ads' , $where, $limit, $start );
            $data['counter'] = $this->Site_model->get_count( 'ads' , $where);


            if ( !empty( $ads ) )
            {

                foreach ( $ads as $ad )
                {
                    $ad_ids[] = $ad->id;
                }
                $where = array( 'id' => $ad_ids );

            if (!empty($city)) 
                {
                $wher = array( 'slug' => $city );
                $ad_city = $this->Site_model->get_single( 'cities' , $wher );


                $where_filter['city_id'] = $ad_city->id; 
                $data['ads'] = $this->Site_model->filter('ads', $where, $where_filter, $limit, $start);



                }
                else
                {

                $data['ads'] = $this->Site_model->get( 'ads' , $where, $limit, $start );

                }


if (!empty($subcat_alias)) {
        $config['base_url'] = site_url(''.$cat_alias.'/'.$subcat_alias.'');
        $config['uri_segment'] = 3;
    }
    else
    {
        $config['base_url'] = site_url(''.$cat_alias.'/');
        $config['uri_segment'] = 2;
    }
        $config['total_rows'] = $data['counter'];
        $config['use_page_numbers'] = TRUE;
        $config['per_page'] = 10;
        $config['full_tag_open'] = '<div class="pagination"><ul>';
        $config['full_tag_close'] = '</ul></div>';
        $config['first_link'] = false;
        $config['last_link'] = false;
        $config['first_tag_open'] = '<li>';
        $config['first_tag_close'] = '</li>';
        $config['prev_link'] = '&larr;';
        $config['prev_tag_open'] = '<li class="prev">';
        $config['prev_tag_close'] = '</li>';
        $config['next_link'] = '&rarr;';
        $config['next_tag_open'] = '<li>';
        $config['next_tag_close'] = '</li>';
        $config['last_tag_open'] = '<li>';
        $config['last_tag_close'] = '</li>';
        $config['cur_tag_open'] =  '<li class="active"><a href="#">';
        $config['cur_tag_close'] = '</a></li>';
        $config['num_tag_open'] = '<li>';
        $config['num_tag_close'] = '</li>';


        $this->pagination->initialize($config);
        $data['pagination'] = $this->pagination->create_links();

        $data['categories'] = $this->Site_model->get_categories();
        $data['current'] = $this->uri->segment(1);
        // $data['meta']['title'] = $ad_category->title;
        // $data['meta']['desc'] = $ad_category->description;
        $this->load->view( 'cat' , $data );

            }
            else
            {
                $this->session->set_flashdata( 'alert' , 'Aktualnie brak ogłoszeń w tej kategorii.' );
                 redirect( '/' );
            }

        }
        else
        {
            $this->session->set_flashdata( 'alert' , 'Niepoprawna nazwa kategorii.' );
             redirect( '/' );            
        }



    }
公共函数cat($cat\u别名,$subcat\u别名=null)
{
$this->load->library('pagination');
$limit=10;
如果(!空($subcat_别名)){
$start=($this->uri->segment(3))?$this->uri->segment(3):0;
}
其他的
{
$start=($this->uri->segment(2))?$this->uri->segment(2):0;
}
如果(isset($_GET['city']))
{
$city=$_GET['city'];
}
$where=数组('catalog'=>$cat\u别名);
$ad_category=$this->Site_model->get_single('categories',$where);
$children=$this->Site\u model->get\u childrens($ad\u category->id);
foreach($childrenas$child)
{
$childs[]=$child->id;
}
如果(!空($ad_类别))
{
如果(!空($subcat_别名))
{
$where=数组('catalog'=>$subcat\u别名);
$ad_category2=$this->Site_model->get_single('categories',$where);
$data['meta']['title']=$ad_category2->title;
$data['meta']['desc']=$ad_category2->description;
$where=array('category\u id'=>$ad\u category2->id);
}
其他的
{
$where=数组('category_id'=>$childs);
$data['meta']['title']=$ad_category->title;
$data['meta']['desc']=$ad_类别->说明;
}
$ads=$this->Site\u model->get('ads',$where,$limit,$start);
$data['counter']=$this->Site\u model->get\u count('ads',$where);
如果(!空($ads))
{
foreach($ads作为$ads)
{
$ad_id[]=$ad->id;
}
$where=数组('id'=>$ad_id);
如果(!空($city))
{
$wher=数组('slug'=>$city);
$ad_city=$this->Site_model->get_single('cities',$wher);
$where_filter['city_id']=$ad_city->id;
$data['ads']=$this->Site\u model->filter('ads',$where,$where\u filter,$limit,$start);
}
其他的
{
$data['ads']=$this->Site\u model->get('ads',$where,$limit,$start);
}
如果(!空($subcat_别名)){
$config['base_url']=site_url('.$cat_alias./'.$subcat_alias.');
$config['uri_段]]=3;
}
其他的
{
$config['base_url']=site_url('.$cat_alias.'/');
$config['uri_segment']=2;
}
$config['total_rows']=$data['counter'];
$config['use_page_number']=TRUE;
$config['per_page']=10;
$config['full_tag_open']='
    '; $config['full_tag_close']='
'; $config['first_link']=false; $config['last_link']=false; $config['first_tag_open']='
  • '; $config['first_tag_close']='
  • ; $config['prev_link']='&larr;'; $config['prev_tag_open']='
  • '; $config['prev_tag_close']='
  • ; $config['next_link']='&rarr;'; $config['next_tag_open']='
  • '; $config['next_tag_close']='
  • ; $config['last_tag_open']='
  • '; $config['last_tag_close']='
  • ; $config['cur_tag_open']='
  • ; $config['num_tag_open']='
  • '; $config['num_tag_close']='
  • ; $this->pagination->initialize($config); $data['pagination']=$this->pagination->create_links(); $data['categories']=$this->Site_model->get_categories(); $data['current']=$this->uri->segment(1); //$data['meta']['title']=$ad_category->title; //$data['meta']['desc']=$ad_类别->说明; $this->load->view('cat',$data); } 其他的 { $this->session->set_flashdata('alert','Aktualnie brak ogłoszeńw tej kategorii'); 重定向(“/”); } } 其他的 { $this->session->set_flashdata('alert','nieprawna nazwa kategorii'); 重定向(“/”); } }
    我猜您的控制器看起来像这样:

    function cat($category, $subcategory, $pagination){...}
    
    您需要稍微更改它,以便它可以检测第二个参数是否为分页,如下所示:

    function cat($category, $subcategory, $pagination=null)
    {
        if($pagination == null && is_numeric($subcategory)) $pagination = $subcategory;
        //your code
    }
    

    如果
    $category&$subcategory
    是字符串,这将起作用,但如果它们是数字(ID),则需要更多检查

    问题是我使用Codeigniter中内置的分页库,我不知道如何使用$pagination==null的条件。请将控制器粘贴到您的问题,所以我可以更新我的答案这是我的控制器。很抱歉造成混乱,但我只是在学习。@gambi我怀疑你把这个答案错当成了你的问题,所以我投票反对你对这个答案的编辑,继续为你编辑你的问题。如果我错误地解释了此处发生的情况,请道歉。您只需将
    if(!empty($subcat_alias))
    行修改为
    if(!empty($subcat_alias)&!ctype_digit((string)$subcat_alias))
    行,该行仅在
    $cat_alias&&$subcat_alias
    为字符串而非数字/id时才有效