2009-10-11 37 views
3

我有以下db和php。我正在嘗試製作類別菜單的無序列表。 原始的php是獨立工作的。 我想將它轉換爲codeigniter中的MVC,以下是我到目前爲止並沒有工作。 如果有人能指出我做錯了什麼,我會很感激。如何從原生php轉換爲codeigniter

數據庫

CREATE TABLE IF NOT EXISTS `categories` (
    `id` int(11) NOT NULL auto_increment, 
    `name` varchar(255) NOT NULL, 
    `shortdesc` varchar(255) NOT NULL, 
    `longdesc` text NOT NULL, 
    `status` enum('active','inactive') NOT NULL, 
    `parentid` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ; 

-- 
-- Dumping data for table `categories` 
-- 

INSERT INTO `categories` (`id`, `name`, `shortdesc`, `longdesc`, `status`, `parentid`) VALUES (1, 'shoes', 'Shoes for boys and girls.', '', 'active', 7); 
INSERT INTO `categories` (`id`, `name`, `shortdesc`, `longdesc`, `status`, `parentid`) VALUES (2, 'shirts', 'Shirts and blouses!', '', 'active', 7); 
... 
... 

menu.php(原PHP和工作)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
    <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" /> 
    <title>View Tasks</title> 
</head> 
<body> 
<h3>Menu</h3> 
<?php 
function make_list ($parent) { 

    global $data; 
    echo '<ul>'; 

    foreach ($parent as $task_id => $todo) { 

     echo "<li>$todo"; 

     if (isset($data[$task_id])) { 

      make_list($data[$task_id]); 
     } 

     echo '</li>'; 

    } 
    echo '</ul>'; 

} 

$dbc = @mysqli_connect ('localhost', 'root1', 'root', 'ci_day6') OR die ('<p>Could not connect to the database!</p></body></html>'); 

$q = 'SELECT id, parentid, name FROM categories ORDER BY parentid ASC'; 
$r = mysqli_query($dbc, $q); 

$data = array(); 

while (list($id, $parentid, $name) = mysqli_fetch_array($r, MYSQLI_NUM)) { 

    $data[$parentid][$id] = $name; 

} 

make_list($data[0]); 

?> 

</body> 
</html> 

這個PHP輸出以下HTML

Menu 

    * clothes 
      o shoes 
      o shirts 
      o pants 
      o dresses 
    * fun 
      o toys 
      o games 

我的MVC到目前爲止,並沒有工作。

cat_menu_model.php(模型)

<?php 

class Cat_menu_model extends Model 
{ 
     function Cat_menu_model() 
     { 
      parent::Model(); 

     } 

     function get_categories_nav() 
     { 

      $data = array(); 
      $this->db->select('id,name,parentid'); 
      $this->db->where('status', 'active'); 
      $this->db->orderby('parentid','asc'); 
      $this->db->orderby('name','asc'); 

      $Q = $this->db->get('categories'); 
     if ($Q -> num_rows() > 0){ 
      foreach ($Q -> result_array() as $row){ 
      $data[$row['parentid']][$row['id']] = $row['name']; 
      } 
      } 

      $Q->free_result(); 
      return $data; 

     } 
} 

cat_menu.php(控制器)

<?php 

class Cat_menu extends Controller 
{ 

    function Cat_menu() 
    { 
     parent::Controller(); 
    } 
    function make_menu($parent) 
    { 
     $this->load->model('cat_menu_model'); 

     $data['navlist'] = $this->cat_menu_model->get_categories_nav(); 
      $this -> load ->view('menu'); 
    } 
} 

menu.php(視圖)

<?php 
if (count($navlist)) 
{ 
    $this->make_menu($data[0]); 
    echo '<ol>'; 
    foreach ($parent as $id => $catname) { 

     echo "<li>$catname"; 

     if (isset($data[$id])) { 

     make_menu($data[$id]); 

     } 

     echo '</li>'; 

    } 
echo '</ol>'; 
} 
?> 

它顯示一個錯誤消息。

A PHP Error was encountered 

Severity: Warning 

Message: Missing argument 1 for Cat_menu::make_menu() 

Filename: controllers/cat_menu.php 

Line Number: 10 

回答

4

鑑於上面的PHP錯誤信息,它是說你已經告訴方法Cat_menu :: make_menu()接受一個參數。在這種情況下,Cat_menu控制器中的功能make_menu($ parent)

如果此函數不需要任何輸入 - 看起來不像$ parent那樣 - 那麼只需從make_menu中刪除$ parent參數即可。

或者,如果您希望函數不接受任何參數,請設置一個默認值。請看下圖:

cat_menu.php(控制器)

<?php 

class Cat_menu extends Controller 
{ 

    function Cat_menu() 
    { 
     parent::Controller(); 
    } 

    function make_menu($parent = FALSE) //Is this $parent argument needed? 
    { 
     $this->load->model('cat_menu_model'); 

     $data['navlist'] = $this->cat_menu_model->get_categories_nav(); 

     //If you want to parse data to a view you need to state it 
     $this->load->view('menu', $data); 
    } 
} 

假設你的代碼的其餘部分是正確的,現在應該工作。從現在起請參閱CodeIgniter User Guide以供參考。特別是views documentation在解析值。


OP *從此在下面的評論作出迴應,這是我的迴應。

** OP =原始海報*

當運行在視圖的print_r($ navlist)。該OP得到以下的輸出:

Array ( 
    [0] => Array ( 
     [7] => clothes 
     [8] => fun 
    ) 
    [7] => Array ( 
     [3] => pants 
     [2] => shirts 
     [1] => shoes 
    ) 
    [8] => Array ( 
     [6] => games 
     [5] => toys 
    ) 
) 

然而,值得注意的是,OP的CI模型ActiveRecord的查詢比原來顯著不同 - 非MVC - 查詢:

SELECT 
    id, 
    parentid, 
    name 
FROM 
    categories 
ORDER BY 
    parentid ASC 

$this->db->select('id,name,parentid'); 
$this->db->where('status', 'active'); 
$this->db->orderby('parentid','asc'); 
$this->db->orderby('name','asc'); 
$Q = $this->db->get('categories'); 

CI模型查詢與最初的SQL不同。當轉換成SQL它會產生以下:

SELECT 
    id, 
    name, 
    parentid 
FROM 
    categories 
WHERE 
    status = 'active' 
ORDER BY 
    parentid ASC, 
    name ASC 

但是,似乎這就是被帶回正確的數據,所以我會繼續。

OP希望陣列格式化爲像heirarchy。以供參考,請參閱:PHP/MySQL - building a nav menu hierarchy。最簡單的方法是遵循OP的原始(非MVC)函數並將其添加爲模型函數。這個模型函數將創建一個嵌套數組,而不是直接的html輸出 - 原因是將應用程序邏輯與輸出分開。

您可以將以下內容添加到您的模型中作爲函數。最初從Nested sets, php array and transformation拍攝,但由於重新編寫,由於出現了OP的錯誤:

function to_hierarchy($collection = NULL) 
{ 
    if (is_null($collection)) return false; 

    $tree = array(); 

    foreach($collection[0] as $key => $value) 
    { 
     $tree[$value] = array(); 

     foreach($collection[$key] as $item) 
     { 
      array_push($tree[$value], $item); 
     } 
    } 

    return $tree; 
} 

現在我們可以更新我們的控制器是以下幾點:

cat_menu.php(控制器)

<?php 

class Cat_menu extends Controller 
{ 

    function Cat_menu() 
    { 
     parent::Controller(); 
    } 

    function make_menu($parent = FALSE) //Is this $parent argument needed? 
    { 
     $this->load->model('cat_menu_model'); 

     $get_nav_list = $this->cat_menu_model->get_categories_nav(); 

     $format_nav_list = $this->cat_menu_model->to_hierarchy($get_nav_list); 

     //Load the HTML helper for ul/ol conversion 
     $this->load->helper('html'); 

     $data['navlist'] = $format_nav_list; 

     //If you want to parse data to a view you need to state it 
     $this->load->view('menu', $data); 
    } 
} 

現在我們可以更新我們的觀點是如下:

menu.php(查看)

<?php 
    echo ul($navlist); 
?> 

免責聲明:沒有在使用PHP上面已經過測試,因爲我目前還沒有這臺計算機的訪問來解釋。請確保你檢查了任何語法。

+0

感謝您的回覆。我測試了它,輸出是Array Array Array。它不顯示菜單。 – shin 2009-10-11 15:35:11

+0

將您的看法改爲簡單閱讀: echo'

'.print_r($navlist).'
'; 由此您可以看到從您的模型函數創建了哪些輸出,並相應地更改您的視圖(或模型?)。 – KushalP 2009-10-11 15:37:51

+0

Array([0] => Array([7] => clothes [8] => fun)[7] => Array([3] => pants [2] => shirts [1] => shoes)[ 8] =>陣列([6] =>遊戲[5] =>玩具)) – shin 2009-10-11 15:42:22

1

您可能還會考慮查看ul() function in the built-in HTML helper,它可以讓您以遞歸方式在數組外部創建<ul>

+0

謝謝,但似乎這個幫手不適合這種情況。但我學到了新東西。 – shin 2009-10-11 15:36:36

0

此外,您沒有將數據傳遞到控制器中的視圖。 它應該是:

$ this - > load - > view('menu',$ data);

此外,它看起來像你會導致無限循環的方式,你現在建立。 make_menu加載menu.php視圖,但視圖調用該方法。