2009-10-11 36 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视图,但视图调用该方法。