如何确保foreach循环数据显示在正确的设置位置视图中

时间:2017-04-15 10:00:26

标签: codeigniter

我有一个控制器,显示我每个位置的模块

Array
(
    [0] => Array
        (
            [layout_module_id] => 1
            [layout_id] => 1
            [module_id] => 1
            [position] => column_left
            [sort_order] => 1
        )

    [1] => Array
        (
            [layout_module_id] => 2
            [layout_id] => 1
            [module_id] => 2
            [position] => column_left
            [sort_order] => 2
        )

)

目前,我只设置了两个模块,并且位于左列的位置。

因为位置视图位于foreach循环的一侧,即使没有为该位置设置,它们也会拾取该模块?如图所示。

enter image description here

enter image description here

  

问题:如何确保模块仅显示在其设定的位置视图中。

public function index() {
    $layout_id = $this->getlayoutID($this->router->class);

    $modules = $this->getlayoutsmodule($layout_id);

    echo '<pre>';
    print_r($modules);
    echo "</pre>";

    $data['modules'] = array();

    foreach ($modules as $module) {
        $this->load->library('module/question_help');
        $data['modules'][] = $this->load->view('module/question_help', $this->question_help->set(), TRUE);  
    }

    // Position Views
    $data['column_left'] = $this->load->view('column_left', $data, TRUE);
    $data['column_right'] = $this->load->view('column_right', $data, TRUE);
    $data['content_top'] = $this->load->view('content_top', $data, TRUE);
    $data['content_bottom'] = $this->load->view('content_bottom', $data, TRUE);

    // Main view
    $this->load->view('welcome_message', $data);
}

public function getlayoutsmodule($layout_id) {
    $this->db->select('*');
    $this->db->from('layouts_module');
    $this->db->where('layout_id', $layout_id);
    $query = $this->db->get();

    if ($query->num_rows() > 0) {
        return $query->result_array();
    }   
}

每个位置视图都具有相同的foreach循环

<?php if ($modules) { ?>
<?php foreach ($modules as $module) { ?>
<?php echo $module;?>
<?php } ?>  
<?php }?>

主视图

 <div class="container">
    <div class="row">
    <?php echo $column_left; ?>

    <?php if ($column_left && $column_right) { ?>
    <?php $class = 'col-sm-6'; ?>
    <?php } elseif ($column_left || $column_right) { ?>
    <?php $class = 'col-sm-9'; ?>
    <?php } else { ?>
    <?php $class = 'col-sm-12'; ?>
    <?php } ?>

    <div id="content" class="<?php echo $class; ?>">
    <?php echo $content_top; ?>
    <h1>Welcome to CodeIgniter!</h1>

    <div id="body">
    <p>The page you are looking at is being generated dynamically by CodeIgniter.</p>

    <p>If you would like to edit this page you'll find it located at:</p>
    <code>application/views/welcome_message.php</code>

    <p>The corresponding controller for this page is found at:</p>
    <code>application/controllers/Welcome.php</code>

    <p>If you are exploring CodeIgniter for the very first time, you should start by reading the <a href="user_guide/">User Guide</a>.</p>
    </div>

    <p class="footer">Page rendered in <strong>{elapsed_time}</strong> seconds. <?php echo  (ENVIRONMENT === 'development') ?  'CodeIgniter Version <strong>' . CI_VERSION . '</strong>' : '' ?></p>

    <?php echo $content_bottom; ?>  
    </div>
    <?php echo $column_right; ?></div>
</div>

1 个答案:

答案 0 :(得分:1)

我会这样做(不确定是否需要在每次迭代中加载库而是将其保留在那里):

$tmpdata = array();
foreach ($modules as $module) {
    $this->load->library('module/question_help');
    $tmpdata[$module['position']]['modules'][] = $this->load->view('module/question_help', $this->question_help->set(), TRUE);
}

$data = array();
foreach ($tmpdata as $pos => $mods) {
    $data[$pos] = $this->load->view($pos, $tmpdata[$pos], TRUE);
}

$this->load->view('welcome_message', $data);

$tmpdata[$pos]传递到每个位置的视图会使名为$modules的数组可用,因此在视图中,只需使用

if ($modules) {
    foreach ($modules as $module) {
      echo $module;
    }  
}
和以前一样。

这使其保持动态,如果您更改或添加职位,则无需修改此代码。我只是为了避免传递不必要的数据而使用两个数据阵列。