2011-01-21 83 views
0

我正在構建一個網站智商CodeIgniter,我寫了一個幫助器,它有一個函數,它根據從數據庫中提取的內容返回數據,我不知道我應該如何將它保留在良好的MVC中。什麼是使用這個幫手的正確方法?

控制器:

$char = $this->uri->segment(4); 
    $q = $this->kal_db_model->get_char($this->session->userdata('uid'), $char); 
    $q_row = $q->row(); 

    $data['items'] = $this->kal_db_model->get_items($q_row->PID); 
    $data['page'] = 'control_view_char'; 

的型號:

function get_items($pid) 
{ 
$kal_db = $this->load->database('kal_db', TRUE); 
$sql = " 
     SELECT i.*, n.Name, n.Grade, n.type, p.Name AS PrefixName, m.Name AS MixName 
     FROM dbo.Item as i 
     INNER JOIN dbo.ItemName as n 
     ON i.[Index] = n.[Index] 
     INNER JOIN dbo.PrefixName as p 
     ON i.[Prefix] = p.[Prefix] 
     INNER JOIN dbo.MixName as m 
     ON i.[Info] = m.[Info] 
     WHERE i.PID = '". $pid ."' 
     ";   
$query = $kal_db->query($sql); 
return $query; 
} 

的觀點:

<?php if ($items->num_rows() > 0) 
      { 
      foreach ($items->result() as $item): ?> 
      <tr class="odd"> 
      <td><img src="<?php echo base_url(); ?>/assets/items/<?php echo $item->Index; ?>.bmp" alt="" /></td> 
      <?php if($item->type == 1) 
        { 
        echo '<td>G' . $item->Grade . '<span style="color:blue">' . $item->PrefixName . '</span>&nbsp;<span style="color:red">' . $item->XAttack . '/' . $item->UpgrLevel . '/' . $item->XHit . '</span>&nbsp;' .$item->Name; if($item->Info > 50000){ echo '&nbsp;<span style="color:green">' . $item->MixName . '</span>'; } echo '</td>'; 
        } 
        elseif($item->type == 2) 
        { 
        echo '<td>G' . $item->Grade . '<span style="color:blue">' . $item->PrefixName . '</span>&nbsp;<span style="color:red">' . $item->XDefense . '/' . $item->XDodge . '</span>&nbsp;' .$item->Name . '</td>'; 
        } 
        elseif($item->type == 3) 
        { 
        echo '<td>' .$item->Name . '</td>'; 
        } 
        elseif($item->type == 4) 
        { 
        echo '<td><span style="color:blue">G' . $item->Info . '</span>&nbsp;' .$item->Name . '</td>'; 
        } 

      ?> 
      </tr> 
     <?php endforeach; 
      } ?> 

簡單地說,我想在視圖中不顯示的$item->Name值,而是從助手返回的東西。

輔助函數如下:

parse_item($Index, $Prefix, $Info)

和返回是這樣的:

Array ([name] => Short Iron Sword [prefix] => The King, GuhBalHan's [mix] => Shadow)

我可以得到$Index$item->Index$Prefix$item->Prefix$Info$item->Info

我不太確定如何做到這一點,因爲我知道它不好的做法,加載一個幫助器視圖,顯然有很多的邏輯,但我需要調用這個函數爲每個返回的項目,作爲它將提供$item->Name$data['name']$item->Prefix作爲$data['prefix']$item->MixName$data['mix']

我似乎無法找到這樣做不調用foreach語句中的函數的方法。我錯過了什麼嗎?

想法/建議?

在此先感謝。

--------------部分解決

這部分解決了,我把這個模型,但它只是返回第一行,17倍。我不明白爲什麼$ q只是第一行,它不應該是一個數組?

$query = $kal_db->get('Item'); 
$q = $query->row(); 
$i = 1; 
foreach($q as $row) 
{ 
    $item[$i]['IID'] = $q->IID; 
    $i = $i + 1; 
} 
return $item; 
+0

您可以在控制器中加載幫助程序,並且該視圖仍然可以訪問這些功能。在視圖中使用這些函數並不是不好的做法 - 考慮CI的排版幫助器,URI助手......所有類型都適合在視圖中使用。 MVC是一個概念 - 不要以爲你有**要遵守它。 – Ross 2011-01-21 10:32:11

回答

2

我不知道我的理解,但是這件事情

我真的不知道如何做到這一點,因爲我知道它不好的做法給助手裝載到一個視圖,且具有顯然有很多邏輯,但我需要爲每個返回的項目調用該函數,因爲它將提供$ item-> Name作爲$ data ['name'],$ item-> Prefix作爲$ data ['前綴']和$ item-> MixName作爲$ data ['mix']

不需要幫助器,因爲PHP提供了多維數組。你可以只:

  1. 使用一些模型中的循環,以一個數組$items返回到控制器。 $items陣列將如array(1 => array('name' => 'foo', 'prefix' => 'bar', 'mixname' => 'foobar');

  2. 將該數據傳遞給視圖$data['items'];

  3. 環視圖中的項目。假設您需要顯示每一個名字:foreach ($items as $item) { echo $item['name']; }

只是爲了澄清:在模型中的循環,你會做這樣的事情,抓住了循環內的數據:

$item[$i]['name'] = $name; 
$item[$i]['prefix'] = $prefix; 
$item[$i]['mixname'] = $mixname; 

(其中$i是迭代次數)。

此外,您在循環中進行查詢的事實表明您應該查看SQL IN運算符。

+0

這會造成災難!您正在將`$ name`,`$ prefix`和`$ maxname`分配給不同的索引!將它們添加到`$ temp`變量(`$ temp ['name']`..etc),然後執行:`$ item [] = $ temp;` – ifaour 2011-01-21 11:24:06

相關問題