CakePHP manual 中文翻译

互联网 2006年12月14日 13:36 查看48938次 作者: helloliuchen  【
文章分类:PHP5研究[新]

第五章 Scaffolding (脚手架?)

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

 

class CategoriesController extends AppController
{
    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有个标题
class Title extends AppModel 
{
    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
class Post extends AppModel
{
   function hide ($id
=null)
   {
      if ($id) $this->setId($id)
;
      $this->set('hidden', '1');
      $this->save();
   }
 
   function unhide ($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>3”

○当$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('My First Blog Post');
$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)

    ○根据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_name ASC', null, 'id', 'role_name')
)
;

//This would return something like:
array(
    '
1=> 'Account Manager',
    '
2=> 'Account Viewer',
    '
3=> 'System Manager',
    '
4=> 'Site Visitor'
)
;

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
class Post extends AppModel
{
        function posterFirstName()
        {
          $ret 
= $this->findBySql("SELECT first_name FROM posters_table 
                                   WHERE poster_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的编辑方法可能会像下面这样显示:


function edit($id) 
{
   //Note: The property model is automatically loaded for us at $this->property.     
   // Check to see if we have form data 
   if (isset($this->params
['form']['data']['property'])) 
   {  
      // Here's where we try to save our data
      if ($this->property->save($this->params
['data'])) 
      {
         //Show the user that her data has been saved
         $this->flash('Your information has been saved.'
,            
 '/properties/edit/'.$this->params
['data']['property']['id'], 2);
         exit();
      }
      else
      {
         //If the data couldn't be validated
, show the validation errors
         //and repopulate form fields with submitted data
         $this->set('form'
, $this->params['data']);
         $this->validateErrors($this->property);
         $this->render();
      }      
   }   
   //If no form data was submitted
, just render the edit view
   $this->render()
;
}

责任编辑:抽烟的蚊子

给文章打分...

平均分:0.3(75 次)

-5 -4 -3 -2 -1 0 1 2 3 4 5
12

顶一下

发表我的见解...

  • 您的大名: 留空为匿名
  • 您的主页:
  • 您的邮箱: