codeigniter路由不能正确路由

时间:2014-12-18 10:04:29

标签: php codeigniter

我是codeigniter的新手,我现在正在做一个项目.. 我有一个控制所有页面的家庭控制器,它工作正常。 该网站包含一个文章页面,其中显示所有文章,如果有人点击阅读更多,它将重定向到文章详细信息页面

问题是,如果我点击文章页面上的阅读更多链接(例如:http://example.com/articles_details/2/sample-slug),它会自动重定向到http://example.com/articles_details/2 ....有人可以帮我修复此问题。

下面是我的项目文件的详细信息

文件夹结构

website_folder/ 
–––– application/
---------- controllers/
---------------- admin/
---------------- home.php
---------- views/
---------------- templates/
--------------------- articles.php
--------------------- article_details.php
---------------- _main_layout.php
–––– assets/ 
–––– system/ 
---- .htaccess 
–––– index.php

家庭控制器

class Home extends Frontend_Controller 
{
    function __construct()
    {
        parent::__construct();
    }   

    public function index()
    {
        $slug = $this->uri->segment(1) ? $this->uri->segment(1) : 'home';
        $this->data['page'] = $slug;

        $method = '_'.$slug;

        if(method_exists($this,$method))
        {
            $this->$method();
        }
        else
        {
            show_error('Could not load template '.$method); 
        }

        $this->data['subview'] = $slug;

        $this->load->view('components/page_head');
        $this->load->view($layout,$this->data);
        $this->load->view('components/page_tail');
        $this->load->view('components/'.$script); 
    }

    private function _home()
    {
        //fetch datas to be shown in homepage
    }

    private function _articles()
    {
        //fetch datas to be shown in article page
    }

    private function _article_details()
    {
        //fetch datas to be shown in article detail page
        $aid = $this->uri->segment(2);
        $query =  $this->db->query("select * from articles where id = ".$aid);
        $this->data['articledetails'] = $query->row();
        count($this->data['v']) || show_404(uri_string());
        $rslug = $this->uri->segment(3);
        $sslug = $articledetails->slug;
        if($rslug != $sslug)
        {
            redirect('article_details/'.$aid.'/'.$sslug,'location','301');
        }
    }

}

routes.php文件

$default_controller = "home";
$controller_exceptions = array('admin');

$route['default_controller'] = $default_controller;
$route["^((?!\b".implode('\b|\b', $controller_exceptions)."\b).*)$"] = $default_controller.'/index/$1';
$route['404_override'] = '';

Htaccess文件

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php/$1 [L,QSA]
</IfModule>

articles.php(观看文件)

<div id="articles">
<?php if($pagination) echo $pagination; ?>
<ul class="articles">
  <?php 
  if(count($articles)) 
  {
      foreach($articles as $val)
      {
      ?>
      <li>
      <h2><?php echo $val->heading; ?></h2> 
      <p><?php echo truncate(strip_tags($val->details),200); ?></p>
      <a href="article_details/<?php echo $val->id."/".$val->slug; ?>" target="_blank">[ Read More ]</a>
      </li>  
      <?php 
      }
  }
  else
  {
      echo '<li><strong>No records found..</strong></li>';
  }
  ?>
</ul>
</div>

articles_details.php(观看文件)

var_dump($articledetails);

2 个答案:

答案 0 :(得分:0)

您应该有一个名为article_details的控制器或在您的主控制器中,将函数定义为article_detailsindex(如存在)。但是不要通过函数控制所有东西,而你可以拥有很多东西。

所以正确的方法是你应该有一个index函数,然后获取行然后将它传递给视图来显示它。

在您看来

foreach($articles as $i){
        echo '<a href="'.site_url('{your_controller}/article_details/').$i->id.'/'.$val->slug.'" target="_blank">[ Read More ]</a>';
    }

在控制器中,定义一个名为article_details的函数。它将是公共的,您可以处理文章ID并获取详细信息并将其传递给视图。

答案 1 :(得分:0)

作为CI 2.2.0,以下划线_

开头的方法或函数
  

“..不会通过网址请求提供..”

have a look here, and find PRIVATE FUNCTIONS

这里的逻辑问题是您为什么要将VISIBLE 控制器/方法重定向到HIDDEN?你将无法访问任何东西,因为你想要隐藏在第一位。

删除下划线并将属性更改为public。如果你想正确访问int。

或者您可能有拼写错误或忘记在您所关注的教程中输入内容。