2011-04-26 314 views
0

我正在努力通过Codeigniter模型调用生成嵌套选项卡标记,并欢迎任何有见地的评论。难点在于所产生的标记具有不必要的项目数据块重复。使用不直接相互连接的多个视图可能是问题所在。Codeigniter嵌套选项卡设置的多个视图

这里的控制器:

function projects() { 

$this->load->model('msm_projects'); 
$data['cats']=$this->msm_projects->catid()->result_array(); 
$this->load->view('vup_projects', $data); 

foreach ($data['cats'] as $item) 
    { 
    $data2['projects']=$this->msm_projects->catproj($item['catid'])->result_array(); 
    $this->load->view('vup_projects2', $data2); 
    } 
} 

型号:

function catid() { 

    return $this->db->query("SELECT DISTINCT catid, cat FROM category INNER JOIN projects ON catid = projcat WHERE projpub=1 ORDER BY catid ASC"); 

    } 

function catproj($catid) { 

    return $this->db->query("SELECT catid, cat, projcat, projid, projtit FROM projects INNER JOIN category ON projcat = catid WHERE projcat = $catid AND projpub=1 ORDER BY catid ASC"); 

    } 

以下是这是两个部分的意见。我怀疑这是一切都出错的地方。这两个观点之间有一个不完美的联系,我很难考虑。

视图1称为 'vup_projects'

<div id="wrapper"> 
<div class="yui3-g"> 

    <div class="yui3-u-1"><div id="topbloc"><img src="http://localhost/getop/base-images/topbloc.gif" width="800" height="50" align="middle"></div></div> 

<div class="yui3-u-1"> 

    <div id="navbloc"> 
     <div id="linx"> 
      <ul > 
       <li id="about"><?php echo anchor('cu_tya/about', 'about'); ?></li> 
       <li id="ourwork"><?php echo anchor('cu_projects/projects', 'projects'); ?></li> 
       <li id="contact"><?php echo anchor('cu_tya/contact', 'contact'); ?></li> 
       <li id="member"><?php echo anchor('cu_sites/pager', 'your page'); ?></li> 
      </ul> 
     </div> 
    </div> 

</div> 

    <div class="yui3-u-1"> 

    <div id="container"> 

    <ul>    
     <?php 
      foreach ($cats as $item) // top tabs 
       { 
        echo '<li><a href=#fragment-'.$item['catid'].'><span>'.$item['cat'].'</span></a></li>'; 
       } 
     ?> 
    </ul> 

而第二种观点vup_projects2

<?php foreach ($cats as $item) { ?> <!-- main divs -->      

    <div id="fragment-<?php echo $item['catid'];?>"> 

    <ul> 

     <?php foreach ($projects as $project) 

      { ?> 

       <li> 
       <a href="#fragment-<? echo $project['projid']?>a"><span><?php echo $project['projtit'];?></span></a></li> 

     <?php } ?> 

    </ul> 

     <?php foreach ($projects as $project) 

      { ?> 

       <div id="fragment-<?php echo $project['projid'];?>a" > 

       <?php echo $project['projtit'].' hooray';?> 

       </div> 

     <?php } ?> 

    </div> 

<?php } ?> 

      </div> <!-- container --> 

     </div> <!-- YUI-UNIT-1--> 

    </div> <!-- YUI-GRID --> 

</div> <!-- wrapper --> 

回答

1
foreach ($data['cats'] as $item) 
    { 
    $data2['projects']=$this->msm_projects->catproj($item['catid'])->result_array(); 
    $this->load->view('vup_projects2', $data2); 
    } 

是你的问题,你在循环$数据[为每个项目的意见”猫'] ...你也在为每个$ item进行查询。你应该做一个查询,然后循环相应的结果。但是,为了解决您的问题,试试这个:

foreach ($data['cats'] as $item) 
{ 
    $data2['projects'][$item['catid']] = $this->msm_projects->catproj($item['catid']) 
             ->result_array(); 
} 

$this->load->view('vup_projects2', $data2); 

然后改变你的第二个以

<?php foreach ($cats as $item) { ?> <!-- main divs -->      

<div id="fragment-<?php echo $item['catid'];?>"> 

<ul> 

     <?php foreach ($projects[$item['catid']] as $project) 

      { ?> 

       <li> 
       <a href="#fragment-<? echo $project['projid']?>a"><span><?php echo $project['projtit'];?></span></a></li> 

     <?php } ?> 

    </ul> 

     <?php foreach ($projects[$item['cat_id']] as $project) 

      { ?> 

       <div id="fragment-<?php echo $project['projid'];?>a" > 

       <?php echo $project['projtit'].' hooray';?> 

       </div> 

     <?php } ?> 

      </div> <!-- container --> 

     </div> <!-- YUI-UNIT-1--> 

    </div> <!-- YUI-GRID --> 

</div> <!-- wrapper --> 
+0

谢谢。我正在处理你的回应,但立即从你的代码和我的工作中看出,$ data2数组比我想象的更分层,因此更难获得有用的数据。我很乐意做你建议的一个查询。什么阻止了我的想法,我也想申请分页。要将其应用到按类别组织的项目中,我需要访问查询,在控制器中按类别查询项目。 – Tom 2011-04-27 08:36:45

+0

花了很长时间来解决这个问题,我正在取得某种进展。我怀疑,因为这很复杂,我没有以最佳方式使用CI。然而,花了这么多时间,我无法改变方向。数组争夺是CI中的全职活动! – Tom 2011-04-27 14:02:14

+0

看到我的评论下面也许更好的描述我在想什么。 – tgriesser 2011-04-28 04:19:51

1

所以我把在你的努力来完成定睛一看,我想我合并成一个单一的查询和单个视图。也许这将帮助

控制器:

class Projects extends CI_Controller { 

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

function projects() { 

    $cats = array(); // Unique cateogires 
    $projects = array(); // Projects that will go underneath 

    $this->load->model('msm_projects'); 
    $query = $this->msm_projects->get_all(); 

    // Make sure there are results 
    if ($query !== FALSE) 
    { 
     // Loop through once to find distinct categories for tabs 
     foreach ($query as $k => $v) 
     { 
      if (! array_key_exists($v['catid'], $tabs)) 
      { 
       $tabs[$v['catid']] = $v['cat']; 
      } 
     } 

     // Loop through all of the results and group the items 
     // into arrays by their categories 
     foreach ($query as $k => $v) 
     { 
      $projects[$v['catid']][] = $v; 
     } 

     $data = array(
        'cats' => $cats, 
        'projects' => $projects 
        ); 

     $this->load->view('main', $data); 
    } 
    else 
    { 
     echo 'No results'; 
    } 
} 
} 

型号:

class Msm_projects extends CI_Model { 

/* Returns everything you need */ 
function get_all() 
{ 
    $q = $this->db->select('c.catid, c.cat, p.projcat, p.projid, p.projtit') 
      ->join('projects as p', 'c.catid = p.projcat', 'INNER') 
      ->where('projpub = 1') 
      ->order_by('c.catid') 
      ->get('category as c'); 

    if ($q->num_rows > 0) 
    { 
     return $q->result_array(); 
    } 
    else 
    { 
     return FALSE; 
    } 
} 
} 

查看:

<div id="wrapper"> 
    <div class="yui3-g"> 
     <div class="yui3-u-1"> 
      <div id="topbloc"> 
      <img src="<?=base_url() /* Good not to hardcode url's if you can avoid it */;?>getop/base-images/topbloc.gif" width="800" height="50" align="middle" /> 
     </div> 
    </div> 
    <div class="yui3-u-1"> 
    <div id="navbloc"> 
     <div id="linx"> 
      <ul > 
       <li id="about"><?php echo anchor('cu_tya/about', 'about'); ?></li> 
       <li id="ourwork"><?php echo anchor('cu_projects/projects', 'projects'); ?></li> 
       <li id="contact"><?php echo anchor('cu_tya/contact', 'contact'); ?></li> 
       <li id="member"><?php echo anchor('cu_sites/pager', 'your page'); ?></li> 
      </ul> 
     </div> 
    </div> 
</div> 
<div class="yui3-u-1"> 

<div id="container"> 
<ul>    
    <?php foreach($cats as $id => $cat){ ?> 
     <li><a href="#fragment-<?=$id;?>"><span><?=$cat['cat'];?></span></a></li> 
    <?php } ?> 
</ul> 

<?php foreach ($cats as $id => $cat) { ?> <!-- main divs --> 
    <div id="fragment-<?php echo $id;?>"> 
     <ul> 
      <?php foreach($projects[$id] as $project){ ?> 
      <li> 
       <a href="#fragment-<? echo $project['projid']?>a"><span><?php echo $project['projtit'];?></span></a> 
      </li> 
      <?php } ?> 
     </ul> 
     <?php foreach ($projects[$id] as $project) { ?> 
     <div id="fragment-<?php echo $project['projid'];?>a" > 
      <?php echo $project['projtit'].' hooray';?> 
     </div> 
     <?php } ?> 
    </div> 
<?php } ?> 

有很多技巧,了解CI优化MVC过程,我希望我早些时候学到了很多。希望这可以帮助一些人,如果你有问题,请告诉我。至于分页,尝试做一些类似于我在foreach循环中获取主类别的内容,然后将结果数组中的页面拖出==到您正在查找的类别。

+0

再次感谢您。我有很多想法,并且运气好,学习。处理阵列似乎对我来说非常棘手,但也容易受到令人难以置信的,省力省力的手感。使用类别id作为三维数组的主键是非常棒的,而且我真的很想理解。 – Tom 2011-04-28 07:57:50