Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CodeIgniter - Generate routes dynamically

i have a website with a dynamic navigational menu. I keep the controller (portuguese) names in a database, together with the translation to english.

I want to know if it is possible to affect the 'route' array at runtime, so it would create those routes and cache it when the page is loaded.

I hope I was clear enough, thanks for the help

like image 596
André Alçada Padez Avatar asked Mar 03 '26 03:03

André Alçada Padez


2 Answers

You could do this:

Create a table named Routes

--
-- Table structure for table `Routes`
--

CREATE TABLE IF NOT EXISTS `Routes` (
`idRoutes` int(11) NOT NULL AUTO_INCREMENT,
`Order` int(11) NOT NULL,
`Url` varchar(250) NOT NULL,
`Url_Variable` varchar(20) NOT NULL,
`Class` text NOT NULL,
`Method` text NOT NULL,
`Variable` text NOT NULL,
`Date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
   PRIMARY KEY (`idRoutes`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=67 ;

Create a file in the config directory named pdo_db_connect.php

Put this inside and change accordingly.

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

function pdo_connect(){

try{

    // Include database info
    include 'database.php';

if(!isset($db)){
    echo 'Database connection not available!';
        exit;
}   
        $dbdriver   = $db['default']['dbdriver'];//'mysql'; 
        $hostname   = $db['default']['hostname'];//'localhost';
        $database   = $db['default']['database'];//'config';
        $username   = $db['default']['username'];//'root';
        $password   = $db['default']['password'];//'password';

    //to connect
    $DB = new PDO($dbdriver.':host='.$hostname.'; dbname='.$database, $username, $password);
    return $DB;

}catch(PDOException $e) {
    echo 'Please contact Admin: '.$e->getMessage();
}

}

Now in your routes file you can do this:

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
    // Include our PDO Connection
    include('application/config/pdo_db_connect.php');

    class dynamic_route{

        public $pdo_db = FALSE;

        public function __construct(){

        }
        private function query_routes(){
            try{

            $routes_query = $this->pdo_db->query('SELECT * FROM Routes ORDER BY `Order` ASC');

            if($routes_query){
                $return_data = array(); 
                foreach($routes_query as $row) {
                    $return_data[] = $row; 
                }
                return $return_data;

            }

            }catch(PDOException $e) {
                echo 'Please contact Admin: '.$e->getMessage();
            }

        }
        private function filter_route_data($data){

            $r_data = array();
            foreach($data as $row){
                $return_data = new stdClass;

                if(empty($row['Url_Variable']) ){
                    $return_data->url = $row['Url'];
                }else{
                    $return_data->url = $row['Url'].'/'.$row['Url_Variable'];
                }

                if(empty($row['Method']) && empty($row['Variable']) ){
                    $return_data->route = $row['Class'];

                }elseif(!empty($row['Method']) && empty($row['Variable']) ){
                    $return_data->route = $row['Class'].'/'.$row['Method'];
                }elseif(!empty($row['Method']) && !empty($row['Variable']) ){
                    $return_data->route = $row['Class'].'/'.$row['Method'].'/'.$row['Variable'];
                }

            $r_data[] = $return_data;
            }
            return $r_data;
        }
        public function get_routes(){
            $route_data = $this->query_routes();
            $return_data = $this->filter_route_data($route_data);
            return $return_data;
        }       

    }

    $dynamic_route = new dynamic_route;
    // Give dynamic route database connection
    $dynamic_route->pdo_db = pdo_connect();
    // Get the route data
    $route_data = $dynamic_route->get_routes();
    //Iterate over the routes
    foreach($route_data as $row){
        $route[$row->url] = $row->route;
    }
like image 146
Kyle Coots Avatar answered Mar 04 '26 17:03

Kyle Coots


Remember that the routes file is just a PHP file that contains an array, so if you want to get your "Hacker" t-shirt on you could easily do something a little bit dirty.

Have your CMS/application/web-app/fridge-monitoring-system/whatever to have an interface which creates and stores records in a database. Then whenever you save, throw this content into application/cache/routes.php.

Lastly you just have your main routes.php include the cached version and you're good to go.

like image 24
Phil Sturgeon Avatar answered Mar 04 '26 18:03

Phil Sturgeon