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


}

そして、applications/views/templates には 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 インクルードを使用するだけでも簡単ですが、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 に答える