Как конфертировать из родного php в codeigniter - PullRequest
3 голосов
/ 11 октября 2009

У меня есть следующие дБ и 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; 

        }
}

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

Ответы [ 3 ]

4 голосов
/ 11 октября 2009

Учитывая приведенное выше сообщение об ошибке PHP, оно говорит, что вы сказали методу Cat_menu :: make_menu () принять аргумент. В этом случае функция make_menu ($ parent) в контроллере Cat_menu .

Если эта функция не требует ввода - не похоже, что используется $ parent - просто удалите аргумент $ parent из make_menu.

В качестве альтернативы, установите значение по умолчанию, если вы хотите, чтобы функция не принимала аргументы. Смотрите ниже:

cat_menu.php (Controller)

<?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) в представлении. ОП получает следующий вывод:

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

Однако стоит отметить, что запрос ActiveRecord модели CI OP значительно отличается от исходного запроса (не 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

Однако, похоже, что верные данные возвращаются, поэтому я продолжу.

ОП хотел бы, чтобы массив был отформатирован как иерархия. Для дальнейшего использования, пожалуйста, смотрите: PHP / MySQL - построение иерархии навигационного меню . Самый простой способ сделать это - следовать исходной функции OP (не MVC) и добавить ее в качестве функции модели. Эта функция модели создаст вложенный массив, а не прямой вывод 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 (Просмотр)

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

Отказ от ответственности: Ничто из вышеперечисленного не было проверено с использованием PHP, так как в настоящее время у меня нет доступа к переводчику с этого компьютера. Пожалуйста, убедитесь, что вы проверили любой синтаксис.

1 голос
/ 11 октября 2009

Вы также можете рассмотреть функцию ul() во встроенном HTML-помощнике , которая позволяет рекурсивно создавать <ul> из массива.

0 голосов
/ 11 октября 2009

Кроме того, вы не передаете данные представлению в контроллере. должно быть:

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

также, похоже, что вы создали бы бесконечный цикл, как вы сейчас его настроили. make_menu загружает представление menu.php, но затем представление вызывает этот метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...