CodeIgniter yerli php dönüştürmek için nasıl

3 Cevap php

I have the following db and php. I am trying to make a unordered list of category menu. The original php is working by itself. I am trying to convert this to MVC in codeigniter and the following is what I got so far and not working. If someone can point out what I am doing wrong, I will appreciate it.

Veritabanı

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 (orijinal php ve çalışma)

<!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>

Bu php çıkış aşağıdaki html

Menu

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

Benim MVC kadar ve çalışmıyor.

cat_menu_model.php (model)

<?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 (kontrolör)

<?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 (görünüm)

<?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>';
}
?>

Bu bir hata mesajı gösterir.

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 Cevap

Yukarıdaki PHP hata mesajı göz önüne alındığında, bir argümanı kabul etmek Cat_menu :: make_menu () yöntemini söyledim söylüyormuş. Bu durumda, işlev make_menu($parent) Cat_menu denetleyicisi.

Bu fonksiyon herhangi bir giriş gerektirmiyorsa - $ ebeveyn kullanılır gibi görünmüyor - sonra sadece make_menu dan $ ana argümanı kaldırın.

Eğer argümanları hiçbir kabul etmek işlevini istiyorsanız Alternatif olarak, varsayılan bir değer. Aşağıya bakın:

* Cat_menu.php (Kontrolör) *

<?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);
    }
}

Kodunuzu kalanını varsayarsak doğru olduğunu, bu şimdi çalışmalıdır. Artık referans için CodeIgniter User Guide bakın. Özellikle views documentation arasında değerleri ayrıştırma.


OP* has since responded in the comments below, this is my response.

* OP = Original Poster

Görünümünde print_r ($ navlist) çalıştırırken. OP aşağıdaki çıktıyı alır:

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

Olmayan MVC - - Ancak, OP'ın CI modeli ActiveRecord sorgu orijinal anlamlı farklı olduğu dikkati çekiyor sorgu:

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

vs

$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 modeli sorgu ile başlamak için özgün SQL farklıdır. SQL dönüştürülmüş zaman aşağıdaki üretecektir:

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

Ancak, bu ben devam edeceğiz böylece geri getiriliyor doğru veri gibi görünüyor.

OP heirarchy gibi biçimlendirilmiş bir dizi istiyorum. Gelecekte başvurmak için lütfen bkz: PHP/MySQL - building a nav menu hierarchy. Bunu yapmanın en kolay yolu, OP'ın orijinal (MVC) işlevi takip ve bir model işlevi olarak eklemek olacaktır. Bunun nedeni çıkışından uygulama mantığı ayırmak için - Bu model fonksiyon yerine direkt html çıkış daha iç içe bir dizi oluşturmak istiyorum.

Sen bir fonksiyonu olarak modele aşağıdaki ekleyebilirsiniz. Başlangıçta nedeniyle OP görünen hataları yeniden yazılmış beri Nested sets, php array and transformation değil, alındığı yer:

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;
}

Şimdi aşağıdaki gibi bizim denetleyici güncelleyebilirsiniz:

* Cat_menu.php (Kontrolör) *

<?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);
    }
}

Şimdi bizim görünümü aşağıdaki gibi güncellemek olabilir:

menu.php (View)

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

Ben şu anda bu bilgisayardan tercüman erişimi yok gibi yukarıdaki Disclaimer: Yok PHP kullanılarak test edilmiştir. Eğer herhangi bir sözdizimi üzerinde kontrol emin olun.

Ayrıca yinelemeli, yerleşik HTML helper , which lets you create a <ul> bir dizi dışarı ul() fonksiyonuna bakarak düşünebilirsiniz.

Also, you're not passing the data to the view in the controller. it should be:

$ This -> yük -> view ('menü', $ veri);

Bir sonsuz döngü şu anda kurmak zorunda yolunu neden olur gibi de görünüyor. make_menu menu.php görünümü yükler, ama sonra görünümü bu yöntemi çağırır.