使用这个助手的正确方法是什么?

时间:2011-01-21 06:03:37

标签: php codeigniter

我正在使用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;

1 个答案:

答案 0 :(得分:2)

我不确定我理解,但是这件事

  

我不确定如何做到这一点,因为我知道将一个帮助器加载到一个视图并且显然有很多逻辑的不好的做法,但我需要为每个返回的项调用此函数,如它会将$ item-&gt;名称提供为$ data ['name'],$ item-&gt;前缀为$ data ['prefix']和$ item-&gt; MixName为$ data ['mix']

不需要帮助程序,因为PHP提供了多维数组。你可以:

  1. 在某些模型中使用循环,以便将数组$items返回给控制器。 $items数组将类似于array(1 => array('name' => 'foo', 'prefix' => 'bar', 'mixname' => 'foobar');

  2. 将该数据作为$data['items'];

  3. 传递给视图
  4. 循环浏览视图中的项目。假装您需要显示每个名称:foreach ($items as $item) { echo $item['name']; }

  5. 只是为了澄清:在模型的循环中,你将在循环中执行类似的操作来抓取数据:

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

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

    此外,您在循环中进行查询的事实表明您应该查看SQL IN运算符。