tags:

views:

350

answers:

3

I am not able to load models to the extended My_Router class in codeigniter. Below is my code:

class MY_Router extends CI_Router {

    function MY_Router()
    {
        parent::CI_Router();
    }

    function _validate_request($segments)
    {
        // Does the requested controller exist in the root folder?
        if (file_exists(APPPATH.'controllers/'.$segments[0].EXT))
        {
            return $segments;
        }

        // Is the controller in a sub-folder?
        if (is_dir(APPPATH.'controllers/'.$segments[0]))
        {
            // Set the directory and remove it from the segment array
            $this->set_directory($segments[0]);
            $segments = array_slice($segments, 1);

            if (count($segments) > 0)
            {
                // Does the requested controller exist in the sub-folder?
                if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments[0].EXT))
                {
                    show_404($this->fetch_directory().$segments[0]);
                }
            }
            else
            {
                $this->set_class($this->default_controller);
                $this->set_method('index');

                // Does the default controller exist in the sub-folder?
                if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.EXT))
                {
                    $this->directory = '';
                    return array();
                }

            }
            return $segments;
        }

        // Let's check if there are category segments
    $category_routes = $this->category_routing($segments);
        if($category_routes !== FALSE)
    {
            return $category_routes;
        }
    $user_routes = $this->user_routing($segments);
    if($user_routes != FALSE)
    {
        return $user_routes;
    }

        show_404($segments[0]);
    }

    function category_routing($segments)
    {
        $this->load->model('category_model');
        if($this->category_model->category_exist($segments[0]))
        {
            //if only category
            if(count($segments)==1)
            {
                return array('category', 'category_browse', $segments[0]);  
            }
            //category pagination
            if(count($segments)==2 and is_numeric($segments[1]))
            {
                return array('category','category_browse', $segments[0], $segments[1]); 
            }
            //category upcoming
            if(count($segments)==2 and $segments[1] == 'upcoming')
            {
                return array('category','upcoming', $segments[0]);  
            }
            //category upcoming pagination
            if(count($segments)==3 and $segments[1] == 'upcoming' and is_numeric($segments[3]))
            {
                return array('category','upcoming', $segments[0], $segments[3]);    
            }
            //category top
            if(count($segments)==3 and $segments[1] == 'top')
            {
                return array('category','top', $segments[0], $segments[2]); 
            }
            //category top pagination
            if(count($segments)==4 and $segments[1] == 'top' and is_numeric($segments[3]))
            {
                return array('category','top', $segments[0], $segments[3]); 
            }
        }
        return FALSE;   
    }

    function user_routing($segments)
    {
        $this->load->model('dx_auth/users', 'user_model');
        if($this->user_model->check_username($segments[0]))
        {
            //only profile
            if(count($segments)==1)
            {
                return array('user','profile',$segments[0]);    
            }
            //all friends
            if(count($segments)==2 and $segment[1]=='allfriends')
            {
                return array('user','allfriends',$segments[0]); 
            }
            //all subscribers
            if(count($segments)==2 and $segment[1]=='allsubscribers')
            {
                return array('user','allsubscribers',$segments[0]); 
            }
            //all subscription
            if(count($segments)==2 and $segment[1]=='allsubscriptions')
            {
                return array('user','allsubscriptions',$segments[0]);   
            }
        }
        return FALSE;
    }
}

I have tried loading the models by using get_instance function provided by codeigniter but seems like it doesnot work. All i need is load the models in extended system library.

A: 

When using the base CodeIgniter class in external Libraries you have to invoke it again like this:

// load it
$CI =& get_instance();
$CI->load->model('model_name');

//use it
$CI->model_name->method()

Hope that helps

James F
He is doing this in the Router, using get_instance() that early on will cause a fatal error.
Phil Sturgeon
yes Phil is right i found a way out what i did was included the db config and connected to my database using php myslq functions and could access database. i am posting my code here. may be it would be helpful to some one trying to do it.
askkirati
A: 

There is no access to the CodeIgniter super-global until CI_Base has been called which is extended by Controller. The Controller class then loads the Loader library:

    // In PHP 5 the Loader class is run as a discreet
    // class.  In PHP 4 it extends the Controller
    if (floor(phpversion()) >= 5)
    {
        $this->load =& load_class('Loader');
        $this->load->_ci_autoloader();
    }

The Router is loaded very on (have a look in system/codeigniter/CodeIgniter.php to see exactly when, on line 99) so has barely anything available.

You can use load_class('Whatever'); to load classes in a different order, but this can really screw with things if you are not careful, and you still wont have access to the database drivers.

Basically, you can't do it this way. You would need to try and directly work with the database library or use native MySQL bindings to access your data.

Phil Sturgeon
Thanks Phil see my answer below, It worked that way.
askkirati
Using native MySQL bindings was my suggestion. You owe me a point ;-)
Phil Sturgeon
A: 

Here is what i did and it worked..Thanks phil for suggestion.

class MY_Router extends CI_Router {

function MY_Router()
{
    parent::CI_Router();
}

function _validate_request($segments)
{
    // Does the requested controller exist in the root folder?
    if (file_exists(APPPATH.'controllers/'.$segments[0].EXT))
    {
        return $segments;
    }

    // Is the controller in a sub-folder?
    if (is_dir(APPPATH.'controllers/'.$segments[0]))
    {
        // Set the directory and remove it from the segment array
        $this->set_directory($segments[0]);
        $segments = array_slice($segments, 1);

        if (count($segments) > 0)
        {
            // Does the requested controller exist in the sub-folder?
            if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments[0].EXT))
            {
                show_404($this->fetch_directory().$segments[0]);
            }
        }
        else
        {
            $this->set_class($this->default_controller);
            $this->set_method('index');

            // Does the default controller exist in the sub-folder?
            if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.EXT))
            {
                $this->directory = '';
                return array();
            }

        }
        return $segments;
    }

    // Let's check if there are category segments
    $category_routes = $this->category_routing($segments);
    if($category_routes !== FALSE)
    {
        return $category_routes;
    }
    $user_routes = $this->user_routing($segments);
    if($user_routes !== FALSE)
    {
        return $user_routes;
    }

    show_404($segments[0]);
}

function category_routing($segments)
{
    if($this->check_category_exist($segments[0]))
    {
        //if only category
        if(count($segments)==1)
        {
            return array('category', 'category_browse', $segments[0]);  
        }
        //category pagination
        if(count($segments)==2 and is_numeric($segments[1]))
        {
            return array('category','category_browse', $segments[0], $segments[1]); 
        }
        //category upcoming
        if(count($segments)==2 and $segments[1] == 'upcoming')
        {
            return array('category','upcoming', $segments[0]);  
        }
        //category upcoming pagination
        if(count($segments)==3 and $segments[1] == 'upcoming' and is_numeric($segments[3]))
        {
            return array('category','upcoming', $segments[0], $segments[3]);    
        }
        //category top
        if(count($segments)==3 and $segments[1] == 'top')
        {
            return array('category','top', $segments[0], $segments[2]); 
        }
        //category top pagination
        if(count($segments)==4 and $segments[1] == 'top' and is_numeric($segments[3]))
        {
            return array('category','top', $segments[0], $segments[3]); 
        }
    }
    return FALSE;   
}

function check_category_exist($cat_name)
{
    //connect to database and find the category
    include(APPPATH.'config/database'.EXT);
    $conn = mysql_connect($db['default']['hostname'],$db['default']['username'],$db['default']['password']);
    mysql_select_db($db['default']['database'],$conn);
    $sql = sprintf("SELECT COUNT(id) as count FROM categories WHERE permalink = '%s'", mysql_real_escape_string($cat_name));
    $query = mysql_query($sql);
    $row = mysql_fetch_object($query);
    mysql_close($conn);
    if($row->count)
    {
        return TRUE;
    }
    return FALSE;
}

function user_routing($segments)
{
    if($this->check_username_exist($segments[0]))
    {
        //only profile
        if(count($segments)==1)
        {
            return array('user','profile',$segments[0]);    
        }
        //all friends
        if(count($segments)==2 and $segments[1]=='allfriends')
        {
            return array('user','allfriends',$segments[0]); 
        }
        //all subscribers
        if(count($segments)==2 and $segments[1]=='allsubscribers')
        {
            return array('user','allsubscribers',$segments[0]); 
        }
        //all subscription
        if(count($segments)==2 and $segments[1]=='allsubscriptions')
        {
            return array('user','allsubscriptions',$segments[0]);   
        }
    }
    return FALSE;
}

function check_username_exist($username)
{
    //connect to database and find the category
    include(APPPATH.'config/database'.EXT);

    $conn = mysql_connect($db['default']['hostname'], $db['default']['username'], $db['default']['password']);
    mysql_select_db($db['default']['database'],$conn);
    $sql = sprintf("SELECT COUNT(id) as count FROM users WHERE username = '%s'", mysql_real_escape_string($username));
    $query = mysql_query($sql);
    $row = mysql_fetch_object($query);
    mysql_close($conn);
    if($row->count)
    {
        return TRUE;
    }
    return FALSE;
}

}

askkirati