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

[分享]Kohana入门体验教程

[复制链接]
发表于 2007-12-26 09:48:35 | 显示全部楼层 |阅读模式
说明:
1、文中出现一个英文字符串后面加了一个斜杠“/”的话表示它是一个文件夹。
2、如果一个英文字符串前面出现了“/”表示在网页空间的根目录下,一般文件加我就不在前面加“/”了,除非是2层以上的目录。
3、把 Kohana 的解压包放到适当的位置,我是直接放在网页空间的根目录,如果放在其他位置需要相应的修改 url,需要先让 apache 找到 kohana 的 index.php 文件。


Kohana 分两个文件夹,system/ 和 application/ ,以及一个 /index.php 文件。其中 system/ 和 /index.php 最好不要改动。
以下步骤如未特殊注明,均发生在 application/ 中。


1、在流览器中输入 localhost/index.php 可以看到默认的调试用首页(这个首页并不是指 Kohana 中的 index.php ,只是视觉效果上的首页)。
显示的文字提示了控制输出给用户首页内容的 controller 位置: application/controllers/welcome.php 。

2、在 Kohana 给出的文件 /application/controllers/welcome.php 中的 class 里面添加新的函数,函数名是即将访问的页面的名称。比如默认函数index()即相当于缺省的index.php。还可以添加其他的函数,比如添加一个函数hello():

PHP复制代码
<?php
function hello() {
  echo "看到了吧,我的作用就是控制 'hello' 页面需要的数据与输出外观模板的整合。<br>输出的格式就不要在我这里设置了,最好在 /application/view 下建立专门的 XXX_view.php 文件来设置。(只要你辨别的出来,随便用什么名字也可以,一般是 controller 文件中的相应函数的名字加一个后缀 _view ,方便找模板。CI下面不知道是不是这样随意,我不肯定,呵呵。)<br>你所看到的文字即内容,而你看到的换行就是外观啦。一般情况下内容和外观都不会出现在我这里,内容应该放在数据库或者其他文件中。<br>嗯,所以虽然我现在很丑,但我还是完成了数据与外观的整合,而且是很不合乎mvc规范的把数据和外观都在我所在的文件里,呵呵。";
}
?>
复制代码


在流览器中输入 localhost/index.php/welcome/hello ,可以看到上面 echo 的内容。
url 中的 index.php 也可以除去,不过需要apache的rewrite支持。

3、修改默认主页指向为新的文件 aaa.php 。
将 /system/config/routes.php 拷贝到 /application/config/ 中。在新的 routes.php 的 _default 的值改为 aaa 。
这里的修改相当于在 apache 服务器下把一个文件的名字设置成 index.html 或者 index.php ,在进入该文件夹而未指定具体文件时再如择该文件。另外一个 Controllers 常用的函数式  _default() ,作用是在调用错误的函数(在这里具体是指函数方法)时调用的函数,一般在函数里指向 404 错误页面。
另外大家也看出来了如果 application/ 中的文件与 sysytem/ 中的文件同名,则前者具有更高的优先权。
/application/config/routes.php中设置的 _default 是以 /index.php设置的应用程序文件夹和系统文件夹[可以在 /index.php 中自主设置,不一定就是 application 和 system ]为根目录的,相对应用程序文件夹和系统文件夹路径相同的同名文件加以应用程序文件夹中的文件为优先选择对象。

4、命名 aaa.php 的 class 名字时要和文件名字相同并将首写字母写为大写,即 Aaa 。否则无法完成函数的调用。

PHP复制代码
  <?php
  //这里的后缀 _Controller 是必须加的,感谢版主及时指正。
  class Aaa_Controller extends Controller {            
    function index() {
          echo "我是新的主页,哦也~";
        }
        function page1() {
          echo "你找到我了?知道怎么察看我吧,哈哈!<br>下一步我们要使用view来添加外观了。<br>虽然数据还得放在我所在的文件里,但是我将向mvc模式迈出了极其重要的一步——把外观从我所在的文件中给分离出去!";
        }
  }
  ?>
复制代码


通过 localhost/index.php/aaa/page1 可以访问页面 page1 。试一下哦~
class aaa 和 function page() 、funciton index() 的关系就像是文件夹与其中文件的关系。

5、嵌套模板,在 /applincation/view 中建立一个文件 page_view.php。
首先,写一个静态的html文件,page_view.php 。别问我为什么我的后缀是.php,我的内容可全都是静态html!开玩笑了,其实是 Kohana 只识别.php结尾的文件,如果要添加其他的 view 文件得对 Kohana 进行配置。

HTML复制代码
<html>
<head>
</head>
<body>
  <h1>标题一号</h1>
  <hr><hr>
  <p>内容一号。。当然我可以在多写一些内容,但是我太懒了,,就不写了- -~</p>
</body>
</html>
复制代码


可以先打开流览器直接看一下上面那个文件的url地址,方便和后面对比。

将里面可能出现动态内容的地方换成php输出,强调一下,只是php输出,目的是将model获取、处理过的数据显示出来。

HTML复制代码
<html>
<head>
</head>
<body>
  <h1><?=$title?></h1>
  <hr><hr>
  <p><?=$contont?></p>
</body>
</html>
复制代码


很奇怪 $title 和 $content 是怎么来的吧。嗯,因为我还没修改 controller 文件(即/application/controllers/aaa.php)并添加相关变量,所以你的奇怪可以理解,嘿嘿~
好了,下面修改一下 /application/controllers/aaa.php ,添加函数page2()进去。

PHP复制代码
  <?php
  class Aaa_Controller extends Controller {
    function index() {
          echo "我是新的主页,哦也~";
        }
        function page1() {
          echo "你找到我了?知道怎么察看我吧,哈哈!<br>下一步我们要使用view来添加外观了。<br>虽然数据还得放在我所在的文件里,但是我将向mvc模式迈出了极其重要的一步——把外观从我所在的文件中给分离出去!";
        }
        //page2(),,I'm here!
        function page2() {
          $view = $this->load->view('page_view');   //1、先不解释 $this->load->view 的来历,反正你得习惯这种文件(或者函数的)调用方式,以后经常要用到;2、page_view 就是函数 page() 对应的模板文件的 view 文件名,也就是模板文件名了。
          $view->title = "标题2号";
          $view->c;
          $view->render(TRUE);
        }
        //End of page2()
  }
 
  ?>
复制代码


现在有三个页面了,自己换着看一下。

利用 $view 的属性来传递参数虽然简单明了,但总觉得有点说不出来的别扭,数据就是数据,最好不要和 $view 控制器扯在一起。
ok,那我们就换一种方式。在 /application/controllers/aaa.php 中添加如下内容。[这一段是从CI教程里截取的,不过看另外一个帖子[http://codeigniter.org.cn/forums/thread-99-1-1.html 的四楼]说kohana控制器(controler)往视图(view)传递参数有新增的方式 $this->layout->var1 = '';$this->layout->view('Welcome'); ,不过我还没用过(我也是新鸟。。)]

PHP复制代码
<?php
        function page3() {
          $data['title'] = "标题3号";
          $data['content'] = "内容3号。看到了吧,我是用 \$data 数组来传递数据的!<br>如你所见,我在\$this->load->view()添加了参数\$data";
          $view = $this->load->view('page_view', $data);        
 
          $view->render(TRUE);
        }
  }
?>
复制代码


6、在模板中使用php循环,在 page_view.php 中添加如下代码:

PHP复制代码
<?php foreach($names as $name ) : ?>
  <li><?=$name?></li>
<?php endforeach ?>
 
//也可以用下面这个方式,只是个人爱好而以,呵呵。
<?php foreache($names as $name ) { ?>
  <li><?=$name?></li>
<?php } ?>
复制代码


在 /application/controllers/aaa.php 中添加一段测试数组。

PHP复制代码
<?php
  $names = array('Adam', 'Bruce', 'Danna');
?>
复制代码


好了,通过 localhost/index.php/aaa/page3 访问一下。是不是和静态页面中添加三个li一样?呵呵~

PS:其实这个教程是来自Kohana官方网站的,但是那位演示的兄弟开始的时候劈头就来一句“我对我的英语不好表示歉意,因为我是苏格兰人”,让人感到莫名的崩溃!演示过程中出了几个小错误,虽然是自己修复的,但也着实让人郁闷,一边看一边实践的时候我就跟丢了几次,与那位老兄无关,我下次看资料的时候一定要专心。他讲的内容大概就是这些,更多的入门内容可以看CodeIgniter 讨论中我发的另外两个来自CodeIngiter官方的视频教程,在CI的blog教程中讲得多一些,而且讲得很流畅。CI和Kohana很相似,看那个也是很有帮助的。

贴上原版教程的地址吧,QQEmail中转站,有效期还是只有7天:
Part1:
http://exs.mail.qq.com/cgi-bin/d ... 2208df48843f7959f7e
(提取码:05ba7d32)
Part2:
http://exs.mail.qq.com/cgi-bin/d ... b4e5444d96359e9ddf0
(提取码:964eacf1)

[ 本帖最后由 cchaha 于 2008-12-31 18:27 编辑 ]

评分

参与人数 1威望 +5 收起 理由
Hex + 5 精品文章

查看全部评分

发表于 2007-12-26 10:07:15 | 显示全部楼层
写的非常全面,看出来作者是下了功夫了,希望大家多多支持他!
发表于 2007-12-26 20:25:51 | 显示全部楼层
翻译这么多挺辛苦的,cchaha

官方文档中明确指出,所有用户自定义的controller类名字都应该加_controller后缀的,故教程中应为
class Aaa_Controller extends Controller {},文档名字不要后缀,即aaa.php即可。同样自定义Model也要加_Model后缀。

官方文档连接我就不找出来了,自己去查吧
发表于 2007-12-26 22:30:12 | 显示全部楼层
楼主的文章绝对是精品文章。给初学Kohana的朋友以极大的帮助!
 楼主| 发表于 2007-12-27 09:57:20 | 显示全部楼层

回复 3楼 的帖子

啊,果然如版主所说,
头晕了,刚回头看了一下我自己测试用的文件里面也加了后缀的,真是不好意思。
官方文档上我也看到了,呵呵。
发表于 2008-5-15 16:48:25 | 显示全部楼层
感谢楼主的分享~
过程中只遇到一个问题:
PHP复制代码
<?php foreach($names => $name ) : ?>
  <li><?=$name?></li>
<?php endforeach ?>
 
//也可以用下面这个方式,只是个人爱好而以,呵呵。
<?php foreache($names => $name ) { ?>
  <li><?=$name?></li>
<?php } ?>
复制代码

以上部分执行后会报错:Parse error: parse error, unexpected T_DOUBLE_ARROW in F:\APM\htdocs\kohana\application\views\hello.php on line 12
正好就是foreache($names => $name )的部分.
我把这里改为foreache($names as $name)后问题消失,请教一下是什么问题呢?小弟初学,见笑了。
 楼主| 发表于 2008-12-31 18:31:49 | 显示全部楼层

回复 6楼 的帖子

You are right, it's my fault.
I fixed it.

Long long ago ,i was such a fool

本版积分规则