2013-04-16 17 views
0

第一次!學習CodeIgniter - 相當於PHP包含

我正在學習Code Igniter,並且作爲我的第一個項目,我正在重寫CI中的現有站點。

在現有網站上,所有動態或靜態頁面均使用PHP include來加載sidebar.php,該頁面從數據庫的類別表中填充。

<div id="sidebar"> 
<?php 

$result = mysql_query('SELECT category_id, name, url FROM categories ORDER BY category_id ASC'); 

while ($row = mysql_fetch_array($result)) { 
$name=$row['name']; 
$url=$row['url']; 

print "<p><a href=\"category/$url\">$name</a></p>"; 

} 

?> 

</div> 

所以,現在我在CI開始,我計算過,要走的路是使與數據庫調用,一個側欄控制器,側邊欄視圖欄模型,然後加載在這個視圖默認頁面控制器。

因此,在/應用/型號我在應用中得到了sidebar_model.php

<?php 
class Sidebar_model extends CI_Model { 

public function __construct() 
{ 
    $this->load->database(); 
} 

public function get_categories() 
{ 
    $query = $this->db->get('categories'); 
    return $query->result();  
} 

} 

然後/控制器存在的sidebar.php

<?php 
class Sidebar extends CI_Controller { 

public function __construct() 
{ 
    parent::__construct(); 

} 

public function index() 
{ 
    $this->load->model('sidebar_model'); 

    $data['result'] = $this->sidebar_model->get_categories(); 

    $this->load->view('templates/sidebar_view', $data); 
} 


} 

然後在應用程序/視圖/模板有sidebar_view.php

<div id="sidebar"> 
<?php foreach($result as $row): ?> 

<p><?php echo $row['name'] ?></p> 

<?php endforeach ?> 
</div> 

這是從我的主頁控制器調用 -

<?php 

class Pages extends CI_Controller { 

public function view($page = 'home') 
{ 

    if (! file_exists('application/views/pages/'.$page.'.php')) 
    { 
     // Whoops, we don't have a page for that! 
     show_404(); 
    } 


    $data['title'] = ucfirst($page); // Capitalize the first letter 

    $this->load->view('templates/header', $data); 
    $this->load->view('pages/'.$page, $data); 
    $this->load->view('templates/sidebar_view', $data); 
    $this->load->view('templates/footer', $data); 

} 
} 

我有麻煩的是,雖然頁面控制器顯然是加載側邊欄視圖(盒與正確的CSS樣式顯示),它拋出了PHP錯誤。

A PHP Error was encountered 

Severity: Notice 

Message: Undefined variable: result 

Filename: templates/sidebar_view.php 

Line Number: 2 

任何人都可以在正確的方向指向我嗎?雖然只使用側邊欄的php include會很快捷,但它看起來並不像MVC的做事方式。

對於冗長的帖子道歉,並提前致謝!

回答

0

Pages控制器中的$ data數組需要有一個「結果」條目。傳遞給視圖的數組中的值被轉換爲局部變量以供在視圖中使用。您在側邊欄控制器中正確執行此操作(您並不需要)。

0

您加載Pages控制器和調用Sidebar控制變量$result獲取數據的視圖時Sidebar控制器將加載和要加載Pages控制器,你有pages控制器 加載的sidebar模型像

class Pages extends CI_Controller { 

public function view($page = 'home') 
{ 
    $this->load->model('sidebar_model'); 
    $data['result'] = $this->sidebar_model->get_categories(); 
if (! file_exists('application/views/pages/'.$page.'.php')) 
{ 
    // Whoops, we don't have a page for that! 
    show_404(); 
} 


$data['title'] = ucfirst($page); // Capitalize the first letter 

$this->load->view('templates/header', $data); 
$this->load->view('pages/'.$page, $data); 
$this->load->view('templates/sidebar_view', $data); 
$this->load->view('templates/footer', $data); 

} 
} 
0

如果您需要邊欄爲您的所有頁面,您可以以這種方式以一種好的方式進行操作,首先需要擴展MY_Controller,然後使用MY_Controller擴展所有控制器

MY_Controller投入應用核心目錄

<? 
MY_Controller extends CI_Controller{ 

    public $_sidebar = ''; 

    public function __construct() { 
     parent::__construct(); 
     $this->_sidebar = $this->sidebar(); 
    } 

    private function sidebar(){ 
     $this->load->model('sidebar_model'); 

     $data['result'] = $this->sidebar_model->get_categories(); 

     return $this->load->view('templates/sidebar_view', $data,TRUE); 
    }  

} 

現在你的頁面控制器

<?php 

class Pages extends MY_Controller { 

    public function __construct() { 
     parent::__construct(); 
    } 

public function view($page = 'home') 
{ 

    if (! file_exists('application/views/pages/'.$page.'.php')) 
    { 
     // Whoops, we don't have a page for that! 
     show_404(); 
    } 


    $data['title'] = ucfirst($page); // Capitalize the first letter 
    $data['sidebar'] = $this->_sidebar; 
    $this->load->view('templates/header', $data); 
    $this->load->view('pages/'.$page, $data); 
    $this->load->view('templates/footer', $data); 

} 
} 

現在你有側邊欄的變量,它會提供給你的控制器每次只在你主模板HTML定義側邊欄任何你想要的地方