2011-04-28 146 views
2

我有一个带有动态导航菜单的网站。我将控制器(葡萄牙语)名称与翻译成英文的数据库保存在一起。CodeIgniter - 动态生成路由

我想知道是否有可能在运行时影响'路由'数组,因此它会创建这些路线并在页面加载时进行缓存。

我希望我很清楚,感谢您的帮助

回答

2

你可以这样做:

创建一个表命名路由

-- 
-- 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; 
    } 
+0

凯尔,我没有办法来测试这是我甚至用PHP的工作不再很长一段时间了。你测试过了吗?如果你告诉我你确定这段代码有效,我会接受你的答案,因为它似乎正是我要求的 – 2014-01-06 08:35:26

+1

是的,它有效,我有一个应用程序,即时通讯工作,使用它。 – jphreak 2014-01-06 23:57:56

3

记住路线文件只是一个包含数组的PHP文件,所以如果你想让你的“黑客”T恤上你可以轻松地做一些有点肮脏。

让你的CMS /应用程序/网络应用/冰箱监控系统/无论有一个接口,创建和存储数据库中的记录。然后,无论何时保存,将此内容放入application/cache/routes.php。

最后,你只需要你的主要routes.php包括缓存版本,你很好去。

2

您需要以下信息。像这样将您的路线保存到应用程序/缓存文件夹名为“routes.php文件”文件

一个控制器:

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; 
     } 

在你Pages_model你需要的东西沿着这条线:

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

东西并不复杂,它会持续友好的URL:

内routes.php文件中:

// Routes from the database 
require_once (BASEPATH .'database/DB.php'); 
$db =& DB(); 

// slug will be something like 
// 'this-is-a-post' 
// 'this-is-another-post' 
$sql = "SELECT id, slug FROM items"; 
$query = $db->query($sql); 

$result = $query->result(); 
foreach($result as $row) 
{ 
    // first is if multiple pages 
    $route["$row->slug/(:num)"] = "item/index/$row->id"; 
    $route["$row->slug"] = "item/index/$row->id"; 
} 

这个假设'id'作为主键,'slug'将是唯一的

内部控制器,可以通过获得ID:

$id = $this->uri->rsegment(3);