我是MVC的新手,我正在将一个用非MVC风格编写的项目移植到MVC,但我遇到了一个需要在View中调用Model函数的问题。
表1 - 产品:
包含product_id
,product_name
等,每个产品都有多个版本。
表2 - 版本:
包含version_id
,version_name
,...,product_id
等。
现在在View中我正在显示产品,在每个产品标题下我必须显示该产品的版本列表,在非MVC样式中它非常简单,我可以在View中使用以下代码片段:
foreach ($product as $row)
{
echo $row['product_name'];
if ($main->getVersionList($vresult,$row["product_id"]))
{
foreach ($vresult as $vrow)
{
echo $vrow['version_name'];
}
}
}
现在,我可以将Product数组从控制器传递到视图,但是每个需要根据每个产品生成的 Version 数组呢?
更新
这是我在控制器中的最终工作解决方案(使用地图):
$this->load->model ( 'product_mod' );
$data ['products'] = $this->product_mod->getProductList ();
$data ['versions'] = array ();
foreach ( $data ['products'] as $product )
{
$data ['versions'] [$product['product_id']] = $this->product_mod->getVersionList ( $product['product_id'] );
}
答案 0 :(得分:6)
我应该注意的第一件事是 It is impossible to write classical MVC in PHP 。事实上,类似MVC的PHP框架(如CodeIgniter或Yii)实现了sort of MVP,其中:
但是,特别是在CodeIgniter中,您有3个步骤:
考虑到上述方法,您需要从模型中的数据库中获取结果:
<强>应用/模型/ product.php 强>
class Product extends CI_Model
{
public function get_product($product_id)
{
$this->db->select('*')->from('products');
$this->db->where('product_id', $product_id);
$this->db->join('versions', 'versions.product_id = products.product_id');
$query=$this->db->get();
return $query->first_row('array');
}
}
然后在Controller中获取并传递结果:
<强>应用/控制器/ products.php 强>
class Products extends CI_Controller
{
public function view($product_id)
{
$this->load->model('product');
// Fetch the result from the database
$data['product'] = $this->product->get_product($product_id);
// Pass the result to the view
$this->load->view('product_view', $data);
}
}
最后,使用视图中返回的数据生成列表:
<强>应用/视图/ product_view.php 强>
// Use $product to display the product.
print_r($product);
答案 1 :(得分:2)
您应该在模型中进行mysql查询,例如products_model(不要忘记加载它)
示例查询:这只是从产品中选择*
public function All_Products()
{
$this->db->select('');
$result = $this->db->get('products')->result_array();
return $result;
}
正如我所看到的,你是像我一样的人,而不是使用大量查询。
在您的控制器中,您可以为您的模型加载$ products。
$products = $this->products_model->All_Products();
我的解决方案是创建一个新数组,然后在其中添加新值。还需要在模型中使用getVersionList函数。
$newArray = array ();
foreach ( $products as $values ) {
$version = $this->products_model->getVersionList($values['product_id']);
$tmp = array (
'product_id' => $values ['product_id'],
'product_name' => $values ['product_name'],
'version' => $version
);
array_push ( $newArray, $tmp );
}
因此,将新数组添加到您可以在视图文件中使用的$ data。
$data ['products'] = $newArray;
对不起,我没有弄清楚你的所有疑问,但我认为如何捕鱼比教鱼更好。
答案 2 :(得分:0)
使用以下代码,您可以在视图文件中调用模型的方法。它对我有用,也很简单。
$CI =& get_instance();
$CI->model_name->method_name();