gn90at
gn90at

Reputation: 29

CodeIgniter - dynamic pages - default controller url

edit

my solution in routes.php:

$route['news'] = 'news_controller';
$route['gallery'] = 'gallery_controller';
$route['(:any)'] = 'sites/$1';

and in my site conroller:

function index($site_id = '') {
  //sanitize $site_id.
  $this->site = $this->sites_model->get_site($site_id);
  //etc.
}

THX to YAN

question:

so i wrote a little CMS with CodeIgniter. The admin can create sites. the site opens automatically when the segment of the url is like one in the DB. eg mysite.com/sites/about will call the "About" site. this works fine.

now i got a problem with my URL. i want this url

http://www.mysite.com/sites/about

turns to this:

http://www.mysite.com/about

the problem is, that i cannot use the routes.php and set wildcards for each site. (because they are dynamic and i dont know wich site the customer will create - and i dont want to edit the routes.php file for each site he will create - this should be done automatically)

the problem is i got other fix controllers too, like news, gallery or contact: mysite.com/news, mysite.com/gallery, ...they work fine

so here is my Site Controller:

class Sites extends Public_Controller {

public $site;
public $url_segment;

public function _remap($method)
{
    $this->url_segment = $this->uri->segment(2);

    $this->load->model('sites_model');
    $this->site = $this->sites_model->get_site($this->url_segment);

    if($this->site !== FALSE)
    {
        $this->show_site($this->site);
    }
    else
    {
        show_404($this->url_segment);
    }
}

public function show_site($data)
{
    $this->template->set('site', FALSE);
    $this->template->set('site_title', $data['name']);
    $this->template->set('content',$data['content']);
    $this->template->load('public/template','sites/sites_view', $data);
}}

and this is the Site_model who checks the database...if the url_segment fits the title in the DB:

class Sites_model extends CI_Model {

public function get_site($site_url)
{
    if($site_url != ""){
        $this->db->where('name', $site_url);
        $query = $this->db->get('sites', 1);

        if($query->num_rows() > 0){
            return $query->row_array();
        }
        else
        {
            return FALSE;
        }
    }else{
        return FALSE;
    }
} }

i think i need something who checks if the controller exists (the first segment of the url) when not call the Site controller and check if the site is in the DB and when this is false then call 404.

any suggestions how this can be solved?

btw: sry for my english

regards GN

Upvotes: 1

Views: 4913

Answers (2)

Yan Berk
Yan Berk

Reputation: 14428

You can handle routes.php in the following way, just keep the (:any) value last:

$route['news'] = 'news_controller';
$route['gallery'] = 'gallery_controller';
$route['(:any)'] = 'sites/$1';

In your sites controller route to the specific site using the data from the URL.

function index($site_id = '') {
    //sanitize $site_id.
    $this->site = $this->sites_model->get_site($site_id);
    //etc.
}

Upvotes: 2

wallyk
wallyk

Reputation: 57774

I am having trouble understanding the full intent of the question, but, from what I can tell, don't you simply need to add:

if ($this->uri->segment(1) != 'sites')
     ... // handle malformed URL

Upvotes: 1

Related Questions