【问题标题】:2 Codeigniter Controller Querys on One View2 一个视图上的 Codeigniter 控制器查询
【发布时间】:2009-11-12 00:49:35
【问题描述】:

如何将来自同一个控制器的两个不同的函数输出放到同一个视图(页面)中? 例如,我有一个转到“article” div 的函数,以及我试图在“aside” div 中使用的另一个函数。 (此处使用 HTML 5 命名法)

我已经在 (view)aside div 中使用了实际的 db 查询,但它仍然只显示第 1 篇文章功能。

我已将 $data('result') 变量更改为单独的变量,这没有区别。

我在文章 div 中显示我必须完成的工作的待办事项列表,然后在旁边的 div 中显示已完成的待办事项的标题。

我想我把这个解释弄得一团糟。你会使用来自不同控制器的函数吗?

这是控制器中的第一个代码

function index()
{
    $this->load->model('work_m');
    $data = array();
    $config['base_url'] = base_url() . 'index.php/work/index/';
    $config['total_rows'] = $this->db->count_all('work');
    $config['per_page'] = '10';
    $config['full_tag_open'] = '<div id="pagination">';
    $config['full_tag_close'] = '</div>';
    $this->pagination->initialize($config);
    $data['result'] = $this->work_m->get_records($config['per_page'], $this->uri->
        segment(3));

    $tmpl = array('table_open' =>
        '<table border="0" cellpadding="0" cellspacing="0">', 'heading_row_start' =>
        '<tr class="heading">', 'heading_row_end' => '</tr>', 'heading_cell_start' =>
        '<th>', 'heading_cell_end' => '</th>', 'row_start' => '<tr>', 'row_end' =>
        '</tr>', 'cell_start' => '<td>', 'cell_end' => '</td>', 'row_alt_start' =>
        '<tr class="alt">', 'row_alt_end' => '</tr>', 'cell_alt_start' => '<td>',
        'cell_alt_end' => '</td>', 'table_close' => '</table>');
    $this->table->set_template($tmpl);
    $this->table->set_caption("Work Items");

    //-- Header Row
    $this->table->set_heading('ID', 'Date', 'Title', 'Done', 'Item');

    //-- Content Rows

    $data['title'] = 'Page Display';
    $this->load->view('work_links', $data);

注意它指向work_links,一个视图

下一个函数就是这个

function done()
{

    $data = array();
    if ($query = $this->work_m->dead_work()) {
        $data['dead'] = $query;
    }
    $tmpl = array('table_open' =>
        '<table border="0" cellpadding="0" cellspacing="0">', 'heading_row_start' =>
        '<tr class="heading">', 'heading_row_end' => '</tr>', 'heading_cell_start' =>
        '<th>', 'heading_cell_end' => '</th>', 'row_start' => '<tr>', 'row_end' =>
        '</tr>', 'cell_start' => '<td>', 'cell_end' => '</td>', 'row_alt_start' =>
        '<tr class="alt">', 'row_alt_end' => '</tr>', 'cell_alt_start' => '<td>',
        'cell_alt_end' => '</td>', 'table_close' => '</table>');
    $this->table->set_template($tmpl);
    $this->load->view('work_links', $data);
}

它们背后的模型是对数据库的基本调用

现在视图中的这段代码与上面的第一个函数(在文章 div 中)一起工作并且完美地工作

foreach($result as $row)
 {
 $this->table->add_row(
anchor("work/fill_form/$row->id", $row->id),
$row->date,
$row->title,
$row->compl,
$this->typography->auto_typography($row->item)
);
}
$table = $this->table->generate();
echo $table;

这是进入侧 div 的第二个代码(与上面的第二个函数一起使用)

if (isset($dead)){

 foreach($dead as $row)
 {  
$this->table->add_row(
$row->id,
$row->title,
$row->finish
);
  }
 }  
$this->table->set_heading('ID', 'Title');
$table = $this->table->generate();
echo $table;

无论我做什么,最后一个代码都只会从第一个函数中获取数据。

【问题讨论】:

  • 你试过只在第一个中调用另一个控制器函数吗?
  • 你甚至可以使用类变量而不是$data,虽然这可能有点脏...
  • 我真的很想得到你想说的......我不能......你能输入一些代码,以便我们至少可以看到你做了什么吗?跨度>

标签: php codeigniter


【解决方案1】:

要在一个页面上使用两次视图,或者使用来自一个控制器路由的两个不同视图,请为每个视图调用一次$this-&gt;load-&gt;view(),但只传递一次$data。这意味着使用不同的键或数组元素将所有模型数据添加到单个 $data 变量中。

例子:

$this->data = array(
    'people' => $this->SomeModel->list1(),
    'dogs'   => $this->SomeModel->list2() );
$this->load->view('list-view', $this->data);
$this->load->view('list-view');
$this->load->view('footer');

对于我自己的许多网站,我使用了一个特殊的基本控制器,它实现了 view() 函数来加载我的每个公共页面部分,因此每个控制器路由只需要填充 $this-&gt;data 并调用 $this-&gt;view('unique-part')(如大多数页面都会有页眉、页脚、侧边栏、导航栏,然后中间有一些独特的视图)。

例子:

function page($p, $extra) {
    $this->load->view('_parts/header', array_merge($this->data, $extra));
    $this->load->view("$base/sidebar");
    $this->load->view("$base/$p");
    $this->load->view('_parts/footer');
}

请注意,页眉/页脚位于 _parts 文件夹中,与其他路由共享。 CodeIgniter 缓存视图数据,以便在给定路由中引用它的第一个视图之后的任何视图都可以使用该数据。

【讨论】:

  • 啊我明白了,无论我在第二个函数中做什么,只有第一个很重要,因为我使用了两次 $data
  • 但如果我这样做,那么第二个函数和结果表将无法连接到要使用的数据。我的大部分页面都使用 3 个部分,一个模板。页眉页脚,以及我指向的视图,我称之为内容。我试图摆脱这种情况,因为它使每个页面都相同,和/或将创建一个怪物文件系统。但我想我可以为每个页面创建一个子文件夹并使用模板方法
  • 我更新了我的答案以显示我如何处理页眉/页脚......并提到 CodeIgniter 缓存给定 CGI 请求的视图数据。
【解决方案2】:

我认为这是模块化方法的工作:https://bitbucket.org/wiredesignz/codeigniter-modular-extensions-hmvc/wiki/Home

问。什么是模块化 HMVC,为什么要使用它?

A. 模块化 HMVC = 多个 MVC 三元组

当您需要加载视图及其数据时,这非常有用 看法。考虑将购物车添加到页面。购物车 需要它自己的控制器,它可以调用模型来获取购物车数据。然后 控制器需要将数据加载到视图中。所以,而不是 处理页面和购物车的主控制器,购物 购物车 MVC 可以直接在页面中加载。主控制器 不需要知道它,并且完全与它隔离。

在 CI 中,每个请求不能调用超过 1 个控制器。因此,对 实现HMVC,我们要模拟控制器。它可以用 库,或使用此“模块化扩展 HMVC”贡献。

使用库和“模块化 HMVC”HMVC 的区别 类是:1)无需在 HMVC 中获取和使用 CI 实例 类 2) HMVC 类存储在模块目录中,而不是 库目录。

Bonfire 也使用 HMVC。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    相关资源
    最近更新 更多