既然已经定好了让ZF作为以后我们技术部主流产品的开发框架,我们必须学习ZF了。
现在从一个ZF白痴开始学习,对于ZF的描述就不多说了,可以在gg或者百度里面搜索到很多。
这次学习以最简单的例子开始做起:专辑录
运行环境:zend server + zf 1.10.5 + mysql + windows
所用到的工具:zf.bat ,zf.bat在zf目录bin里面可以找到 因为zendserver集成了zf 及 zf.bat ,所以直接运行代码就可以了
前期工作,建立数据库:zftest 建立表
id int(11) NOT NULL auto_increment,
artist varchar(100) NOT NULL,
title varchar(100) NOT NULL,
PRIMARY KEY (id)
);
建立文件夹zftest
下面我们开始进行zf的学习了。
打开cmd 进入zftest的上级目录 , 运行代码
这时会生成了一些文件及目录架构
不外就是长成这个样子。
其中public是我们的网页访问目录,重点是在application里面,这样放也许是其安全性更好吧,public/index.php只是一个引导文件了,而appliction里面包含了mvc的三个目录。是整个项目的核心。
现在我们在apache里面配置虚拟主机设zftest/public为主目录,重启apache后运行所在的网页我们能看到一个欢迎界面
这是我们的第一个项目。
OK 接下来我们继续完善这个项目,在这个项目里面创建controler,在cmd 里进入到zftest的文件夹。
运行下面几个
zf create action edit Index
zf create action delete Index
代码
我们看看application/controllers/IndexController.php,里面多了几行代码
{
// action body
}
public function addAction()
{
// action body
}
public function editAction()
{
// action body
}
public function deleteAction()
{
// action body
}
.zfproject.xml 也有相应的改变
这时候我们访问index/add的时候,应该就能看到
View script for controller index and script/action name add
如果有错误的话,请看看您的.htaccess 是否打开了路径重写。
打开application/configs/application.ini,这个是项目的基础配置文件。在[production]节下面添加如下代码
resources.db.params.host = localhost
resources.db.params.username = root
resources.db.params.password = 123654
resources.db.params.dbname = zftest
孩子,别那么笨直接复制,这里你应该设置为你的mysql的用户名及密码。
好了,现在我们来创建模型。
还是打开cmd,进入zftest目录,运行zf create db-table Albums albums
这样,我们application/models/DbTable 目录就添加了一个 Albums.php文件,里面有个类为Application_Model_DbTable_Albums
下面我们添加 一些数据库操作的函数在里面了
{
$id = (int)$id;
$row = $this->fetchRow('id = '.$id);
if(!$row)
{
throw new Exception("Could not find this album $id");
}
return $row->toArray();
}
public function addAlbum($artist,$title)
{
$data = array (
'artist' = $artist,
'title' = $title,
);
$this->insert($data);
}
public function updateAlbum($id,$artist,$title)
{
$data = array (
'artist' = $artist,
'title' = $title,
);
$this->update($data,"id = $id ");
}
public function deleteAlbum($id)
{
$id = (int)$id;
$this->delete("id = $id ");
}
就这样一段数据库操作的代码就写好了····
到了这里,我们已经写好了数据库的操作类(model),接下来我们要做的就是做一个view以及controler 与view 的结合。
有点饿,写得简单一点吧。
其实刚刚我们新建controler的时候已经同时新建了view了,每一个view都对应着一个controler。
打开cmd ,进入到项目所在的目录(以后不再提示了) 输入:
回车之后Zend_Tool就为您新建了一个layout, 什么是layout呢,简单来说就是一个模板,一个大框框,就如.net里面的模板页,让你的页面设计更标准化同时更简便。
然后我们打开刚刚新建的layout页面,在/application/layouts/scripts/layout.phtml:输入
$this->headMeta()->appendHttpEquiv('Content-Type', 'text/html;charset=utf-8');
$this->headTitle()->setSeparator(' - ');
$this->headTitle('俺的第一个zf例子');
echo $this->doctype(); ?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<?php echo $this->headMeta(); ?>
<?php echo $this->headTitle(); ?>
</head>
<body>
<div id="content">
<h1><?php echo $this->escape($this->title); ?></h1>
<?php echo $this->layout()->content; ?>
</div>
</body>
</html>
我们看看代码:两点在于
[code] echo $this->layout()->content; [/code]
这里是输出我们的子页面的内容,这个是整个页面的关键。如果没有这句话,啥都是瞎扯淡,您可以试试。
然后我们在application.ini 的[production]节点下加入
这样,当输出 echo $this->doctype(); 的时候,就能得到一下结果。
"http://www.w3.org/TR/html4/loose.dtd">
好,下面让我们加上一些 CSS样式
在application/layouts/scripts/layout.phtml <head>节点里面加入如下代码。
建立CSS文件,路径如下:/public/css/site.css
里面的代码是:
margin: 0 5px;
font-family: Verdana,sans-serif;
}
h1 {
font-size: 1.4em;
color: #008000;
}
a {
color: #008000;
}
/* Table */
th {
text-align: left;
}
td, th {
padding-right: 5px;
}
/* style form */
form dt {
width: 100px;
display: block;
float: left;
clear: left;
}
form dd {
margin-left: 0;
float: left;
}
form #submitbutton {
margin-left: 100px;
}
好了,现在我们来丰富我们的行为,也就是完善我们的controler
打开我们的/application/controllers/IndexController.php
{
$albums = new Application_Model_DbTable_Albums();
$this->view->albums = $albums->fetchAll();
}
这里将我们刚刚的Application_Model_DbTable_Albums 这个类实例化了,并获取了所有的专辑。
然后将这个专辑传到view/index.phtml里面,供其使用。
吼吼,打开我们的/application/views/scripts/index/index.phtml。加入如下代码。
$this->title = "专辑列表";
$this->headTitle($this->title);
?>
<p><a href="<?php echo $this->url(array('controller'=>'index',
'action'=>'add'));?>">添加新专辑</a></p>
<table>
<tr>
<th>专辑</th>
<th>作者</th>
<th> </th>
</tr>
<?php foreach($this->albums as $album) : ?>
<tr>
<td><?php echo $this->escape($album->title);?></td>
<td><?php echo $this->escape($album->artist);?></td>
<td>
<a href="<?php echo $this->url(array('controller'=>'index',
'action'=>'edit', 'id'=>$album->id));?>">编辑</a>
<a href="<?php echo $this->url(array('controller'=>'index',
'action'=>'delete', 'id'=>$album->id));?>" onclick="return confirm('你真的要删除 <?php echo $this->escape($album->artist);?> 的<?php echo $this->escape($album->title);?> 吗?')">删除</a>
</td>
</tr>
<?php endforeach; ?>
</table>
$this->title = "专辑列表";
$this->headTitle($this->title);
这是两个很好玩的代码,我们可以看到这里我们的标题是先有此页面的标题,还有layout的标题一起了。
当我们打开主页的时候(我的是http://localhost:7777/)就能看到如下主页。
好了,好了,搞了这么久,我们都要添加专辑了,如何做呢????
现在按添加肯定出错的,不信你试试。
接下来我们要做两件事情。
1、显示这些form标签
2、提交,处理这些form标签
老规矩,运行代码
这样就生成了application/forms/Album.php
编辑它。输入以下代码
class Application_Form_Album extends Zend_Form
{
public function init()
{
$this->setName ( 'album' );
$id = new Zend_Form_Element_Hidden ( 'id' );
$id->addFilter ( 'Int' );
$artist = new Zend_Form_Element_Text ( 'artist' );
$artist->setLabel ( '作者' )->setRequired ( true )->addFilter ( 'StripTags' )->addFilter ( 'StringTrim' )->addValidator ( 'NotEmpty' );
$title = new Zend_Form_Element_Text ( 'title' );
$title->setLabel ( '专辑' )->setRequired ( true )->addFilter ( 'StripTags' )->addFilter ( 'StringTrim' )->addValidator ( 'NotEmpty' );
$submit = new Zend_Form_Element_Submit ( 'submit' );
$submit->setAttrib ( 'id', 'submitbutton' );
$this->addElements ( array ($id, $artist, $title, $submit ) );
}
}
setRequired 是代表这是必须填写的
addFilter 是代表这是可以过滤某些标记的,例如StripTags:网页标记,StringTrim:空白键
addValidator是代表这要经过非空验证
Zend_Form_Element_Hidden ,Zend_Form_Element_Text,Zend_Form_Element_Submit等都是zf封装好的form类,具体以后可以慢慢了解。
亮点在于$this->addElements ( array ($id, $artist, $title, $submit ) );
说明这个form里面有着刚刚新建的那么几个form标签组。
再打开我们的/application/controllers/IndexController.php
在addAction里面加入一些新增的处理代码。
{
$form = new Application_Form_Album ();
$form->submit->setLabel ( '添加' );
$this->view->form = $form;
if ($this->getRequest ()->isPost ())
{
$formData = $this->getRequest ()->getPost ();
if ($form->isValid ( $formData ))
{
$artist = $form->getValue ( 'artist' );
$title = $form->getValue ( 'title' );
$albums = new Application_Model_DbTable_Albums ();
$albums->addAlbum ( $artist, $title );
$this->_helper->redirector ( 'index' );
}
else
{
$form->populate ( $formData );
}
}
}
看不懂?别急,我们一段段来看:
$form->submit->setLabel ( '添加' );
$this->view->form = $form;
这是将刚刚添加的form(Application_Form_Album )在add的view里面显示,并将里面的submit的标签设置为添加。
$formData = $this->getRequest()->getPost();
if ($form->isValid($formData)) {
这里是判断状态,如果按了submit的时候,就会进入post的状态,这时候就执行获取这个form里面的post值,如果通过验证的话,将执行下面的语句了。
$title = $form->getValue('title');
$albums = new Application_Model_DbTable_Albums();
$albums->addAlbum($artist, $title);
这里都是获取并处理post值的函数。我们又实例化了Application_Model_DbTable_Albums类
并添加了一个专辑。
这里绝对是一个亮点,我们能跳转页面了。
$form->populate($formData);
}
如果不是通过form验证的话,就显示form的错误数据。
打开/application/views/scripts/index/add.phtml
我们看看view里面的代码
$this->title = "添加新专辑";
$this->headTitle ( $this->title );
echo $this->form;
?>
echo $this->form; 是一段很给力的语句,显示了我们的form,如果没有你,我的世界会变得一片空白。
接下来的代码就差不多了。
打开我们的/application/controllers/IndexController.php
输入:
{
$form = new Application_Form_Album ();
$form->submit->setLabel ( '保存' );
$this->view->form = $form;
if ($this->getRequest ()->isPost ())
{
$formData = $this->getRequest ()->getPost ();
if ($form->isValid ( $formData ))
{
$id = ( int ) $form->getValue ( 'id' );
$artist = $form->getValue ( 'artist' );
$title = $form->getValue ( 'title' );
$albums = new Application_Model_DbTable_Albums ();
$albums->updateAlbum ( $id, $artist, $title );
$this->_helper->redirector ( 'index' );
}
else
{
$form->populate ( $formData );
}
}
else
{
$id = $this->_getParam ( 'id', 0 );
if ($id > 0)
{
$albums = new Application_Model_DbTable_Albums ();
$form->populate ( $albums->getAlbum ( $id ) );
}
}
}
有点不同的是
if ($id > 0) {
$albums = new Application_Model_DbTable_Albums();
$form->populate($albums->getAlbum($id));
}
这里如果不是post 状态的时候,我们就要填充值。$form->populate($albums->getAlbum($id));这个语句为我们做了不少贡献。
打开/application/views/scripts/index/edit.phtml并输入
$this->title = "Edit album";
$this->headTitle($this->title);
echo $this->form ;
?>
好了,好了,我们的添加修改都搞定了,现在做删除。
打开我们的/application/controllers/IndexController.php
输入
{
$id = $this->_getParam ( 'id', 0 );
if ($id > 0)
{
$albums = new Application_Model_DbTable_Albums ();
$albums->deleteAlbum ( $id );
}
$this->_helper->redirector ( 'index' );
}
第一期 完工~!
这里献上代码