您的位置:首页 > 编程语言 > PHP开发

yii快速入门教程8

2013-03-12 15:03 253 查看
四、收集表格输入

有时我们想通过批量模式收集用户输入。也就是说,用户可以为多个模型实例输入信息并将它们一次性提交。我们将此称为 表格输入(tabular input) ,因为这些输入项通常以 HTML 表格的形式呈现。

要使用表格输入,我们首先需要创建或填充一个模型实例数组,取决于我们是想插入还是更新数据。然后我们从 $_POST 变量中提取用户输入的数据并将其赋值到每个模型。和单模型输入稍有不同的一点就是:我们要使用 $_POST['ModelClass'][$i] 提取输入的数据而不是使用 $_POST['ModelClass']。

public function actionBatchUpdate()

{

// 假设每一项(item)是一个 'Item' 类的实例,

// 提取要通过批量模式更新的项

$items=$this->getItemsToUpdate();

if(isset($_POST['Item']))

{

$valid=true;

foreach($items as $i=>$item)

{

if(isset($_POST['Item'][$i]))

$item->attributes=$_POST['Item'][$i];

$valid=$valid
&& $item->validate();

}

if($valid) // 如果所有项目有效

//
...则在此处做一些操作

}

// 显示视图收集表格输入

$this->render('batchUpdate',array('items'=>$items));

}

准备好了这个动作,我们需要继续 batchUpdate 视图的工作以在一个 HTML 表格中显示输入项。

<div class="form">

<?php echo CHtml::beginForm(); ?>

<table>

<tr><th>Name</th><th>Price</th><th>Count</th><th>Description</th></tr>

<?php foreach($items as $i=>$item): ?>

<tr>

<td><?php echo CHtml::activeTextField($item,"[$i]name"); ?></td>

<td><?php echo CHtml::activeTextField($item,"[$i]price"); ?></td>

<td><?php echo CHtml::activeTextField($item,"[$i]count"); ?></td>

<td><?php echo CHtml::activeTextArea($item,"[$i]description"); ?></td>

</tr>

<?php endforeach; ?>

</table>

<?php echo CHtml::submitButton('Save'); ?>

<?php echo CHtml::endForm(); ?>

</div><!-- form -->

注意,在上面的代码中我们使用了 "[$i]name" 而不是 "name" 作为调用 CHtml::activeTextField 时的第二个参数。

如果有任何验证错误,相应的输入项将会自动高亮显示,就像前面我们讲解的单模型输入一样。

Ⅲ、数据库操作

Yii提 供了强大的数据库编程支持。Yii数据访问对象(DAO)建立在PHP的数据对象(PDO)extension上,使得在一个单一的统一的接口可以访问不 同的数据库管理系统(DBMS)。使用Yii的DAO开发的应用程序可以很容易地切换使用不同的数据库管理系统,而不需要修改数据访问代码。Yii 的Active Record( AR ),实现了被广泛采用的对象关系映射(ORM)办法,进一步简化数据库编程。按照约定,一个类代表一个表,一个实例代表一行数据。Yii
AR消除了大部分用于处理CRUD(创建,读取,更新和删除)数据操作的sql语句的重复任务。

尽管Yii的DAO和AR能够处理几乎所有数据库相关的任务,您仍然可以在Yii application中使用自己的数据库。事实上,Yii框架精心设计使得可以与其他第三方库同时使用。

一、数据访问对象 (DAO)

Yii DAO 基于 PHP Data Objects (PDO) 构建。它是一个为众多流行的DBMS提供统一数据访问的扩展,这些 DBMS 包括 MySQL, PostgreSQL 等等。因此,要使用 Yii DAO,PDO 扩展和特定的 PDO 数据库驱动(例如 PDO_MYSQL) 必须安装。

Yii DAO 主要包含如下四个类:

CDbConnection: 代表一个数据库连接。

CDbCommand: 代表一条通过数据库执行的 SQL 语句。

CDbDataReader: 代表一个只向前移动的,来自一个查询结果集中的行的流。

CDbTransaction: 代表一个数据库事务。

1、建立数据库连接

要建立一个数据库连接,创建一个 CDbConnection 实例并将其激活。连接到数据库需要一个数据源的名字(DSN)以指定连接信息。用户名和密码也可能会用到。当连接到数据库 的过程中发生错误时 (例如,错误的 DSN 或无效的用户名/密码),将会抛出一个异常。

$connection=new CDbConnection($dsn,$username,$password);

// 建立连接。你可以使用 try...catch 捕获可能抛出的异常

$connection->active=true;

......

$connection->active=false; // 关闭连接

DSN 的格式取决于所使用的 PDO 数据库驱动。总体来说, DSN 要含有 PDO 驱动的名字,跟上一个冒号,再跟上驱动特定的连接语法。可查阅 PDO 文档 获取更多信息。下面是一个常用DSN格式的列表。

* SQLite: sqlite:/path/to/dbfile

* MySQL: mysql:host=localhost;dbname=testdb

* PostgreSQL: pgsql:host=localhost;port=5432;dbname=testdb

* SQL Server: mssql:host=localhost;dbname=testdb

* Oracle: oci:dbname=//localhost:1521/testdb

由于 CDbConnection 继承自 CApplicationComponent,我们也可以将其作为一个 应用组件 使用。要这样做的话,请在 应用配置 中配置一个 db (或其他名字)应用组件如下:

array(

......

'components'=>array(

......

'db'=>array(

'class'=>'CDbConnection',

'connectionString'=>'mysql:host=localhost;dbname=testdb',

'username'=>'root',

'password'=>'password',

'emulatePrepare'=>true, //
needed by some MySQL installations

),

),

)

然后我们就可以通过 Yii::app()->db 访问数据库连接了。它已经被自动激活了,除非我们特意配置了 CDbConnection::autoConnect 为 false。通过这种方式,这个单独的DB连接就可以在我们代码中的很多地方共享
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: