Как правильно использовать этот помощник? - PullRequest
0 голосов
/ 21 января 2011

Я создаю веб-сайт с 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 Ответ

2 голосов
/ 21 января 2011

Я не уверен, что понимаю, но эта вещь

Я не совсем уверен, как это сделать, так как я знаю, что это плохая практика - загружать помощника в представление и иметь там много логики, но мне нужно вызывать эту функцию для каждого возвращаемого элемента, так как он будет предоставлять $ item-> Name как $ data ['name'], $ item-> Prefix как $ 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...