6

As I know the Wordpress has is_home() function to determine home page.
In YII i use solution like this Yii check if homepage

In CI, templates actually, i faced many times with necessity of it. For example, adding some css classes in tag <body>.

All what i found http://ellislab.com/forums/viewthread/194637/#916899
Can anybody help me or write own solution?

Thank in advance

Community
  • 1
  • 1
Andrei Zhamoida
  • 1,457
  • 1
  • 20
  • 30
  • 3
    Well, I would suggest defining to yourself what "home" means. Is it a request URI of '/' or some other URI. If so, it should be quite simple to check the request URI to see if it matches. – Mike Brant May 06 '13 at 16:24
  • no offence but Laravel makes this silly things so easier.... it probably has the best router mechanism among php frameworks. ;) – itachi May 06 '13 at 17:08

6 Answers6

21

I just wanted to add my answer here as the other method doesn't work with my heavily modified version of CI.

This snippet is what I use to detect if we are on the homepage

if (!$this->uri->segment(1)) {
    // We are on the homepage
}
Adam
  • 1,957
  • 3
  • 27
  • 56
5

You can use $this->router->fetch_class() to get the current controller and $this->router->fetch_method() to get the method too if needed.

So similar to the Yii example you linked to, you could do something like

$is_home = $this->router->fetch_class() === 'name_of_home_controller' ? true : false;

Or to match method too

$is_home = ($this->router->fetch_class() === 'name_of_home_controller' && $this->router->fetch_method() === 'name_of_home_method') ? true : false;

This way even if the page url is http://yoursite.com/ (assuming the home controller+method is the default), http://yoursite.com/home_controller/, http://yoursite.com/something/that/routes/to/home/controller/, etc, as long as it's calling that controller, it'll set $is_home to true.

Edit: Also you can use ($this->router->fetch_class() === $this->router->default_controller) if you don't want to explicitly state the home controller and it's set to the default controller.

Update for CI v3:
$this->router->fetch_class() and $this->router->fetch_method() were deprecated in CI v3. Use $this->router->class and $this->router->method instead.

Samutz
  • 2,310
  • 4
  • 24
  • 29
1
if($this->uri->uri_string() == ''){ 
echo"You are on homepage"; 
}
nixis
  • 510
  • 5
  • 10
1

If you don't have a custom helper create one; otherwise inside any of your custom helper file just paste any of the following code snippets and you should be able to use is_home() from any location in Codeigniter.

function is_home()
{
   $CI =& get_instance();
   return (!$CI->uri->segment(1))? TRUE: FALSE;
}

OR

function is_home()
{
  $CI =& get_instance();
  return (strtolower($CI->router->fetch_class()) === $CI->router->default_controller  && $CI->router->fetch_method() === 'index') ? true : false;
}
black_belt
  • 6,601
  • 36
  • 121
  • 185
1

For better answer you should cover 2 routes for home page:

I assumes there is default controller like this in routes.php:

$route['default_controller'] = 'home';
  • Your home page without default controller name(like: yoursite.com)
  • Your home page with controller name(like: yoursite.com/home)

    if(!$this->uri->segment(1) || $this->uri->segment(1)=='home'){ 
        // YOU ARE ON THE HOME
    }
    
0

Why not just simply

public function name_of_home_method()
    {
        $data['is_home'] = true;
    }
Srok
  • 37
  • 4