Submitted by aming on 2008, March 17, 9:19 AM
昨天讲到了删除操作!今天继续啊!!
我先介绍一下编辑
复制内容到剪贴板
代码:
function actionEdit() {
$jh = $this->_tbJh->find((int)$_GET['id']);
require("input_edit.php");
}
第一行:通过数据库对象的find函数,这个函数传递进去的是一个$conditions参数,这个$conditions可以有很多中形式,
1.可以像我这样通过一个主键值来查询,返回符合条件的一条记录
2.可以是一个字符串:$conditions = "name = 'dreampig'";就是查询name是dreampig的记录,如果有两条记录,那么以数组方式返回符合条件的第一条记录及所有关联的数据。
3.可以是一个数组方式:$conditions = array("name <> 'dreampig'", "sno = '020497'");就等同于 name <> 'dreampig' AND sno = '020497'
当然查询还有其他几个函数:findByField(),里面的参数有$field, $value, $sort = null, $fields = '*',其实就是根据条件来查询,例如findByField('sno','020497'),其实就是和find("sno='020497'")是 一样的效果
第二行:就是调用编辑页面,对应的字段填值。
处理编辑的action代码如下所示:
复制内容到剪贴板
代码:
function actionEditPost(){
$this->_tbJh->update($_POST);
$this->_goBack();
}
第 一行:直接使用数据库对象的update函数进行更新我这是更新整个数据库字段,当然更新的时候在$_POST里面必须有主键这个值,不然会出现错误。所 以在编辑页面要加上一个hidden字段,不然会出现错误。更新函数还有updateByConditions(),updateField(),
第一个函数的参数是$conditions, $row, $checkCommend = false 所以其实就是根据$conditions来进行更新函数,$row就是传进来要修改的值,这个函数就不一定要求在$row里面有主键值了。
如下代码所示
复制内容到剪贴板
代码:
$row=array(
"depart='cise'",
"score='95'"
)
$conditions="sno='020497'";
$this->_tbJh->updateByConditions($conditions,$row),
上面的代码表示update 表 set depart='cise',score='95' where sno='020497'
第二个函数表示的参数是$conditions, $field, $value,其实就是updateByConditions()的细化版本,每次只能更新一个字段,
$conditions和上面的一样的意思,$field表示一个字段名称,$value表示要把改字段更新后的字段值。
最后再来讲讲excel的导出。
复制内容到剪贴板
代码:
function actionExpot(){
require("input_expot.php");
}
导出页面引入,在这个页面里面其实就是选择时间,然后在在处理页面里面查询出来然后导出数据
复制内容到剪贴板
代码:
function actionExpotPost(){
$y=$_POST["year"];
$m=$_POST["month"];
if (strlen($m)<2) {
$m="0".$m;
}
$sdt=$y."-".$m."-01";
$edt=$y."-".$m."-31";
$condition=array("`kprq` >= '$sdt'","`kprq` <= '$edt'");
$rowset = $this->_tbJh->findAll($condition);
header('Content-type:application/x-msexcel');
$str="Content-Disposition:filename=\"".$y."年".$m."月进货表.xls\"";
header($str);
echo "XX公司".$y."年".$m."月进项表\n";
echo "序号\t开票日期\t名称\t销售单位\t数量\t单价\t总额\t税率\t税额\t价税总计\n";
$i=1;
foreach($rowset as $row){
echo $i."\t";
echo $row["kprq"]."\t";
echo $row["name"]."\t";
echo $row["dw"]."\t";
echo $row["sl"]."\t";
echo $row["dj"]."\t";
echo $row["zj"]."\t";
$this->zj+=$row["zj"];
echo "%17\t";
echo $row["se"]."\t";
$this->se+=$row["se"];
echo $row["total"]."\t";
echo "\n";
$this->total+=$row["total"];
$i++;
}
echo "\n\n\n";
echo "\t".$m."月小计\t发票".($i-1)."张\t\t\t\t".$this->zj.
"\t\t".$this->se."\t".$this->total."\t\n";
}
首 先我是处理一下传递过来的年月,使得和数据里面的date格式一致。然后使用findall函数查询所有的数据记录,findall有四个参数:$ conditions = null, $sort = null, $limit = null, $fields = '*' 我们可以根据自己的要求选择出来
我上面的例子已经说明了怎么应用了。含有一个findAllByField()的函数,他也可以查询所有记录,其实就是findall的简化版本,他的参 数是$field, $value, $sort = null, $limit = null, $fields = '*',其实就是把前面两个参数组合成一个条件,然后调用findall函数$conditions="$field='$value'"
Tags: fleaphp, php, mysql, 框架, ajax
FleaPHP | 评论:0
| Trackbacks:0
| 阅读:243
Submitted by aming on 2008, March 17, 9:19 AM
原作:DreamPig
上次我们讲到进货信息展示,接着我继续讲解
一下是我的管理类的代码
复制内容到剪贴板
代码:
<?php
$i = 0;
foreach($rowset as $row):
$css_class = $i % 2 ? 'even' : 'odd';
$rowid = array('id' => $row[$pk]);
?>
<tr class="<?php echo $i % 2 ? 'odd' : 'even'; ?>"
onmouseover="this.className = 'row_over';"
onmouseout="this.className = '<?php echo $i % 2 ? 'odd' : 'even'; ?>';">
<td align="center" nowrap="nowrap"><?php echo $page*20+$i+1; ?></td>
<td nowrap="nowrap"><?php echo_h($row['name']); ?> </td>
<td align="left" nowrap="nowrap"><?php echo_h($row['dw']); ?></td>
<td align="center" nowrap="nowrap"><?php echo $row['kprq']; ?></td>
<td align="center" nowrap="nowrap"><?php echo $row['sl']; ?></td>
<td align="center" nowrap="nowrap"><?php echo $row['dj']; ?></td>
<td align="center" nowrap="nowrap"><?php echo $row['zj']; ?></td>
<td align="center" nowrap="nowrap"><?php echo $row['se']; ?></td>
<td align="center" nowrap="nowrap"><?php echo $row['total']; ?></td>
<td nowrap="nowrap">
<a href="<?php echo $this->_url('edit', $rowid); ?>">修改</a>
|
<a href="<?php echo $this->_url('remove', $rowid); ?>"
onclick="return confirm('删除吗?');">删除</a>
</td>
</tr>
<?php $i++; endforeach; ?>
</table>
上 面的信息就是我把通过数据库对象获得数据一个一个的显示出来,可能大家会注意到上面有 $this->_url()这个函数,这个函数是对于url()函数的简化版本,$this->_url()这个函数的第一个参数表示url ()里面的第二个action参数,第二个参数就是url的第三个参数,而他的controller就是继承这个类的controller。
复制内容到剪贴板
代码:
<?php if ($pager->count > 0): ?>
<table width="100%" border="0" cellpadding="2" cellspacing="0">
<tr>
<td bgcolor="#FCFCFC"><input name="FirstPage" type="button" id="FirstPage" value=" |< "
onclick="fnOnPageChanged(<?php echo $pager->firstPage; ?>);" />
<input name="PrevPage" type="button" id="PrevPage" value=" < "
onclick="fnOnPageChanged(<?php echo $pager->prevPage; ?>);" />
<?php $pager->renderPageJumper('第 %u 页'); ?>
<input name="NextPage" type="button" id="NextPage" value=" > "
onclick="fnOnPageChanged(<?php echo $pager->nextPage; ?>);" />
<input name="LastPage" type="button" id="LastPage" value=" >| "
onclick="fnOnPageChanged(<?php echo $pager->lastPage; ?>);" />
</td>
</tr>
</table>
<?php else: // if ($pager->count > 0) ?>
<table width="100%" border="0" cellpadding="2" cellspacing="0">
<tr>
<td>没有信息</td>
</tr>
<tr>
<td></td>
</tr>
</table>
<?php endif; // if ($pager->count > 0) ?>
<table width="100%" border="0" cellpadding="2" cellspacing="0">
<tr>
<td><?php
printf("共有信息 <strong>%u</strong> 条,符合检索条件的共有
<strong>%u</strong> 条记录,分为 <strong>%u</strong> 页显示,
当前查看的是第 <strong>%u</strong> 页", $pager->totalCount,
$pager->count, $pager->pageCount, $pager->currentPage + 1);
?>
</td>
</tr>
</table>
上面这段代码我完全是抄袭shop里面的代码,就是上下分页的代码,大家可以看见fnOnPageChanged()这个js函数如下所示
复制内容到剪贴板
代码:
function fnOnPageChanged(page) {
var url = '<?php echo $this->_url(null); ?>&page=' + page;
document.location.href = url;
}
其实很简单就是传递一个page参数。
接着我继续讲解remove操作
复制内容到剪贴板
代码:
function actionRemove() {
$this->_tbJh->removeByPkv($_GET['id']);
$this->_goBack();
}
很 明显的可以看见我这里是调用了数据库对象的removeByPkv()函数,其实数据库对象里面对于删除还有其他两个函数remove()和 removeByConditions(),根据他们函数的名字我们就可以看出来了,removeByPkv()函数就是根据传进去的主键去删除记录, remove()是根据传进去的包含主键在内的内容的记录,removeByConditions()函数就是删除符合条件的记录,返回删除的记录数量。 还有一个超级牛的函数removeAll(),不到万不得已千万不要用啊!用了就删除你的所有记录了!
Tags: fleaphp, php, mysql, 框架, ajax
FleaPHP | 评论:0
| Trackbacks:0
| 阅读:328
Submitted by aming on 2008, March 17, 9:18 AM
原作:DreamPig
今天我就讲解一下数据列表的显示和一些编写的思路。大家都知道前面一篇我已经写好了添加数据的函数,那个函数其实很简单
复制内容到剪贴板
代码:
/**
* 显示添加页面
*/
function actionIndex() {
require(APP_DIR . '/input_add.php');
}
上 面这个就是说我现在包含进来了input_add.php这个文件,然后在页面上面显示出来。我在我的input_add.php里面的开头判断了是否是 直接调用的!就是说所有的显示页面之前度应该有判度一个在index.php里面定义的变量是否已经定义了,如果是就可以执行,如果不是就显示错误信息, 这样就作到了同意入口的安全性之一。至少我是这样理解的!在这个页面里面的所有连接最好用url函数来生成。
复制内容到剪贴板
代码:
/**
* 处理添加事件
*/
function actionAddPost() {
$this->_tbInput->create($_POST);
$this->actionShow();
}
这 个函数的意思就是在input_add.php这个页面里面的post过来的数据我直接就使用使用我内部的数据库对象的create函数来添加信息,这个 就是我们这个框架的优点之一————————不用自己写sql语句,直接传个数组给这个函数就可以添加数据了。以下信息拷贝原文:
(当数据表中具有名为 created、created_at 或 created_on 的字段,并且字段类型为整数或日期,则在向这个数据表插入记录时。FleaPHP 会自动用当前时间填充该字段。同样的,updated、updated_at 或 updated_on 字段会在更新记录时用当前时间填充。)
复制内容到剪贴板
代码:
/**
* 显示列表
*/
function actionIndex() {
$page = isset($_GET['page']) ? (int)$_GET['page'] : 0;
load_class('FLEA_Helper_Pager');
$table =& $this->_tbInput;
$pager =& new FLEA_Helper_Pager($table, $page);
$pk = $table->primaryKey;
$rowset = $pager->findAll();
$this->_setBack();
include(APP_DIR . '/InputList.php');
}
上面的代码我一行一行给大家解释下来
第一行:接受分页类的传递过来的页码,看现在已经在那一页了,如果没有就默认为0
第二行:加载分页类,由于默认没有加载此扩展
第三行:获得一个 TableDataGateway 对象,为了下面的分页类服务
第四行:定义一个分页类,里面的参数我一个一个介绍一下,第一个参数是一个 TableDataGateway 对象,那么则FLEA_Helper_Pager 会调用该 TDG 对象的 findCount() 和 findAll() 来确定记录总数并返回记录集。第二个参数就是当前页码
第五行:获得当前对象的主键
第六行:返回当前页对应的记录集
第七行:设置当前页的地址,这个就是一个玄机了,如果记录很多的时候,你刚好在第六页,那个时候你删除或者修改了第六页中的某一个记录,那么可能就会直接跳到第一页去了。我现在这样记录下来就是为了防止这种情况。大家以后设计的时候可以参考一下这种思想。
第八行:这个就是现在展示页面的显示,里面可以通过foreach函数把rowset里面的数据显示出来
Tags: fleaphp, php, mysql, 框架, ajax
FleaPHP | 评论:0
| Trackbacks:0
| 阅读:379
Submitted by aming on 2008, March 17, 9:17 AM
原作:DreamPig
昨天大致上讲了一下我们开始工作的一些步骤,今天我将详细讲解一下每个步骤的工作!
在第三步里面我们已经开始MVC设计了!这里面,我们的M其实就是两个数据库表对应的类
在我的项目里面我建立了两个数据库表input和output两张表格,input是用来存储进货项,output用来储存出货项。
那么在我的cwrj/lib/cwrj/Model/下面有两个文件,分别是input.php和output.php。两张表都是FLEA_Db_TableDataGateway的继承类,用来操作相应的数据库表。例如我的input.php里面的代码是如下所示的:
复制内容到剪贴板
代码:
class Model_input extends FLEA_Db_TableDataGateway
{
/**
* 数据表名称
*
* @var string
*/
var $tableName = 'input';
/**
* 主键字段
*
* @var string
*/
var $primaryKey = 'id';
}
这样就完成了我们的第一步的Model的设计,V是最复杂的一个东西!
v是用来控制我们的请求的例如有这样的地址http://www.xxx.com/index.php?control=input&action=add
就表示要访问在我们的/cwrj/lib/cwrj/Controller/下面的input.php文件里面的addAction函数
所以我们预先要设置好我们要做那一些工作例如在input.php文件里面我这样写
复制内容到剪贴板
代码:
class Controller_input extends FLEA_Controller_Action
{
/**
* 提供数据库访问服务的对象
*
* @var _input
*/
var $_tbInput;
/**
* 构造函数
*/
function Controller_input() {
$this->_tbInput =& get_singleton('Model_input');
}
/**
* 显示添加页面
*/
function actionIndex() {
require(APP_DIR . '/input_add.php');
}
/**
* 处理添加事件
*/
function actionAddPost() {
$this->_tbInput->create($_POST);
$this->actionShow();
}
......
}
Tags: fleaphp, php, mysql, 框架, ajax
FleaPHP | 评论:0
| Trackbacks:0
| 阅读:313
Submitted by aming on 2008, March 17, 9:14 AM
原作:DreamPig
最近这几天一直在研究FleaPHP的代码,当然不可能去读取每一行代码咯。今天我就大概说一下我是怎么学习FleaPHP的吧。希望对大家有一定的帮助。
我是以自己写的一个小测试项目开始做起的!我的目标是做一个很简单的数据录入(包括增删改)和导出数据至excel!说一下每个的目的:数据库函数的测试 -----增加为了测试数据库中的 create函数,删除为了测试removeByPkv函数,改当然是为了测试update函数。同时在显示的时候需要用到Pager组件,用来做分页。 而导出仅仅是觉得可以研究一下excel的导出问题!可能以后会把此功能发布在以后的版本里面!废话不多说了!开始吧:
首先当然是建立项目的目录结构,我的项目结构如下所示
/cwrj
--/images
--/css
--/js
--/lib
----/flea
----/cwrj
------/Controller
------/Model
------/Config
index.php
.
.
以上只是我的项目的结构,可能有人会问为什么用cwrj这个名称,就是我这个测试项目的名称咯(财务软件,哈哈);具体的结构安排可以看老廖的开发指南之 命名规范和目录结构
http://www.fleaphp.org/node/17
然后就是打开zend咯,zend还没有使用的朋友我推荐大家先去下载一个(我觉得很好的东西)。打开之后点击项目菜单-》新建项目跳出一个窗口填写一下 你的项目名称,点击下一步,添加路径把cwrj这个项目结构包含进来,然后如果想设置编码什么的点击下一步进行设置,不然点击完成就可以了。
整个的项目框架我已经搭建好了,接下来就是开始我们的程序编写咯!
1.编写自己的配置文件,就是放在cwrj/lib/cwrj/Config/下面的文件,具体怎么配置大家可以参考一下老廖的开发指南之应用程序设置:http://www.fleaphp.org/node/23
2.编写Index.php,里面其实很简单的!就是一个require,一个regist_app_inf,一个import,最后一个run()就ok了。
3.开始我们的mvc模式之旅咯:
今天我就把整个的流程说一下,具体的首先我们整个的框架默认的访问是Controller下面的default类,里面的index函数,这个函数就是我 们在浏览器里面打进去http://www.xxx.com/index.php执行的函数。我们可以先小小的测试一下echo “heello world”;
看到浏览器输出了吗?看到了话,就说明前面做的所有工作都是right的!
Tags: fleaphp, php, mysql, 框架, ajax
FleaPHP | 评论:0
| Trackbacks:0
| 阅读:309
Submitted by aming on 2008, March 14, 10:48 AM
JQuery 使用技巧 一
JQuery 使用技巧 二
JQuery 使用技巧 三
JQuery 使用技巧 四
10、几个实用特效功能
其中toggle()和slidetoggle()方法提供了状态切换功能。
如toggle()方法包括了hide()和show()方法。
slideToggle()方法包括了slideDown()和slideUp方法。
11、几个有用的jQuery方法
$.browser.浏览器类型:检测浏览器类型。有效参数:safari, opera, msie, mozilla。如检测是否ie:$.browser.isie,是ie浏览器则返回true。
$.each(obj, fn):通用的迭代函数。可用于近似地迭代对象和数组(代替循环)。
如
» 阅读全文
Tags: ajax, javascript, php, jquery
JQUERY | 评论:0
| Trackbacks:0
| 阅读:300
Submitted by aming on 2008, March 14, 10:46 AM
JQuery 使用技巧 一
JQuery 使用技巧 二
JQuery 使用技巧 三
JQuery 使用技巧 四
5、集合处理功能
对于jquery返回的集合内容无需我们自己循环遍历并对每个对象分别做处理,jquery已经为我们提供的很方便的方法进行集合的处理。
包括两种形式:
6、扩展我们需要的功能
$.extend({
min: function(a, b){return a < b?a:b; },
max: function(a, b){return a > b?a:b; }
}); //为jquery扩展了min,max两个方法
使用扩展的方法(通过“$.方法名”调用):
alert("a=10,b=20,max="+$.max(10,20)+",min="+$.min(10,20));
» 阅读全文
Tags: ajax, javascript, php, jquery
JQUERY | 评论:0
| Trackbacks:0
| 阅读:412
Submitted by aming on 2008, March 14, 10:46 AM
JQuery 使用技巧 一
JQuery 使用技巧 二
JQuery 使用技巧 三
JQuery 使用技巧 四
四、语法总结和注意事项
1、关于页面元素的引用
通过jquery的$()引用元素包括通过id、class、元素名以及元素的层级关系及dom或者xpath条件等方法,且返回的对象为jquery对象(集合对象),不能直接调用dom定义的方法。
» 阅读全文
Tags: ajax, javascript, php, jquery
JQUERY | 评论:0
| Trackbacks:0
| 阅读:349