YiiFramework入门知识点总结(图文教程)
本文将为您深入浅出地介绍YiiFramework的入门知识点。如果您对YiiFramework充满好奇,那么本文将是您绝佳的参考资料。
我们来如何创建Yii应用骨架。在web作为网站根目录的前提下,通过运行命令“yiic webapp /web/demo”,即可轻松搭建Yii应用的基础架构。在此过程中,您会发现创建应用的步骤相当直观和简单。
接下来,我们将重点关注在使用GII创建model和CURD时需要注意的事项。在Model Generator操作中,即使您的表有前缀,也请在Table Name中填写表的全名,包括表前缀。而在Crud Generator操作中,您需要在Model Class中填写正确的model名称,首字母大写。如果您要为news、newstype、statustype这三个表生成CURD控制器,那么在Model Generator中,务必确保Model Class中输入的名称与文件名大小写一致。
在创建模块时,也需要注意一些细节。通过GII创建模块时,Module ID一般使用小写。这个ID将决定main.php配置文件中的配置。您需要确保在配置文件中,Module ID与创建模块时填写的大小写一致。对于指向的文件或目录路径,建议在Windows OS中,尽量保持与实际目录一致,以确保系统的正常运行。
我们来谈谈路由问题。在YiiFramework中,路由的指向非常重要。您需要明确知道system表示的是Yii框架的framework目录,而application则代表您创建的应用的protected目录。当您需要引用某个具体的文件或类时,如application.modules.Admin.AdminModule,这实际上是指向应用程序目录下modules目录中Admin目录下的AdminModules.php文件。同样,system.db表示的是YII框架下的framework目录下的db目录。
aessRules说明在控制器中
该控制器中的aessRules方法定义了访问控制规则,这些规则被"aessControl"过滤器所使用。它返回一个包含多个规则元素的数组,这些规则元素明确了不同用户对于不同操作的访问权限。
第一个规则允许所有用户执行'index'和'view'操作。这意味着无论用户身份如何,他们都可以访问index和view方法。这是通过定义一个允许规则并将操作设置为'index'和'view',同时将用户列表设置为空数组来实现的,表示对所有用户开放。
接下来,第二个规则允许经过身份验证的用户执行'create'和'update'操作。这意味着只有登录的用户才能创建和更新内容。规则同样定义了允许的操作('create'和'update'),并将用户列表设置为'@',表示只有经过身份验证的用户才能执行这些操作。
第三个规则进一步细分权限,只允许管理员用户执行'admin'和'delete'操作。这对于需要高级权限的管理任务非常有用。规则中的操作被设置为'admin'和'delete',同时用户列表指定为管理员用户,表示只有管理员能够执行这些操作。
第四个规则是一个拒绝所有用户的规则。这是一个基本的防护措施,确保某些区域或功能不被未经授权的用户访问。通过定义一个拒绝规则并将用户列表设置为空数组来实现这一点。
在任何地方,您都可以通过强大的Yii框架中的 `Yii::app()->user` 来访问用户状态。这在您的代码中也得到了很好的体现。让我们来看一下具体的代码段。
```php
public function beforeSave() {
if(parent::beforeSave()) { // 如果父类的beforeSave方法执行成功
if($this->isNewRecord) { // 如果是新记录
$this->password = md5($this->password); // 密码进行MD5加密处理
// 获取当前登录用户的ID,并设置到创建用户ID字段上
$this->create_user_id = Yii::app()->user->id;
$this->create_time = date('Y-m-d H:i:s'); // 设置创建时间为当前时间
} else { // 如果不是新记录,是更新操作
$this->update_user_id = Yii::app()->user->id; // 更新操作的用户ID为当前登录用户ID
$this->update_time = date('Y-m-d H:i:s'); // 更新时间为当前时间
}
return true; // 返回true表示保存操作可以执行
} else {
return false; // 返回false表示保存操作无法执行
}
}
```
接下来是关于 `UserIdentity` 类的部分,这个类主要负责用户的身份验证:
```php
// UserIdentity 类是用来标识用户的数据模型,它包含用于验证身份的方法。
class UserIdentity extends CUserIdentity {
// 这个方法用于验证用户身份。示例实现是检查用户名和密码是否都是 'demo'。在实际应用中,应该修改为从数据库或其他持久性存储中验证用户身份。
public function authenticate() {
$username = strtolower($this->username); // 将用户名转为小写形式进行验证
$user = User::model()->find("LOWER(username)=?", array($username)); // 从数据库中查找用户信息
if ($user === null) { // 如果找不到用户信息,设置错误代码为无效的用户名错误。
$this->errorCode = self::ERROR_USERNAME_INVALID;
} else {
// 这里原先的代码有误,应该是 $user->validatePassword($this->password),而不是 User::model()->validatePassword($this->password)。修改后验证用户密码是否正确。如果密码不正确,设置错误代码为无效的密码错误;否则设置用户ID和用户名并返回无错误状态。
if (!$user->validatePassword($this->password)) {
$this->errorCode = self::ERROR_PASSWORD_INVALID;
} else {
$this->_id = $user->id;
$this->username = $user->username;
$this->errorCode = self::ERROR_NONE;
}
}
return $this->errorCode === self::ERROR_NONE; // 返回是否验证成功的结果
}
// getId方法用于获取用户的ID
public function getId() {
return $this->_id;
}
}
```
当登陆账号的ID得以确认时,程序开始了它的生命周期中的某个环节。它记录下这一刻的时间戳,精确到秒。如果这是一个新创建的账号,`create_time`字段会被赋予当前的时间标记;如果是一个已有账号的更新操作,那么`update_user_id`会被设置为当前用户的ID,同时记录下更新的时间。这一切完成后,返回成功信号。但如果在处理过程中出现任何不符合预期的情况,程序会默默返回失败的结果。这是背后的逻辑在默默运行,确保每一个操作都有迹可循。
在一个更大的框架内,比如基于Yii框架的某个组件中,我们看到了关于属性和事件的协议实现。每一个组件都有它自己的属性和方法。通过getter和setter方法,我们可以轻松获取或设置这些属性。例如,通过调用`getText()`方法,我们可以获取组件的文本属性;通过调用`setText('abc')`方法,我们可以设置组件的文本属性为'abc'。这种设计使得代码更加简洁明了。在此基础上,我们进一步添加了getUrl方法,用于生成组件的URL链接。这个方法利用Yii框架提供的工具,根据组件的id和title属性生成一个可访问的URL。
在模型的rules方法中,我们定义了属性的验证规则。这些规则在模型实例调用validate或save方法时执行。重要的是,我们只验证用户输入的属性。那些通过代码或数据库设定的属性,如id、作者id等,不需要进行验证。这些规则确保了数据的完整性和准确性。例如,新闻标题的长度被限制在128个字符以内,新闻内容的长度被限制在8000个字符以内。其他一些字段如创建时间、更新时间等被视为安全字段,它们不需要验证。这些字段通常由系统自动生成并维护。
这些代码段是程序运行的关键部分,它们确保了系统的正常运行和数据的安全。每一个细节都经过了精心设计和考虑,以确保用户能够在一个安全、可靠的环境中与系统进行交互。
关于非表单提供数据的验证与处理
在Yii框架的News.php模型中,我们有一个名为rules()的方法。这个方法为我们提供了模型属性的验证规则。让我们深入了解下这个方法是如何工作的。
你需要明确一点:你只需为那些将接收用户输入的属性定义规则。对于没有在rules()方法中验证的数据,尤其是没有在表单中提供的数据,一定要加入到safe中,否则将无法成功写入数据库。这是一个重要的注意事项,确保我们数据的完整性和安全性。
下面是rules()方法的代码示例:
```php
public function rules()
{
return array(
array('news_title, news_content', 'required'), // 标题和内容为必填项
array('news_title', 'length', 'max' => 128, 'encoding' => 'utf-8'), // 标题最大长度为128个字符,编码为utf-8
array('news_content', 'length', 'max' => 8000, 'encoding' => 'utf-8'), // 内容最大长度为8000个字符,编码为utf-8
array('author_name', 'length', 'max' => 10, 'encoding' => 'utf-8'), // 作者名最大长度为10个字符,编码为utf-8
array('status_id, type_id', 'safe'), // status_id和type_id属性安全,无需验证
// 下面的规则用于搜索。请移除那些不应被搜索的属性。
array('id, news_title, news_content, author_name, type_id, status_id', 'safe', 'on' => 'search'),
);
}
```
接下来,让我们在视图中如何显示动态内容。这是一个非常重要的部分,因为它能帮助我们实现数据的实时更新和展示。以下是三种常见的方法:
1. 直接在视图文件中使用PHP代码实现。例如,要显示当前时间,你可以这样写:``。
2. 在控制器中实现内容的显示,然后通过render()方法的第二个参数将内容传递给视图。例如:
```php
$theTime = date("Y-m-d H:i:s");
$this->render('helloWorld', array('time' => $theTime));
```
在视图文件中,你可以这样使用传递过来的时间:``。这里,render()方法的第二个参数是一个数组,其中的键是提供给视图脚本的变量名,值则是相应的数据。
3. 视图和控制器是紧密关联的。你可以在控制器中定义一个类的公共属性,而不是局部变量,然后在视图中通过$this访问这个类的属性。例如,你可以在控制器中设置一个公共属性来存储当前日期和时间,然后在视图中通过$this访问这个属性。
关于视图命名约定,一般建议视图文件的命名与ActionID相同。但请记住,这只是一个推荐的命名约定。实际上,你只需要将文件名字作为第一个参数传递给render()就可以了。
关于数据库操作,以下是两个示例:
```php
$Prerfp = Prerfp::model()->findAll(array('limit' => '5', 'order' => 'releasetime desc'));
$model = Finishrfp::model()->findAll(array('select' => 'panyname,title,releasetime', 'order' => 'releasetime desc', 'limit' => 10));
foreach($model as $val){
$noticeArr[] = "在".$val->title."竞标中,".$val->panyname."中标。";
}
```
让我们看看如何获取通知的特定信息。使用特定的查询参数,我们可以轻松地从数据库中提取数据。例如,要获取状态为待处理的通知内容,我们可以这样操作:
```php
$model = Cgnotice::model();
$model->findAll(array(
'select' => 'status, content, updatetime', // 选择需要的字段
'condition' => 'status = :status', // 设置查询条件
'params' => array(':status' => 0), // 传递参数值
'order' => 'updatetime desc', // 设置排序规则
'limit' => 10 // 限制返回结果数量
));
foreach($model as $val){
$noticeArr[] = $val->content; // 将内容添加到数组中
}
```
接下来,我们要查找特定用户名对应的用户信息。我们可以使用大小写不敏感的匹配方式来查找用户名:
```php
$user = User::model()->find('LOWER(username)=?', array($username)); // 使用小写用户名进行查找
```
我们还可以根据特定的字典类型来获取通知类型信息:
```php
$noticetype = Dictionary::model()->find(array(
'condition' => '`type` = "noticetype"' // 设置查询条件获取特定类型数据
));
```
对于更复杂的查询需求,我们可以使用CDbCriteria实例或数组来指定查询条件。这样,我们可以构建更复杂的查询逻辑,而不仅仅是简单的WHERE子句。例如:
```php
$criteria = new CDbCriteria; // 创建CDbCriteria实例
$criteria->select = 'title'; // 仅选择标题列
$criteria->condition = 'postID=:postID'; // 设置查询条件
$criteria->params = array(':postID' => 10); // 设置参数值
$post = Post::model()->find($criteria); // 执行查询
```
当我们使用CDbCriteria实例时,可以直接在实例中设置所有的查询参数,无需再通过数组传递参数值。这种方法更加直观和灵活。传递数组也是一种有效的替代方法。无论是哪种方式,最终都能帮助我们轻松地从数据库中检索所需的信息。在编程的世界里,数组是数据结构的基石,其键和值分别对应着标准(criterion)的属性名和值。让我们以一段PHP代码为例,深入数组的键和值如何映射到标准属性。
假设我们正在使用某种模型(例如名为“Post”的模型)来查询数据库中的特定条目。这个查询可能看起来像这样:
```php
$post = Post::model()->find(array(
'select' => 'title',
'condition' => 'postID=:postID',
'params' => array(':postID' => 10),
));
```
在这个例子中,数组的键如 'select', 'condition', 和 'params' 对应着查询数据库的标准(criterion)的属性名。而它们的值,如 'title', ':postID=>10' 等则是这些属性的具体值。通过这种方式,我们可以明确地告诉模型我们想要执行什么样的查询。
接下来,让我们看一些关于链接、组件、路径等方面的代码。
关于链接的创建,有两种方式可以实现。第一种使用CHtml的link()方法,第二种使用CController的createUrl()方法。两种方法都可以创建链接,但具体实现和用法有所不同,具体细节需要查阅相关的API文档。这两种方法的目的是生成一个指向特定页面的链接,可能包含一些动态参数,如ID等。
在视图中,有时会使用组件来封装一些特定的功能或展示内容。例如,在视图中底部有一段代码 `$this->widget ('Notice');`。这行代码调用了一个名为“Notice”的组件。打开相应的文件,我们发现它继承自CPortlet类,这是一个用于创建可重用组件的类。在组件内部,可以通过调用`renderContent()`方法来渲染特定的视图,如这里的`banner`视图。要了解更多关于CPortlet和其他相关类的信息,建议查阅API文档。
获取当前host的信息对于构建URL或处理网络请求非常重要。在Yii框架中,可以通过`Yii::app()->request->getServerName()`或`$_SERVER['HTTP_HOST']`来获取当前host的信息。然后,我们可以使用这个信息来构建指向特定操作的URL,例如激活电子邮件的URL。
关于在使用CKeditor扩展时遇到的问题,我们可以使用Yii的widget机制来轻松集成CKeditor到我们的应用中。在这个例子中,我们创建了一个CKkceditor的widget实例,并传递了一些参数,如模型、属性、高度、宽度、文件路径等。这些参数允许我们定制CKeditor的行为和外观。关于路径问题,需要注意的是路径的格式和拼写需要仔细核对,确保应用的正常运行。
以上内容是对原文的深入理解与重新表述,希望能够帮助你更好地理解和掌握这些概念。在Yii框架的PHP程序设计之旅中,我们经常需要处理一些基础设置和路径问题。当你执行命令 `echo Yii::app()->baseUrl;` 时,如果项目目录位于 `d:\root\blog` 目录下,你将得到 `/blog` 作为结果。这里需要注意的是,路径并不包含反斜杠,这是Yii框架在处理URL时的惯例。
在网站根目录结构中,有两个重要的概念需要区分:basePath 和 baseUrl。basePath 通常指的是项目的物理路径,即你的文件存放在服务器上的位置;而 baseUrl 则是你访问网站时所使用的。理解这两个概念对于基于Yii框架的PHP开发至关重要。
除了这些基础设置,还有一些关于控制器和模型的交互问题。在一个名为A的控制器对应的视图中,如果你想调用B模型中的方法,你可以使用 `B::model()->方法名()` 的方式来调用。这种结构体现了Yii框架的模型-视图-控制器(MVC)设计模式,有助于保持代码的清晰和模块化。
还有一些重要的API需要开发者熟悉和掌握。比如 `CHtml` API,它是Yii框架中用于处理HTML的实用工具集,可以帮助开发者更高效地生成和处理HTML代码。掌握这些API对于提高开发效率和代码质量非常有帮助。
我想强调的是,本文所述内容仅为一些基础知识和常见操作。在基于Yii框架的PHP程序设计过程中,还有许多复杂和深入的内容需要学习和。即使是一个初学者,掌握了这些基础知识后,也能开始构建自己的Yii应用程序了。`cambrian.render('body')` 这行代码可能是特定项目或框架中的特定用法,需要结合具体的开发环境和文档来理解其含义和作用。希望本文能对你在Yii框架下的PHP程序设计有所启发和帮助。
网络推广网站
- YiiFramework入门知识点总结(图文教程)
- 你敢面对未知的挑战吗
- 口袋弹弓和普通弹弓哪个威力大
- 百度地图离线包下载
- AngularJS2 与 D3.js集成实现自定义可视化的方法
- JSP页面中如何用select标签实现级联
- JScript中调用ActiveX获取访客网卡MAC地址实现代码
- laravel使用Faker数据填充的实现方法
- js canvas实现适用于移动端的百分比仪表盘dashboa
- javascript基于原型链的继承及call和apply函数用法分
- Node.js连接MongoDB数据库产生的问题
- 浅谈js中的三种继承方式及其优缺点
- jquery模拟进度条实现方法
- IE 浏览器安全级别详情及区别小结
- vue父子模版嵌套案例
- jQuery实现响应鼠标滚动的动感菜单效果