0

第一次!

我正在学习 Code Igniter,作为我的第一个项目,我正在用 CI 重写现有站点。

在现有站点上,所有动态或静态页面都使用 PHP 包含来加载从数据库中的类别表填充的 sidebar.php。

<div id="sidebar">
<?php

$result = mysql_query('SELECT category_id, name, url FROM categories ORDER BY category_id    ASC');

while ($row = mysql_fetch_array($result)) {
$name=$row['name'];
$url=$row['url'];

print "<p><a href=\"category/$url\">$name</a></p>";

}

?>

</div>

所以现在我已经开始使用 CI,我认为要走的路是用数据库调用、侧边栏控制器、侧边栏视图制作一个侧边栏模型,然后在默认页面控制器中加载这个视图。

所以,在 /application/models 我有 sidebar_model.php

<?php
class Sidebar_model extends CI_Model {

public function __construct()
{
    $this->load->database();
}

public function get_categories()
{
    $query = $this->db->get('categories');
    return $query->result();    
}

}

然后在应用程序/控制器中有sidebar.php

<?php
class Sidebar extends CI_Controller {

public function __construct()
{
    parent::__construct();

}

public function index()
{
    $this->load->model('sidebar_model');

    $data['result'] = $this->sidebar_model->get_categories();

    $this->load->view('templates/sidebar_view', $data);
}


}

然后在应用程序/视图/模板中有 sidebar_view.php

<div id="sidebar">
<?php foreach($result as $row): ?>

<p><?php echo $row['name'] ?></p>

<?php endforeach ?>
</div>

这是从我的主页控制器调用的 -

<?php

class Pages extends CI_Controller {

public function view($page = 'home')
{

    if ( ! file_exists('application/views/pages/'.$page.'.php'))
    {
        // Whoops, we don't have a page for that!
        show_404();
    }


    $data['title'] = ucfirst($page); // Capitalize the first letter

    $this->load->view('templates/header', $data);
    $this->load->view('pages/'.$page, $data);
    $this->load->view('templates/sidebar_view', $data);
    $this->load->view('templates/footer', $data);

}
}

我遇到的麻烦是,虽然页面控制器显然正在加载侧边栏视图(该框以正确的 CSS 样式显示),但它引发了 PHP 错误。

A PHP Error was encountered

Severity: Notice

Message: Undefined variable: result

Filename: templates/sidebar_view.php

Line Number: 2 

谁能在这里指出我正确的方向?虽然只为侧边栏使用 php include 会既快速又简单,但它看起来不像 MVC 的做事方式。

为冗长的帖子道歉,并在此先感谢!

4

3 回答 3

0

您正在加载Pages控制器并调用控制器视图Sidebar变量在控制器加载$result时获取数据Sidebar并且您正在加载控制器您必须在控制器Pages中加载模型sidebarpages

class Pages extends CI_Controller {

public function view($page = 'home')
{
  $this->load->model('sidebar_model');
  $data['result'] = $this->sidebar_model->get_categories();
if ( ! file_exists('application/views/pages/'.$page.'.php'))
{
    // Whoops, we don't have a page for that!
    show_404();
}


$data['title'] = ucfirst($page); // Capitalize the first letter

$this->load->view('templates/header', $data);
$this->load->view('pages/'.$page, $data);
$this->load->view('templates/sidebar_view', $data);
$this->load->view('templates/footer', $data);

}
}
于 2013-04-16T19:47:05.197 回答
0

Pages 控制器中的 $data 数组需要有一个“结果”条目。传递给视图的数组中的值将转换为局部变量以在视图中使用。您在侧边栏控制器中正确执行此操作(您并不真正需要)。

于 2013-04-16T19:43:29.630 回答
0

如果您需要所有页面的侧边栏,您可以先以这样的好方法进行操作,您需要扩展 MY_Controller,然后使用 MY_Controller 扩展所有控制器

MY_Controller 放在应用程序核心目录

<? 
 MY_Controller extends CI_Controller{

   public $_sidebar = '';

   public function __construct() {
      parent::__construct();
      $this->_sidebar = $this->sidebar();
   }

   private function sidebar(){
       $this->load->model('sidebar_model');

      $data['result'] = $this->sidebar_model->get_categories();

      return $this->load->view('templates/sidebar_view', $data,TRUE);
    }    

 }

现在你的页面控制器

<?php

class Pages extends MY_Controller {

   public function __construct() {
      parent::__construct();
   }

public function view($page = 'home')
{

    if ( ! file_exists('application/views/pages/'.$page.'.php'))
    {
        // Whoops, we don't have a page for that!
        show_404();
    }


    $data['title'] = ucfirst($page); // Capitalize the first letter
    $data['sidebar'] = $this->_sidebar;
    $this->load->view('templates/header', $data);
    $this->load->view('pages/'.$page, $data);
    $this->load->view('templates/footer', $data);

}
}

现在您将侧边栏作为变量,每次只需在主模板 html 中的任何您想要的位置定义侧边栏时,它都可供您的控制器使用

于 2013-04-16T19:51:58.720 回答