什么是使用这个帮手的正确方法?
我正在构建一个网站智商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> <span style="color:red">' . $item->XAttack . '/' . $item->UpgrLevel . '/' . $item->XHit . '</span> ' .$item->Name; if($item->Info > 50000){ echo ' <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> <span style="color:red">' . $item->XDefense . '/' . $item->XDodge . '</span> ' .$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> ' .$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;
我不知道我的理解,但是这件事情
我真的不知道如何做到这一点,因为我知道它不好的做法给助手装载到一个视图,且具有显然有很多逻辑,但我需要为每个返回的项目调用该函数,因为它将提供$ item-> Name作为$ data ['name'],$ item-> Prefix作为$ data ['前缀']和$ item-> MixName作为$ data ['mix']
不需要帮助器,因为PHP提供了多维数组。你可以只:
使用一些模型中的循环,以一个数组
$items
返回到控制器。$items
阵列将如array(1 => array('name' => 'foo', 'prefix' => 'bar', 'mixname' => 'foobar')
;将该数据传递给视图
$data['items']
;环视图中的项目。假设您需要显示每一个名字:
foreach ($items as $item) { echo $item['name']; }
只是为了澄清:在模型中的循环,你会做这样的事情,抓住了循环内的数据:
$item[$i]['name'] = $name;
$item[$i]['prefix'] = $prefix;
$item[$i]['mixname'] = $mixname;
(其中$i
是迭代次数)。
此外,您在循环中进行查询的事实表明您应该查看SQL IN
运算符。
这会造成灾难!您正在将`$ name`,`$ prefix`和`$ maxname`分配给不同的索引!将它们添加到`$ temp`变量(`$ temp ['name']`..etc),然后执行:`$ item [] = $ temp;` – ifaour 2011-01-21 11:24:06
您可以在控制器中加载帮助程序,并且该视图仍然可以访问这些功能。在视图中使用这些函数并不是不好的做法 - 考虑CI的排版帮助器,URI助手......所有类型都适合在视图中使用。 MVC是一个概念 - 不要以为你有**要遵守它。 – Ross 2011-01-21 10:32:11