用户
 找回密码
 入住 CI 中国社区
搜索
查看: 3142|回复: 9
收起左侧

[讨论/交流] 直播CI程序生成过程,请各位前辈指教

[复制链接]
发表于 2013-9-25 05:54:53 | 显示全部楼层 |阅读模式
本帖最后由 1909264228 于 2013-9-25 22:15 编辑

高手指导的学习流程,受益匪浅

codeigniter的程序流程
1.      设计视图
首先,让我们设计视图并把它保存到如下路径:system/application/views/testview.php


  • <html>  
  • <head>  
  •   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  •   <html xmlns="http:////www.w3.org/1999/xhtml">  
  •   <title>Web test Site</title>   
  • </head>  
  • <body>  
  •   <h1><?php echo $mytitle; ?> </h1>  
  •   <p class="test"> <?php echo $mytext; ?> </p>  
  • </body>  
  • </html>  

  代码片段1 视图demo
      
        你还可以联想到,变量$mytitle和$mytext的内容呢?答案是我们需要一个新的控制器!
2.       设计控制器
现在,我们需要一个新的控制器。我们将其命名为Start并保存在:/system/application/controllers/start.php
该控制器必须做几件事:
·         调用视图
·         把一些数据传递给视图:它正在期待标题($mytitle)和一些本文($mytext)
·         最后,我们想要控制器接受来自使用者的一个参数(例如通过URL请求)



    <?phpclass Start extends CI_Controller {        function __construct()        {                     parent::__construct();
  •         }

代码片段2 控制器构造函数
       在上面的代码中可以看出Start是一个构造函数,他完成了控制器的初始化。
      下面是将参数传递个一个函数的代码:



  • function hello($name)  
  • {  
  •     $data['mytitle'] = 'Welcome to this site';  
  •     $data['mytext'] = "Hello, $name, now we're getting dynamic!";  
  •     $this->load->view('testview', $data);  
  • }  
  • ?>  

代码片段3 控制器url映射函数
    这个函数期待一个参数,$name,可能会产生疑问$name变量从哪来?其实它需要来自URL请求的第三个参数,话句话说换句话说,当你输入URL:
http://www.mysite.com/index.php/start/hello/fred
URL的最后一段作为一个参数传给函数hello,倒数第二个参数是指当前的函数名是hello,倒数第三个函数是指当前的控制器名字是start。当然我们还会看到index.php这个参数,这是由于CI将所有的请求都发送到了index.php文件中,你也可以用.htaccess文件重写URL来去掉index.php,考虑到服务器可能不支持.htaccess,我们没有做出修改。
    再回到对控制器的讨论中,注意hello()函数如何先设置一个名为$data的数组,并把一些对象的属性及文本读入数组。然后它通过名称装载视图,并把刚生成的$data数组作为第二个参数。在幕后,CI很好地利用了另外一个PHP函数:extract(),这个函数的作用是把数组中的元素取出放入变量表,其中每个键值对中的键名即为变量名,对应该键名的值为变量的值。因此我们刚才定义的$data数组在视图中转换成一个单一的变量:$text(等于“Hello, $name, now we're getting dynamic”)。
    换句话说,当它被建立的时候,$data数组看起来像这样:
    Array
(
  [mytitle] => 'Welcome to this site',
  [mytext] => "Hello, fred, now we're getting dynamic!"
);
    但是当它被传递给视图的过程中,它被解开,并且下列变量在视图对象中生成,与$data的每个键/值相对应:     
    $mytitle   =   'Welcome to this site';
     $mytext    =   "Hello, fred, now we're getting dynamic!";
    虽然你只传送一个变量到视图中,但是,你能把许多数据装进那个变量中。$data数组的每个值还可以是数组,这被称为多维数组,因此,用一个数组变量可以把大量的变量传递给视图。
    3.设计模型
       其实模型的设计要在控制器之前完成的,但是为了演示控制器和视图之间的数据流动,我们把控制器和视图放到一起说了。
       所以说上面介绍的只是VC,因为还没介绍到M,也就是模型。下面构造一个MVC的完整流程。
       在第二部分介绍控制器时给数组$data的元素赋值时,我们用到的都是常量,其实在实际的编码情况中,我们的数据都是从数据库中读出的,这份工作就是下面要说到的控制器的职责。先看下面一部分代码:     


  • <?php  
  •      class Art extends CI_Model {  
  •             public function __construct() {  
  •                    parent::__construct();  
  •                    //$this->load->library('database');//在autoload.php中配置了自动加载database类  
  •             }  
  •             public function getList($name) {  
  •                    $this->db->select('title,content');
  •    if (!is_null($name)) {
  •                     $this->db->where('author', $name);  
  •    }
  •                    $result=$this->db->get('art');  
  •                    return $result->num_rows()>0 ? $result->result_array() : null;  
  •             }  
  •   
  •   
  •      }  
  • ?>  

代码片段4 模型demo


      首先我们看到这也是一个类,继承自父类Model,首先由__construct函数完成该类的初始化。并加载了CI的数据库类(也就是我们前面所有的AR)。然后我们看类中的getOne函数,这是要介绍的重点。

      $this->db->select(‘title,content’);

      $this->db->where(‘author’,$name);

      $result=$this->db->get(‘art’);

这三句话放到普通的php中应该是这么写的:

$sql=”select title,content from art where author =’“.$name.”’”;

$result=mysql_query($sql);  


可以看出用了AR后数据库的处理变得简洁明了,并且更重要的是CI的AR生成隐含的代码,在幕后进行转意和类型转化,使代码更加健壮。

      我们在模型中将数据进行处理(查询、修改、删除等),然后将处理结果交给控制器处理。控制器在这里起到了路由的作用,它会将处理的结果交给不同的视图去处理。

在控制器中我们这么取出数据:

      



  • <?php  
  • class Artmanager extends CI_Controller {  
  •     function __construct() {  
  •         parent::__construct();  
  •         $this->load->model('art');  
  •     }  
  •   
  •     function index($authName) {
  • //$this->load->library('unit_test');
  •         $list = $this->art->getList($authName);  
  •         $data['list'] = $list;  
  •         $this->load->view('art_list',$data);
  • //$this->output->enable_profiler(TRUE);
  •     }  
  • }  

代码片段5 控制器中使用模型


        注意以下两句是整段代码的重点,这两句扼要的指出了在控制器中怎样使用模型。

      


  • $this->load->model('art');               
  • $list = $this->art->getList($authName);  



  • 最后一句使用来加载视图的:      



  •    $this->load->view('art_list',$data);     




  • 使用这一句将$data数组中的数据传递到art_list.php(文件存放位置稍后给出)这个文件中。现在看一下art_list.php文件到底怎样操作来展现这个视图的内容:  



  • <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  • <html xmlns="http://www.w3.org/1999/xhtml">  
  • <head>  
  •     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
  •     <title>文章列表</title>  
  •     <base href="<?php echo base_url();?>" />
  •     <meta name="keywords" content="" />  
  •     <meta name="description" content="" />  
  •     <link href="css/index.css" rel="stylesheet" type="text/css" />
  • </head>  
  •   
  • <body>  
  •     <table class="list">  
  •         <tr>  
  •             <th></th><th>标题</th><th>内容</th>  
  •         </tr>  
  •   
  •     <?php  
  •         if (is_null($list)) {  
  •     ?>  
  •         <tr><td colspan="3">没有数据</td></tr>  
  •     <?php  
  •         } else {  
  •             foreach ($list as $index=>$article) {  
  •     ?>  
  •                 <tr>  
  •                     <td><?php echo $index+1;?></td>  
  •                     <td><?php echo $article['title']?></td>  
  •                     <td><?php echo $article['content']?></td>  
  •                 </tr>  
  •     <?php  
  •             }  
  •         }  
  •     ?>  
  •   
  •     </table>  
  • </body>  
  • </html>  


代码片段6 视图中解析控制器中的参数
    注意代码片段6中的:  



  • foreach ($list as $index=>$article)  

        这一句,如果你没有记错的话,从控制器里传递过来的参数$data是一个数组,但是这里面的变量$list看上去像是没有定义过的。恭喜你,猜的没错了,CI内部就是调用了extract这个函数将$data数组中的元素拆分到以键名为变量名的变量中去了,所以你在这里可以直接使用$list这个变量。

       最后看一下成果,在浏览器里直接输入http://localhost/ci/index.php/artmanager/index/admin 这个地址,会显示查询的表格数据:

      

4.备注

为了让上述代码能够正确的运行起来,还需要做一些响应的配置。首先,在application/config/database.php中配置数据库连接:


Php代码  




  • $db['default']['hostname'] = 'localhost';  
  • $db['default']['username'] = 'root';  
  • $db['default']['password'] = '';  
  • $db['default']['database'] = 'mycms';  

然后在application/config/autoload.php中定义自动加载的类库,修改一下里面的相应代码就可以了:


Php代码  




  • /*
  • | -------------------------------------------------------------------
  • |  Auto-load Libraries
  • | -------------------------------------------------------------------
  • | These are the classes located in the system/libraries folder
  • | or in your application/libraries folder.
  • |
  • | Prototype:
  • |
  • |   $autoload['libraries'] = array('database', 'session', 'xmlrpc');
  • */  
  •   
  • $autoload['libraries'] = array('database', 'session');  
  •   
  •   
  • /*
  • | -------------------------------------------------------------------
  • |  Auto-load Helper Files
  • | -------------------------------------------------------------------
  • | Prototype:
  • |
  • |   $autoload['helper'] = array('url', 'file');
  • */  
  •   
  • $autoload['helper'] = array('url');  

  虽然这篇教程中没有用到session,但是按照我的惯例,我还是把他配置上了。如果你在运行的时候,出现了如下提示:


An Error Was Encountered
In order to use the Session class you are required to set an encryption key in your config file.
那么修改一下application/config/autoload.php中的encryption_key元素即可,随便输入几个字符:

Php代码  




  • /*
  • |--------------------------------------------------------------------------
  • | Encryption Key
  • |--------------------------------------------------------------------------
  • |
  • | If you use the Encryption class or the Session class you
  • | MUST set an encryption key.  See the user guide for info.
  • |
  • */  
  • $config['encryption_key'] = 'FSJFEO@¥#%)#(¥02334';  


出处:http://yunnysunny.iteye.com/blog/1430234
代码下载: http://yunnysunny.iteye.com/blog/1430234






 楼主| 发表于 2013-9-25 22:22:55 | 显示全部楼层
学习CI是个快乐的过程
发表于 2013-9-25 13:02:38 | 显示全部楼层
不要想什么狗屁逻辑,你按人的思维想就对了。
发表于 2013-9-25 11:07:52 | 显示全部楼层
顶个肥,不明白什么意思
发表于 2013-9-25 10:59:24 | 显示全部楼层
1909264228 发表于 2013-9-25 08:45
目标:给www.nx28.com 右边增加新分类信息,不同的大分类,不同的小分类

{:soso_e113:}
 楼主| 发表于 2013-9-25 10:58:39 | 显示全部楼层
记住这个顺序   
1)首先在model层获取一个表的数据。
2)然后在controller层中处理数据,并将数据给view层
3)最后views层显示数据
发表于 2013-9-25 10:33:59 | 显示全部楼层
不能写中文?狗屁的谷歌真是坑啊!只能用ie
 楼主| 发表于 2013-9-25 08:45:01 | 显示全部楼层
kinwyb 发表于 2013-9-25 08:18
虽然不明白lz在说什么,但是还是要顶一下

目标:给www.nx28.com 右边增加新分类信息,不同的大分类,不同的小分类
发表于 2013-9-25 08:18:59 | 显示全部楼层
虽然不明白lz在说什么,但是还是要顶一下

本版积分规则