2011-01-21 2 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; 
} 

The View:

<?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']

Я просто не могу найти способ сделать это без вызова функций в заявлении Еогеаспа. Я что-то упускаю?

Мысли/предложения?

Заранее спасибо.

-------------- Часть решена

Это частично решена, я ставлю это в модели, но она просто возвращается в первый ряд, в 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 as $ data ['name'], $ item-> Prefix as $ data ['prefix '] и $ 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

+0

@ifaur, спасибо! Я забыл, что '$ i' - исправлено. – cbrandolino

+0

частично решен, добавлен в исходное сообщение. – Zen

Смежные вопросы