Intereting Posts
Решение о дизайне: соответствие кириллических символов в JSON с PHP Структура приложения facebook с минимальными вызовами api Извлечь doctype с помощью simple_html_dom переместить элементы массива на основе условия в php Symfony 2.8: Doctrine getManagerForClass () не возвращает правильный Entity Manager Реляционный API: where () не может определить столбец, используя классы с именами Запрос ОЧЕНЬ медленный (> 30 секунд) в php, но быстрый при запуске запроса в phpmyadmin Получить вкладку вкладки браузера / идентификатор Неустранимая ошибка: вызов неопределенной функции mysqli_connect () в … при подключении PHP 5.4.22 и MySQL 5.5 с Apache 2.4.7 Проверьте, начинается ли переменная с 'http' setcookie, Невозможно изменить информацию заголовка – уже отправленные заголовки Как запустить это регулярное выражение на PHP, которое анализирует полный адрес электронной почты с именем? Является ли php 5.4 безопасным без Suhosin? php mysql: выбрать из базы данных и заполнить форму Проблема вывода PHP и CSS

Как конвертировать из родного php в codeigniter

У меня есть следующие 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, но тогда вызов вызывает этот метод.