2011-01-21 15 views
0

私はCodeIgniterのWebサイトを構築しています。データベースから取得したデータに基づいてデータを返すヘルパーを作成しました。この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$Prefix$item->Info

として $item->Prefixなどと $Info$item->Indexなど

私は、ヘルパーをビューにロードし、明らかにロジックがたくさんあるという悪い習慣を知っているので、これをどうやって行うのかは分かりませんが、返されるアイテムごとにこの関数を呼び出す必要があります。それは私がちょうどforeach文内の関数を呼び出すことなく、それを行うための方法を見つけるように見えることはできません$item->Name$data['prefix']として$item->Prefix$data['name']などと$item->MixName

$data['mix']として提供されます。何か不足していますか?

思考/提案?

ありがとうございます。

--------------一部は、これが部分的に解決され、私はモデルでこれを入れているが、それはちょうど、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

答えて

2

私は理解していないが、この事

は、私がこれを行う方法を本当にわからないんだけど、私はビューにヘルパーをロードするために、その悪い習慣を知っているようにして持っています論理的にはかなり分かりますが、返される各項目に対してこの関数を呼び出す必要があります。$ item-> Nameを$ data ['name']、$ item-> Prefixを$ data ['prefix ']と$ item [> mixName]としての$ item [' mix ']

PHPは多次元配列を提供するので、ヘルパーは必要ありません。あなただけの可能性:

  1. コントローラに配列$itemsを戻すために、いくつかのモデルでループを使用してください。配列$itemsarray(1 => array('name' => 'foo', 'prefix' => 'bar', 'mixname' => 'foobar')のようになります。

  2. このデータをビューに$data['items']として渡します。

  3. ビュー内の項目をループします。ただ、明確にするforeach ($items as $item) { echo $item['name']; }

:あなたはすべての名前を表示する必要があるふりを$iがある

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

(:モデルのループでは、データをつかむループ内でこのようなことをやります反復回数)。

また、ループでクエリを実行しているという事実は、SQL IN演算子を調べる必要があることを示唆しています。

+0

これは災害の原因になります!あなたは '$ name'、' $ prefix'と '$ maxname'を別のインデックスに割り当てています!それらを$ temp変数( '$ temp ['name']' ..etc)に追加し、次に実行してください: '$ item [] = $ temp;' – ifaour

+0

@ifaur、ありがとう!私は$ iのことを忘れていました - 修正しました。 – cbrandolino

+0

部分的に解決され、元の投稿に追加されました。 – Zen