CodeIgniter - генерирует маршруты динамически - PullRequest
3 голосов
/ 29 апреля 2011

У меня есть сайт с динамическим навигационным меню. Я храню имена контроллеров (португальские) в базе данных вместе с переводом на английский.

Я хочу знать, возможно ли повлиять на массив 'route' во время выполнения, чтобы он создавал эти маршруты и кэшировал его при загрузке страницы.

Надеюсь, я достаточно ясно, спасибо за помощь

Ответы [ 5 ]

3 голосов
/ 29 апреля 2011

Помните, что файл маршрутов - это просто файл PHP, содержащий массив, поэтому, если вы хотите надеть свою футболку "Хакер", вы можете легко сделать что-нибудь немного грязное.

CMS / приложение / веб-приложение / холодильник-система мониторинга / что угодно иметь интерфейс, который создает и хранит записи в базе данных.Затем всякий раз, когда вы сохраняете, бросайте этот контент в application / cache / rout.php.

Наконец, у вас есть только ваши основные маршруты. Php включают в себя кэшированную версию, и все готово.

3 голосов
/ 29 апреля 2011

Да, вы можете посмотреть здесь:

2 голосов
/ 26 декабря 2013

Вы можете сделать это:

Создать таблицу с именем 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 ;

Создать файл в каталоге конфигурации с именем pdo_db_connect.php

Поместите это внутрь и изменитесоответственно.

<?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();
}

}

Теперь в вашем файле маршрутов вы можете сделать это:

<?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;
    }
2 голосов
/ 29 июля 2012

Вам нужно следующее.

Один такой контроллер, который будет сохранять ваши маршруты в файл с именем "rout.php" в папке application / cache:

public function save_routes()
        {

            // this simply returns all the pages from my database
            $routes = $this->Pages_model->get_all($this->siteid);

            // write out the PHP array to the file with help from the file helper
            if (!empty($routes)) {
                // for every page in the database, get the route using the recursive function - _get_route()
                foreach ($routes->result_array() as $route) {
                    $data[] = '$route["' . $this->_get_route($route['pageid']) . '"] = "' . "pages/index/{$route['pageid']}" . '";';
                }

                $output = "<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');\n";

                $output .= implode("\n", $data);

                $this->load->helper('file');
                write_file(APPPATH . "cache/routes.php", $output);
            }
        }

Вот вторая функция, которая вам понадобится. Этот и предыдущий оба войдут в контроллер вашего приложения, который обрабатывает ваши страницы:

// Credit to http://acairns.co.uk for this simple function he shared with me
// this will return our route based on the 'url' field of the database
// it will also check for parent pages for hierarchical urls
        private function _get_route($id)
        {
            // get the page from the db using it's id
            $page = $this->Pages_model->get_page($id);

            // if this page has a parent, prefix it with the URL of the parent -- RECURSIVE
            if ($page["parentid"] != 0)
                $prefix = $this->_get_route($page["parentid"]) . "/" . $page['page_name'];
            else
                $prefix = $page['page_name'];

            return $prefix;
        }

В вашей Странице_модели вам нужно что-то вроде этого:

function get_page($pageid) {
        $this->db->select('*')
            ->from('pages')
            ->where('pageid', $pageid);

        $query = $this->db->get();

        $row = $query->row_array();
        $num = $query->num_rows();

        if ($num < 1)
        {
            return NULL;

        } else {
            return $row;
        }
    }

А это:

function get_all($siteid) {
        $this->db->select('*')
            ->from('pages')
            ->where('siteid', $siteid)
            ->order_by('rank');
        ;

        $query = $this->db->get();

        $row = $query->row_array();
        $num = $query->num_rows();

        if ($num < 1)
        {
            return NULL;

        } else {
            return $query;
        }
    }

Каждый раз, когда создается страница, вам нужно будет выполнить эту строку, поэтому я предлагаю поместить ее в конец контроллера после того, как вся грязная работа сделана:

$this->save_routes();

Все это вместе создаст вам приятный файл маршрутов, который будет постоянно обновляться всякий раз, когда что-то меняется.

0 голосов
/ 28 июня 2017

Что-то не слишком сложное, и оно поддерживает дружественные URL-адреса:

внутри маршрутов.будет уникальным

Внутри вашего контроллера вы можете получить идентификатор:

    $id = $this->uri->rsegment(3);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...