2011-01-21 109 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

相关问题