У меня есть следующие db и php. Я пытаюсь сделать неупорядоченный список меню категорий. Оригинальный php работает сам по себе. Я пытаюсь преобразовать это в MVC в 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; } }
по<?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; } }
по<?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
Учитывая сообщение об ошибке PHP выше, он говорит, что вы сказали метод Cat_menu :: make_menu (), чтобы принять аргумент. В этом случае функция make_menu ($ parent) в контроллере Cat_menu .
Если эта функция не требует ввода – не выглядит так, как используется $ parent, то просто удалите аргумент $ parent из make_menu.
Кроме того, установите значение по умолчанию, если вы хотите, чтобы функция не принимала никаких аргументов. Смотри ниже:
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 . В частности, документация представлений по разбору значений.
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 ) )
Тем не менее, стоит заметить, что запрос ActiveRecord модели CI модели существенно отличается от исходного запроса – не 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');
по$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');
по$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 хотел бы, чтобы массив был отформатирован как иерархия. Для дальнейшего использования см.: PHP / MySQL – создание иерархии навигационного меню . Самый простой способ сделать это – следовать за исходной (не MVC) функцией OP и добавить ее в качестве функции модели. Эта модельная функция создаст вложенный массив, а не прямой вывод html – причина этого заключается в том, чтобы отделить логику приложения от вывода.
Вы можете добавить в свою модель как функцию. Первоначально взятый из вложенных наборов, php-массива и преобразований, но так как переписан из-за ошибок, появляющихся для 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 (View)
<?php echo ul($navlist); ?>
Отказ от ответственности: ни одно из указанных выше не было протестировано с использованием PHP, поскольку у меня нет доступа к интерпретатору с этого компьютера. Убедитесь, что вы проверяете какой-либо синтаксис.
Вы также можете рассмотреть функцию ul()
во встроенном HTML-помощнике , который позволяет рекурсивно создавать <ul>
из массива.
Кроме того, вы не передаете данные в представление в контроллере. должен быть:
$ this -> load -> view ('menu', $ data);
Кроме того, похоже, что вы создадите бесконечный цикл так, как вы его настраиваете. make_menu загружает представление menu.php, но тогда вызов вызывает этот метод.