CodeIgniter从视图中的控制器检索特定数据

时间:2012-01-09 21:01:58

标签: php mysql codeigniter

所以基本上我要做的是从数据库中检索一个类别列表并将其放在一个名为$ data ['categories']的变量中。

在视图中,我通过简单地使用foreach()语句来列出这一点。到现在为止还挺好。 虽然,某些类别有子类别(并非所有类别)。现在,我在数据库中添加了一行“is_direct”(是否有子类别),显示该类别是否具有子类别。

现在,我想列出这些子类别,以防它们存在。

这里显示标题的方法(将列出类别和子类别)(不要介意私有,应该是这样)。

private function show_header($template='default',$page_name='default')
{
    // Get the categories.
    $data['categories']     = $this->CI->ws_category->get_categories();

    // Display the header.
    $this->CI->load->view("templates/".$template."/template/header",$data);
}

此方法调用方法get_categories(),即下面的方法(简单的Active Record)。

public function get_categories()
{
    // Prepare the SQL query.
    $this->db->select('*');
    $this->db->from(APP_PREFIX.'categories');
    $this->db->order_by('name_clean');

    // Execute the query.
    $query = $this->db->get();

    // Get the results from the query.
    $result = $query->result_array();

    // Return the array with data.
    return $result;
}

在视图下方,您可以看到子菜单的位置。

<?php

    // Loop through all the categories.
    foreach ($categories as $item):

?>
<li class='nav_link <?php ($item['is_direct'] == '1' ? 'nav_subcats' : ''); ?>'>
    <a href='<?php echo base_url().'category/'.$item['category_id'].'-'.$item['name_clean'].'.html';?>' class='nav_main_link'><?php echo $item['name']; ?></a>
    <?php

        // In case subcategories are present.
        if ($item['is_direct'] != '1')
        {
    ?>
    <div class='nav_submenu'>
        <ul>
            <li><a href='#' class='nav_sub_link'>submenu item</a></li>
        </ul>
    </div>
    <?php
        }
    ?>
</li>
<?php
    // End the loop.
    endforeach;

?>

有人能帮助我吗? 谢谢。

1 个答案:

答案 0 :(得分:3)

我将采用的方法是在模型(或控制器)中构建更完整的数据,以便您可以在视图中循环遍历它(就像您当前所做的那样)。下面我写了一个可能的解决方案。我已修改您的get_categories()方法以查询子类别。然后,在视图中,我们检查一个类别是否有任何子类别,并根据需要输出它们。

public function get_categories_and_subcategories()
{
    // Prepare the SQL query.
    $this->db->select('*');
    $this->db->from(APP_PREFIX.'categories');
    $this->db->order_by('name_clean');

    // Execute the query.
    $query = $this->db->get();

    // Get the results from the query.
    $result = $query->result_array();

    // Get subcategories
    for ($i = 0; $i < count($result); $i++) {

        // Check if subcategory
        if ($result[$i]['is_direct']) {

            // Query for subcategories - made up for demonstrational purposes
            $query = $this->db->query("SELECT * FROM subcategories WHERE parent_id='".$result[$i]['id']."'");

            // Add subcategories to category item
            $result[$i]['subcategories'] = $query->result_array();

        } else {

            $result[$i]['subcategories'] = array();

        }

    }

    // Return the array with data.
    return $result;
}

然后在视图中:

<li class='nav_link <?php ($item['is_direct'] == '1' ? 'nav_subcats' : ''); ?>'>
    <a href='<?php echo base_url().'category/'.$item['category_id'].' '.$item['name_clean'].'.html';?>' class='nav_main_link'><?php echo $item['name']; ?></a>

    <?php if (count($item['subcategories']) > 0): ?>
    <div class='nav_submenu'>
        <ul>
            <foreach ($item['subcategories'] as $subcategory): ?>
            <li><a href='<?php echo $subcategory['url']; ?>' class='nav_sub_link'><?php echo $subcategory['name']; ?></a></li>
            <?php endforeach; ?>
        </ul>
    </div>
    <?php endif; ?>
</li>

请记住,我没有测试过这段代码,但您应该能够对您的应用程序采用一般的想法。