您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

CakePHP 中文教程3

2024/6/15 17:17:02发布31次查看
第五章 scaffolding (脚手架?)
scaffolding是一个很棒的途径,使得早期开发的部分web应用能够运行起来。早期的数据库模式是不稳定的,很容易变化。scaffolding有个下降趋势:web程序员憎恨创建以后可能根本用不到的forms。为了减少程序员的这种重复劳动, cake中包含了scaffolding。scaffolding分析数据库,创建一些标准的使用add、delete、和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文件中设置么?使用这个变量可以交换他们
class categoriescontroller extends appcontroller
{
    var $scaffold;
}
有关scaffold,要注意一个重要的问题: scaffold期望每个以_id结尾的filed name是一个外键并且指向一个table,table的名称和_id前方的一样(只不过是小写的)。所以,举个例子来说,如果你嵌套了分类,你最好有个列叫做parent_id。在这个版本中,最好能够命名为parentid.同样,在表中有一个外键(比如,titles table有个category_id),并且你已经合适的联结到models(查看6.2理解联结),在show/edit/newd的views中,选择的表将会和外键的表(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 logic和presentation分隔开,独立application logic(it separates domain logic from the presentation, isolating application logic.)
一个model概要的说就是一个指向数据库的access,更具体,就是数据库中的特定的table。默认的,每个model都使用自身名字复数形式的table,比如,user mode使用 users
table。models可以维护数据特定的规则,联结信息以及它使用的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
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)
○返回特定的fields,fields由$limit(默认是50)个记录,匹配$conditions(如果有),从第$page(默认1)页开始列表,$conditions内容应该像sql语句中的一样,比如:$conditions=”race = ‘wookie’ and thermal_detonators>3”
○当$recursive选项设置成1到3的整数,findall()将会试图返回在联结到该model中发现的所有项的models.这项递归寻找可以深入3层。
●find($conditions, $fields, $order, $recursive)
○返回匹配$conditions的第一条记录的制定的fields(如果没有指定则返回全部)
○$recursive作用同上
●findallby($value) and findby($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)
○根据models的lists,得到一系列key的值,特别是根据model list创建list。$conditions, $order, $limit参数使用方法和上面相同。$keypath和$valuepath是你告诉model那里去找keys和values来成list。举个例子,基于role model,你想生成一个由ids(类型integer)当作key,由roles当作value的list,这个方法调用形式如下:
$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调用可以使用model的findbysql()方法。举例,在blog应用中,我想存储一个发贴者的first name到一个table中,但是这个table并不是我的cake schema中的一部分。我就可以通过这个model中的一个特定的方法
例6.2 custom sql calls with findbysql()
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’],因此,通过web的form表单保存数据非常简单。一个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();
}
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product