原文地址:
http://extjs.com/learn/Tutorial:ExtJs_CodeIgniter
翻译:老谭(tanqimin)
关于
如何实现 - CodeIgniter 与 ExtJs Grid.
首先,我不是CodeIgniter 与 ExtJs Grid 的专家,但我有足够的知识去运用他们。如果您对以下的练习有任何的疑问,请你反馈合理化的建议。
现在,我假定你有足够的CodeIgniter使用经验,我只把例子中的函数贴出来,而不去解析什么是控制器、视图、模型。如果你使用CodeIgniter进行
开发,这些概念是你应该知道的。
更多关于
PHP+MySQL+ExtJs 如何实现,请点击:
http://extjs.com/forum/showthread.php?t=18435
什么是 "如何实现 - CodeIgniter 和 ExtJs Grid."? 这是一个如何在使用MySQL的CodeIgniter
框架中使用ExtJs Grid的实例
CI Model
有以下的模型: 对于我建立的模型,我只是从MySQL中获取我需要的数据用于显示在我的Grid中,如下所示:
复制内容到剪贴板PHP 代码:
function getBoards()
{
$this->db->select('WOrder, PartNumber, WOPartQuantity, PartPriority,
WODateIn, WODateOut, PartState, PartStatus, PartLocation');
$this->db->from('WorkOrder');
$this->db->join('PartNumber', 'WorkOrder.PartNumberID = PartNumber.PartNumberID');
$this->db->join('PartState', 'PartState.PartStateID = WorkOrder.PartStateID');
$this->db->join('PartStatus', 'PartStatus.PartStatusID = WorkOrder.PartStatusID');
$this->db->join('PartPriority', 'PartPriority.PartPriorityID = WorkOrder.PartPriorityID');
$this->db->join('PartLocation', 'PartLocation.PartLocationID = WorkOrder.PartLocationID');
$this->db->limit(15);
$lBoards = $this->db->get();
return $lBoards;
}
上面的代码中,有3个事件发生:
1.-我们使用”db->select()”请求MySQL获取的字段,使用”db->from()”指定从数据表”WorkOrder”中获取数据,使用”db->join()”连接其它表,这是从我的model
文件中复制并粘贴出来的,你可以忽略”db->join()”使查询变得更加简单,但你必须确定你查询的字段必须存在与数据表中
2.- 我们使用"db->get()"指派MySQL的查询到变量$lBoards 中
3.- 最后,返回含有查询结果的变量 "$lBoards".
CI Controller
同样的,有以下的控制器: 在我的控制器中,我只是处理从Model中返回的数据,在这里是"$lBoards".
复制内容到剪贴板PHP 代码:
function index
(){ $this->
load->
view('main-grid');
}function js_listBoards
(){ $Boards =
$this->
Boards->
getBoards();
foreach($Boards->
result() as $row) { $item =
Array("WOrder" =>
$row->
WOrder,
"PartNumber" =>
$row->
PartNumber,
"WOPartQuantity" =>
$row->
WOPartQuantity,
"PartPriority" =>
$row->
PartPriority,
"WODateIn" =>
$row->
WODateIn,
"WODateOut" =>
$row->
WODateOut,
"PartState" =>
$row->
PartState,
"Partstatus" =>
$row->
PartStatus,
"PartLocation" =>
$row->
PartLocation);
$itemList[] =
$item;
} $rows =
$Boards->
num_rows();
$data = json_encode
($itemList);
echo '({"total":"' .
$rows .
'","results":' .
$data .
'})';
} 有几点需要注意:
1.- 留意:控制器中的函数"js_listBoards"没有调用视图,只从主函数调用视图,没别的地方。
2.- 现在,从Model中获取数据到Controller,我们调用方法返回Model中"$lBoards" 的值,在本地声明一个本地变量"$lBoards"
3.- 我们要处理这些行,它们不是单个的值而是二位数组中的一个元素数组。可以使用一个"foreach"获取每一行,并创建"$item" 数组作为二维数组中的第一行的值。
提示: 我建议在这里使用与
数据库相同的字段名,这样能够保留你操作的痕迹以及更快的检查出错误 (此外,您可以在以后的时候定义Grid的表头).
像只有一个数组"$item"并不足够从行中获取整套数据,所以我们把"$item"数组存放在另一个数组"$itemList"中,这将产生一个包含很多数组的数组,直到把数据获取完。
现在,我们有 $rows 和 $data 变量:
$rows: 统计你一共有多少行数据
注意: 你必须获取$row。没有它将不能获取Grid共有多少行数据
$data: 将包含所有通过"foreach"循环获得的数据。你必须使用"json_encode($itemList)"为其重新编码,否则他将在Grid中使用json_reader 创建data store 时无法工作。json_encode 提供样式如下:
({"total":"1","results":[{"WOrder":"97350","PartNumber":"H35146AAD","WOPartQuantity":"3","PartPriority":"Medium","WODateIn":"2007-02-13","WODateOut":"2007-02-16","PartState":"None","Partstatus":"Done ","PartLocation":"Primary"}]})
您可以通过: http://localhost/index.php?c=CONTROLLER&m=METHOD 测试您的函数是否正常工作,并且能看到你的json数据像刚才所表示的一样。
注意: 在CI 配置文件夹您必须做如下设置:
复制内容到剪贴板PHP 代码:
$config['enable_query_strings'] = TRUE;
$config['controller_trigger'] = 'c';
$config['function_trigger'] = 'm';
同样的确保CI配置文件夹中的routes文件做如下设置:
复制内容到剪贴板PHP 代码:
$route['default_controller'] = "listboards";
"listboards" 是我所有代码的控制器。如果你打开您的站点首页看到的是CI的欢迎信息,那说明您没有把它设置成默认的控制器。
注意: 或许还有另外的方法,但我如果不把它设置成默认的控制机,就不能使它正常工作。如果我把默认的控制其设置成原来的”welcome”,使用http://localhost/index.php/listboards 访问,你会发现只读取页面的HTML代码,没有CSS,JS等。Firebug(firefox的一个插件)提示没有错误关于缺少任何文件,但他在您访问默认控制器中是正常的。
And last, but not least the echo statement which is
pretty much straight forward.