`

CakePHP 中文教程3

    博客分类:
  • web
阅读更多

第五章 Scaffolding (脚手架?)

Scaffolding是一个很棒的途径,使得早期开发的部分web应用能够运行起来。早期的数据库模式是不稳定的,很容易变化。Scaffolding有个下降趋势:web程序员憎恨创建以后可能根本用不到的forms。为了减少程序员的这种重复劳动, Cake中包含了ScaffoldingScaffolding分析数据库,创建一些标准的使用adddelete、和edit按钮的lists,创建输入的forms,以及查看数据库中一个item的标准views。为了在程序中的controller中添加Scaffolding,需要添加$scaffold变量:

注意save操作是如何放置在一个条件语句中:如果你试图保存数据到model中,cake自动尝试确数据正确(根据你提供的规则)。可以查看第十章了解更多关于正确规则(validation).如果不想查看正确性直接保存数据,使用save($data,false);



其他有用的保存方法:

●savaFieldId($name,$value)

○保存一个单field的值

●getLastInsertID()

○返回最近创建记录的ID



1.4 Model的Callbacks

在我们接近0.10.x最终版的时候,我们添加了一些model的回调函数,允许用户能够逻辑上悄悄的在model操作前或操作后执行。为了在应用中获得这种方法,在model中使用提供的参数,重载下面的这些方法

●beforeFind($conditions)

○这个回调函数在一个查询操作开始之前执行。将查询前的操作逻辑放到这个方法里面。当你在model中重写(override)这个方法时,当你想要find操作执行时候返回true,当你想要执行中止时候返回false

●afterFind($results)

○使用这个回调函数可以修改从find操作中返回的结果,或者实现其他任何的find后逻辑。这个函数的参数是model的find操作的结果,返回的是修改后的结果。

●beforeSave()

○在这个函数中放置任何保存前的逻辑。如果你像保存操作执行则返回true,否则返回false

●afterSave()

○放置任何你想要在保存后执行的代码在这个回调函数中

●beforeDelete()

○放置删除前的逻辑代码。想要删除操作执行则返回true,否则返回false

●afterDelete()

○放置任何你想要在删除后执行的代码在这个回调函数中



2. Model 变量

当你创建你的models时候,你可以设置一些特殊的变量,来获得对Cake函数的使用。

●$primaryKey

○如果这个model关联到一个数据库的table,而且数据库的主键并不是id,那么使用这个变量来告诉Cake主键的名字

●$transactional

○告诉Cake该model是否支持传输(举例 begin/commit/rolback),设置为boolea值。

●$useTable

○如果你想使用的数据库的table并不是model名的复数形式,而且你也不想改变table名,设置这个变量为table名

●$validate

○确认传递给model的数据是否正确的一个数组。查看第十章

●$useDbConfig

○还记得数据库设置中,你可以在/app/config/database.php文件中设置么?使用这个变量可以交换他们

classCategoriesControllerextendsAppController
{
var$scaffold
;
}

有关Scaffold,要注意一个重要的问题: Scaffold期望每个以_id结尾的filed name是一个外键并且指向一个tabletable的名称和_id前方的一样(只不过是小写的)。所以,举个例子来说,如果你嵌套了分类,你最好有个列叫做parent_id。在这个版本中,最好能够命名为parentid.同样,在表中有一个外键(比如,titles table有个category_id,并且你已经合适的联结到models(查看6.2理解联结),在show/edit/newdviews中,选择的表将会和外键的表(category)一起自动的表现出来(原文:a select box will be automatically populated with the rows from the foreign table (category) in the show/edit/new views.)。在foreign model中设置$displayField来决定foreign中哪些field会被显示。继续我们的例子,category有个标题
classTitleextendsAppModel
{
var$displayField
='title';
}

第六章 Models

本章内容:

1. Model Function

1.1 用户定义的Function

1.2 检索(retrieving)你的数据

1.3 保存你的数据

1.4 Model的回调(callbacks

2. Model的变量

3. Associations

Model是什么,它是MVC模式中的M

Model做些什么。它使得domain logicpresentation分隔开,独立application logic(It separates domain logic from the presentation, isolating application logic.)

一个Model概要的说就是一个指向数据库的access,更具体,就是数据库中的特定的table。默认的,每个model都使用自身名字复数形式的table,比如,User Mode使用 users

tableModels可以维护数据特定的规则,联结信息以及它使用的table的方法。

1. Model的方法

PHP的观点看,models都是从AppModel类继承来的类。类AppModel原始是定义在 /cake目录下。你也可以创建自己的放在 app/app_model.php.这个文件应该包含一些可供多个models共享的方法。AppModel本身也是从Model类继承而来的,Model类是一个标准的Cake库,定义在 libs/model.php

注意

虽然本节介绍的是Model中常用的方法,然而记住:更详细的参考请到http://api.cakephp.org

1.1 用户定义的方法

下面是model中一个特定table的例子,该例子实现了在blog中显示和隐藏两种方法

6.1 Example Model Functions

<?php
classPostextendsAppModel
{
functionhide($id
=null)
{
if($id)$this->setId($id)
;
$this->set('hidden','1');
$this->save();
}

functionunhide($id
=null)
{
if($id)$this->setId($id)
;
$this->set('hidden','0');
$this->save();
}
}
?>

1.2 检索数据

下面是使用model得到数据的一些标准方法

findAll($conditions,$fields,$order,$limit,$page,$recursive)

○返回特定的fieldsfields$limit(默认是50)个记录,匹配$conditions(如果有),从第$page(默认1)页开始列表,$conditions内容应该像SQL语句中的一样,比如:$conditions=”race = ‘wookie’ AND thermal_detonators><chmetcnv w:st="on" unitname="”" sourcevalue="3" hasspace="False" negative="False" numbertype="1" tcsc="0">3”</chmetcnv>

○当$recursive选项设置成13的整数,findAll()将会试图返回在联结到该model中发现的所有项的models.这项递归寻找可以深入3层。

find($conditions, $fields, $order, $recursive)

○返回匹配$conditions的第一条记录的制定的fields(如果没有指定则返回全部)

$recursive作用同上

findAllBy<FieldName>($value) and findBy<FieldName>($value)

○这些奇妙的方法可以用于指定特定的field和特定的value快速查找行,你要做的就是把你的field用驼峰表达法添加在后面。举个例子(用于controller中)

$this->Post->findByTitle('MyFirstBlogPost');
$this->Author->findByLastName('Rogers');
$this->Property->findAllByState('AZ');
$this->Specimen->findAllByKingdom('Animalia');

返回的结果是一个数组,和find()以及findAll()返回的结果是一个形式

field($name,$conditions,$order)

○根据$order排序,根据条件$conditions,将第一条记录中的field值,作为string返回

findCount($conditions)

○返回匹配$conditions的记录的个数

generateList

($conditions=null,$order=null,$limit=null,$keyPath=null,$valuePath=null)

<shapetype id="_x0000_t202" path="m,l,21600r21600,l21600,xe" o:spt="202" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><path o:connecttype="rect" gradientshapeok="t"></path></shapetype> ○根据modelslists,得到一系列key的值,特别是根据model list创建<select>list$conditions, $order, $limit参数使用方法和上面相同。$keyPath$valuePath是你告诉model那里去找keysvalues来成list。举个例子,基于Role model,你想生成一个由ids(类型integer)当作key,由roles当作valuelist,这个方法调用形式如下:

$this->set(
'Roles'
,
$this->Role->generateList(null
,'role_nameASC',null,'id','role_name')
)
;

//Thiswouldreturnsomethinglike:
array(
'
1'=>'AccountManager',
'
2'=>'AccountViewer',
'
3'=>'SystemManager',
'
4'=>'SiteVisitor'
)
;

read($fields=null, $id=null)

○使用这个方法从当前装载的记录或者由$id指定的记录中得到fields和值

特定的Sql调用可以使用modelfindBySql()方法。举例,在blog应用中,我想存储一个发贴者的first name到一个table中,但是这个table并不是我的cake schema中的一部分。我就可以通过这个model中的一个特定的方法

6.2 Custom Sql Calls With findBySql()

<?php
classPostextendsAppModel
{
functionposterFirstName()
{
$ret
=$this->findBySql("SELECTfirst_nameFROMposters_table
WHEREposter_id=1
");
$firstName=$ret[0]['first_name'];
return$firstName;
}
}
?>

当然也有query()方法,如果执行成功返回true,失败返回false。因为query语句并不是都返回结果集。比如“DELETE FROM problems WHERE solved = true

1.3 保存数据

为了保存你的数据到model中,你应该向model提供你想要保存的数据。这些数据提交给save()方法应该以下面的形式保存

Array
(
[modelname]=>Array
(
[fieldname1]=>value
[fieldname2]=>value
)
)

form表单提交(post方法)的数据会自动排列成这种形式,并且放置到controller中的$this->params[‘data’],因此,通过webform表单保存数据非常简单。一个controller的编辑方法可能会像下面这样显示:


functionedit($id)
{
//Note:Thepropertymodelisautomaticallyloadedforusat$this->property.
//Checktoseeifwehaveformdata
if(isset($this->params
['form']['data']['property']))
{
//Here'swherewetrytosaveourdata
if($this->property->save($this->params
['data']))
{
//Showtheuserthatherdatahasbeensaved
$this->flash('Yourinformationhasbeensaved.'
,
'/properties/edit/'.$this->params
['data']['property']['id'],2);
exit();
}
else
{
//Ifthedatacouldn'tbevalidated
,showthevalidationerrors
//andrepopulateformfieldswithsubmitteddata
$this->set('form'
,$this->params['data']);
$this->validateErrors($this->property);
$this->render();
}
}
//Ifnoformdatawassubmitted
,justrendertheeditview
$this->render()
;
}

分享到:
评论

相关推荐

    PHP的框架之CakePHP-CakePHP教程终极教程

    CakePHP的中文及英文教程,CHM格式;CakePHP的中文打印版教程,WORD格式,下载后可直接打印,方便的;CakePHP的HTML格式的教程;CakePHP的使用技巧介绍;CakePHP开发的网站源码参考;CakePHP的中文资料很少,大部分...

    PHP的框架之CakePHP-CakePHP教程

    CakePHP的中文及英文教程,CHM格式;CakePHP的中文打印版教程,WORD格式,下载后可直接打印,方便的;CakePHP的HTML格式的教程;CakePHP的使用技巧介绍;CakePHP开发的网站源码参考;CakePHP的中文资料很少,大部分...

    cakephp中文手册

    总之,无论你是初学者还是经验丰富的开发者,这份“CakePHP中文手册”都将是你探索和掌握这个强大框架的宝贵工具,帮助你在PHP开发领域更上一层楼。通过深入学习和实践,你将能够高效地构建出稳定、安全且易于维护的...

    CakePHP中文手册

    CakePHP中文手册作为开发者的重要参考资料,包含了全面的API文档、教程、最佳实践以及常见问题解答,帮助开发者更好地理解和运用CakePHP。 在**中文手册**中,你将找到以下关键知识点: 1. **安装与配置**:包括...

    CakePHP 中文手册.rar

    CakePHP是一个开源的PHP on rails的full-stack framework。最开始从Ruby On Rails框架里得到灵感。程序员可使用它来快速创建的Web应用程序。我们的首要目的是使你以一种预置的快速且不失灵活性的方式开展工作。

    CakePHP PHP MVC框架

    - **Cake中文手册.chm**:这是官方中文文档,包含了详尽的API参考和教程,帮助开发者快速掌握CakePHP的使用方法。 - **访问脚本之家.html**:可能是一个关于CakePHP或其他PHP技术的文章链接,提供更多的学习资源。 -...

    cakephp中文手册.pdf

    《CakePHP中文手册》是针对CakePHP框架的一份详细教程,旨在帮助开发者理解和使用这个基于MVC模式的PHP框架。本文将围绕手册中的核心概念和安装流程进行详述。 **一、MVC模式** MVC(Model-View-Controller)是一...

    php各类框架手册

    - **CSS2.0中文手册**和**CSS3.0参考手册**:这两本书籍详细阐述了CSS语言的核心概念,从选择器、盒模型到布局、动画,是网页样式设计的必备指南。 - **HTML4 参考手册**和**HTML5**:HTML4手册涵盖了基本的标记语言...

Global site tag (gtag.js) - Google Analytics