2011-04-26 337 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